centos 关于redis 集群配置安装

时间:2022-09-15 17:58:00

一、概述
    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架构图
centos 关于redis 集群配置安装
架构细节:
  (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
  (2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
  (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
   2) redis-cluster选举:容错
   centos 关于redis 集群配置安装
   (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 //日志记录文件
dbfilename /usr/software/redis-cluster/6379/dump.rdb



接着在另外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

centos 关于redis 集群配置安装

三、集群节点操作
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

9.redis-3.2.4/utils/create-cluster使用

10.集群的关闭和重启
      redis cluster官方文档,没发现有关集群重启和关闭的方法。主要是因为在正式的环境中集群一般都由3台物理机构成,3台物理机同时挂掉的可能性极小。只要不同时挂掉,挂掉的机器修复后在加入集群,集群都能良好的运作,万一同时挂掉,数据又没有备份的话,就有大麻烦了。