一、概述
1Redis3.0版本之后支持Cluster.
1.1、redis cluster的现状
  目前redis支持的cluster特性:
  1):节点自动发现
  2):slave->master 选举,集群容错
  3):Hot resharding:在线分片
  4):进群管理:cluster xxx
  5):基于配置(nodes-port.conf)的集群管理
  6):ASK 转向/MOVED 转向机制.
1.2、redis cluster 架构
  1)redis-cluster架构图

架构细节:
  (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
  (2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
  (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
2) redis-cluster选举:容错

(1)领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.
(2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误
  a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态.
  b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.
二、redis cluster安装

用三台虚拟机模拟6个节点,一台机器2个节点,创建出3 master、3 salve 环境。

redis 采用 redis-3.2.4 版本。
三台虚拟机都是 CentOS , CentOS6.5 (IP:10.0.80.199、10.0.80.200、10.0.80.201)
安装过程
yum install patch gcc-c++ make bzip2 autoconf automake libtool bison iconv-devel readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl* openssl-devel curl-devel expat-devel gettext-devel
1. 下载并解压
cd /usr/software
wget http://download.redis.io/releases/redis-3.2.4.tar.gz
tar -zxvf redis-3.2.4.tar.gz 
2. 编译安装
cd redis-3.2.4
make && make install
3. 创建 Redis 节点
首先在 192.168.31.245 机器上 /usr/software 目录下创建 redis-cluster 目录;
mkdir redis-cluster  
在 redis-cluster 目录下,创建名为6379、6380目录,并将 redis.conf 拷贝到这三个目录中
mkdir 6379 6380
cp redis.conf redis-cluster/6379
cp redis.conf redis-cluster/6380
分别修改配置文件,修改如下内容


port  6379                                        //端口6379,6380
bind 10.0.80.199                                       //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize    yes                               //redis后台运行
pidfile  /usr/software/redis-cluster/6379/redis-6379.pid          //pidfile文件对应6379,6380
cluster-enabled  yes                           //开启集群  把注释#去掉
cluster-config-file  /usr/software/redis-cluster/6379/nodes-6379.conf   //集群的配置  配置文件首次启动自动生成 6379,6380
cluster-node-timeout  15000                //请求超时  默认15秒,可自行设置
appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志
logfile /usr/software/redis-cluster/6379/redis.log   //日志记录文件



接着在另外2台机器上重复以上三步
4. 启动各个节点
/usr/local/bin/redis-server redis-cluster/6379/redis.conf
... ...
ps -ef | grep redis


5.创建集群


Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中。使用下面这个命令即可完成安装
./redis-trib.rb  create  --replicas  1 10.0.80.199:6379 10.0.80.200:6379 10.0.80.201:6379 10.0.80.201:6380 10.0.80.199:6380 10.0.80.200:6380
如果出错了,这个工具是用 ruby 实现的,所以需要安装 ruby。
--replicas 1 表示 自动为每一个master节点分配一个slave节点 上面有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)

6.ruby安装
系统默认安装的是1.8版本,需要安装2.0以上版本,下载
wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz
tar -zxvf  ruby-2.4.1.tar.gz
./configure --enable-shared --enable-pthread --prefix=/usr/local/ruby
make && make install
将ruby命令集加入系统环境变量
#export RUBY_HOME=/usr/local/ruby
#export PATH=$PATH:$RUBY_HOME/bin
echo "PATH=$PATH:/usr/local/ruby/bin;export PATH" >> /etc/profile
source /etc/profile

7.检查ruby、gem版本
ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
gem -v


8.安装redis的第三方接口
gem install redis--version 3.3.3
如果安装没问题
find / -name "redis"
/usr/local/ruby/lib/ruby/gems/2.4.0/gems/redis-3.3.3/lib/redis
如果没有出现,说明安装有问题,redis-trib.rb还是会无法执行
如果安装不正确,只有先卸载系统自带的ruby
yum remove ruby
进入先前ruby安装目录
make uninstall ruby
make clean
在重新步骤6

说明:在这里安装redis接口折腾好久(千万不能在ruby未安装配置好的情况下直接直接利用系统自带gem执行安装,那样的话也是安装在系统ruby 1.8版本下,等你配好ruby,去执行gem install redis,也是不成功),如果安装成功,执行步骤5 集群部署就成功了

 ./redis-trib.rb  create  --replicas  1 10.0.80.199:6379 10.0.80.200:6379 10.0.80.201:6379 10.0.80.201:6380 10.0.80.199:6380 10.0.80.200:6380
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
10.0.80.199:6379
10.0.80.200:6379
10.0.80.201:6379
Adding replica 10.0.80.200:6380 to 10.0.80.199:6379
Adding replica 10.0.80.199:6380 to 10.0.80.200:6379
Adding replica 10.0.80.201:6380 to 10.0.80.201:6379
M: 7c516370de41dfa88a67c65bda150027eacf58a5 10.0.80.199:6379
   slots:0-5460 (5461 slots) master
M: ce517da519e9d48b4b2ccd5d9c59ce9272be889d 10.0.80.200:6379
   slots:5461-10922 (5462 slots) master
M: 69fa96dcc1035d0339cb38042a473819514257e6 10.0.80.201:6379
   slots:10923-16383 (5461 slots) master
S: 9713ecac4a54542e1f7889bb7cca9697b48197ff 10.0.80.201:6380
   replicates 69fa96dcc1035d0339cb38042a473819514257e6
S: 84502278160d571489a838a0318483a898fcbdf6 10.0.80.199:6380
   replicates ce517da519e9d48b4b2ccd5d9c59ce9272be889d
S: 926abd06fd5207a4b6970d5bdd5ab417b4fcbb12 10.0.80.200:6380
   replicates 7c516370de41dfa88a67c65bda150027eacf58a5
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check (using node 10.0.80.199:6379)
M: 7c516370de41dfa88a67c65bda150027eacf58a5 10.0.80.199:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 926abd06fd5207a4b6970d5bdd5ab417b4fcbb12 10.0.80.200:6380
   slots: (0 slots) slave
   replicates 7c516370de41dfa88a67c65bda150027eacf58a5
S: 84502278160d571489a838a0318483a898fcbdf6 10.0.80.199:6380
   slots: (0 slots) slave
   replicates ce517da519e9d48b4b2ccd5d9c59ce9272be889d
S: 9713ecac4a54542e1f7889bb7cca9697b48197ff 10.0.80.201:6380
   slots: (0 slots) slave
   replicates 69fa96dcc1035d0339cb38042a473819514257e6
M: ce517da519e9d48b4b2ccd5d9c59ce9272be889d 10.0.80.200:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 69fa96dcc1035d0339cb38042a473819514257e6 10.0.80.201:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


9.认识redis-trib.rb
三、集群节点操作
1. 添加新master节点
1)启动实例
2)增加实例为master
redis-trib.rb add-node 10.0.80.202:6379 10.0.80.200:6379
说明:
第一个 ip:port 为新节点
第二个 ip:port 是任意一个已经存在的节点
新节点没有包含任何数据,也没有包含任何slot。
当集群需要将某个从节点升级为新的主节点时, 这个新节点不会被选中,同时新的主节点因为没有包含任何slot,不参加选举和failover。
3)为新增加的master 再分区(resharding),即从其他master移动一些slot
redis-trib.rb reshard 10.0.80.202:6379
#根据提示选择要迁移的slot数量(ps:这里选择4000)
How many slots do you want to move (from 1 to 16384)? 4000
#选择要接受这些slot的node-id
What is the receiving node ID? 035e1b5cc4ddd115546f024305c282b79020f1e3
#选择slot来源:
#all表示从所有的master重新分配,
#或者数据要提取slot的master节点id,最后用done结束
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:all
#打印被移动的slot后,输入yes开始移动slot以及对应的数据.
#Do you want to proceed with the proposed reshard plan (yes/no)? yes
#结束
//我们从201 移动500个slots 给202
redis-trib.rb reshard --from 0a8166334d595340ee86909a570944f7c14e5f73 --to 035e1b5cc4ddd115546f024305c282b79020f1e3 --slots 500 --yes --timeout 5000 10.0.80.201:6379
redis-trib.rb check 10.0.80.201:6380
>>> Performing Cluster Check (using node 10.0.80.201:6380)
S: 5654178703c5ffe4ec91c63d2837908a12f13a9c 10.0.80.201:6380
slots: (0 slots) slave
replicates 0a8166334d595340ee86909a570944f7c14e5f73
S: 79f20aeb23d61d0b580df3aca104260c5457aa6c 10.0.80.200:6380
slots: (0 slots) slave
replicates 7f5dda96b4c63f170c59b6cb767792ae0a4ffebb
M: 035e1b5cc4ddd115546f024305c282b79020f1e3 10.0.80.202:6379
slots:0-1332,5461-6794,10923-12255 (4000 slots) master
0 additional replica(s)
M: 0a8166334d595340ee86909a570944f7c14e5f73 10.0.80.201:6379
slots:12256-16383 (4128 slots) master
1 additional replica(s)
S: ec818b8579d630abbaf02f4c9157728f3b0237b6 10.0.80.199:6380
slots: (0 slots) slave
replicates 6efd3629d4b94ed6d91986cd3709cf0aa5a49892
M: 6efd3629d4b94ed6d91986cd3709cf0aa5a49892 10.0.80.200:6379
slots:6795-10922 (4128 slots) master
1 additional replica(s)
M: 7f5dda96b4c63f170c59b6cb767792ae0a4ffebb 10.0.80.199:6379
slots:1333-5460 (4128 slots) master
1 additional replica(s)

[OK] All nodes agree about slots configuration.


2. 添加新slave节点
1)启动实例
2)增加实例为slave
方法一:redis-trib.rb add-node --slave 10.0.80.200:6380 10.0.80.200:6379
说明:
第一个 ip:port 为新节点
第二个 ip:port 是任意一个已经存在的节点
新的节点会作为集群中其中一个主节点的从节点,一般来说是从节点最少的主节点
方法二:redis-trib.rb add-node --slave --master-id 035e1b5cc4ddd115546f024305c282b79020f1e3 10.0.80.200:6380 10.0.80.200:6379
说明:
-master-id xxxx 主节点的 ID
第一个 ip:port 为新节点
第二个 ip:port 是任意一个已经存在的节点

注意:在线添加slave 时,需要bgsave整个master数据,并传递到slave,再由 slave加载rdb文件到内存,rdb生成和传输的过程中消耗Master大量内存和网络IO,以此不建议单实例内存过大,线上小心操作。


3.删除一个 slave 节点
redis-trib.rb del-node ip:port '<node-id>'
说明:
ip:port 集群中已有的任意一节点(不是被删除的节点)

被删除节点的 ID


4.删除一个 master 节点
删除master节点之前首先要使用reshard移除master的全部slot,然后再删除当前节点。 (目前redis-trib.rb只能把被删除master的slot对应的数据迁移到一个节点上)。
1)迁移 slot
#把10.0.80.202:6379当前master迁移到10.0.80.199:6379上
redis-trib.rb reshard 10.0.80.199:6379
#根据提示选择要迁移的slot数量(ps:这里选择4000)
How many slots do you want to move (from 1 to 16384)? 4000(被删除master的所有slot数量)
#选择要接受这些slot的node-id(10.0.80.199:6379)
What is the receiving node ID? 7f5dda96b4c63f170c59b6cb767792ae0a4ffebb (ps:10.0.80.199:6379的node-id)
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:035e1b5cc4ddd115546f024305c282b79020f1e3(被删除master的node-id)
Source node #2:done
#打印被移动的slot后,输入yes开始移动slot以及对应的数据.
#Do you want to proceed with the proposed reshard plan (yes/no)? yes
2)删除空的 master 节点
redis-trib.rb del-node 10.0.80.201:6379 '035e1b5cc4ddd115546f024305c282b79020f1e3'
说明:
ip:port 集群中已有的任意一节点(不是被删除的节点)

被删除节点的 ID


5.在线 reshard 数据
对于负载/数据不均匀的情况,可以在线reshard slot来解决,方法与添加新master的reshard一样,只是需要reshard的master节点是已存在的老节点。

redis-trib.rb reshard 10.0.80.199:6379


6. 改变从节点的隶属关系
redis-cli -p 6380
10.0.80.201:6380> cluster replicate 7f5dda96b4c63f170c59b6cb767792ae0a4ffebb

说明:7f5dda96b4c63f170c59b6cb767792ae0a4ffebb 为新的主节点的 ID


7.通过master failover删除一个master实例
1)人工备份一个master
redis-cli -c -p 6380
10.0.80.200:6380> cluster failover
这个命令必须在slave node上面执行,使slave去failover它的master
2)del-node

redis-trib.rb del-node 10.0.80.201:6379 '0a8166334d595340ee86909a570944f7c14e5f73'

8.查看节点状态

redis-trib.rb check 10.0.80.201:6380

centos 关于redis 集群配置安装的更多相关文章

  1. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  3. ios – Swift 4添加手势:覆盖vs @objc

    我想在我的视图中添加一个手势,如下所示:但是,在Swift4中,我的编译器给出了以下错误:建议添加@objc以将此实例方法公开给Objective-C.实现此目的的另一个选项将覆盖touchesBegan()函数并使用它来处理点击.我试图以“Swift”的方式做到这一点,而不必带入Obj-C.有没有纯粹的Swift方式来添加这个轻击手势而不使用@objc?

  4. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  5. ios – 以编程方式在Swift中添加联系人

    我想在Swift中以编程方式添加联系人.我发现了一些Objective-C示例,但我没有让它们工作,甚至在Objective-C中也没有.我不希望这涉及到AddressBookUI,因为我想从我自己的UI中获取值.解决方法这是在Swift中添加联系人的快速方法.我在我的iPhone5iOS7.1上验证了它,因为我发现模拟器并不总是与我的手机对AB的东西相同.您可以添加一个按钮并指向此方法:顺便说一下–它假设你已经分配了一个地址簿var,你可以通过覆盖viewDidAppear来打开视图.它也会执行安全提示

  6. ios – 使用带有NodeJs HTTPS的certificates.cer

    我为IOS推送通知生成了一个.cer文件,我希望将它与NodeJSHTTPS模块一起使用.我发现HTTPS模块的唯一例子是使用.pem和.sfx文件,而不是.cer:有解决方案吗解决方法.cer文件可以使用两种不同的格式进行编码:PEM和DER.如果您的文件使用PEM格式编码,您可以像使用任何其他.pem文件一样使用它(有关详细信息,请参见Node.jsdocumentation):如果您的文件使

  7. ios – 为目标c中的方法传递未知类型的参数,可能吗?

    是否可以将未知类型的参数传递给objective-C方法?在C#中你可以写实现这一点,但我知道Objective-C没有泛型,所以有没有其他方法可以在Objective-C中实现这一点?我需要这个,因为我想创建一个方法来改变不同对象的文本颜色,如UITextField和UIButton的占位符文本.所以我的计划是创建一个名为textWhite的方法,然后在此方法中检查对象的类型,然后运行匹配的代码以使文本颜色变为白色.解决方法是的,可以传递未知类型的参数.见下面的例子.请参考使用id对象的链接作为参数Us

  8. ios – Swift指针算术和解除引用;将一些类似C的地图代码转换为Swift

    我有一点似乎没有工作的Swift代码……解决方法您正在指定locationPointer指向新位置,但仍在下一行中使用ptr,并且ptr的值尚未更改.将您的最后一行更改为:或者你可以改变指向var的指针并推进它:

  9. ios – “禁用模块时使用’@import’”错误 – 启用模块和链接框架= YES

    我有一个使用CocoaPods并使用’SCLAlertView-Objective-C’窗格的项目.该pod使用@importUIKit;模块样式导入.我在目标和项目设置中将“启用模块(C&Objective-C)”和“自动链接框架”设置为YES.当模块被禁用时,我仍然得到“使用’@import’错误.有没有什么可以阻止Xcode能够启用模块,如使用.pch文件,任何链接器标志,或者我没有提到的任

  10. XCode 6.3立即在抛出的Objective-C异常上引发SIGABRT

    考虑以下目标-C代码在XCode6.2中,它按预期工作(记录“错误消息”).但是,由于我们升级到6.3,抛出行(throwstd::logic_error…)引发SIGABRT(堆栈跟踪仅包含_cxa_throw和_pthread_kill,超出applicationdidFinishLaunchingWithOptions)并导致应用程序崩溃.这只发生在我们的应用程序中–当我将完全相同的代码复制

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部