redis cluster 部署过程

Posted kingle66

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis cluster 部署过程相关的知识,希望对你有一定的参考价值。

一, 特点

高性能:

  1、在多分片节点中,将16384个槽位,均匀分布到多个分片节点中
  2、存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间)
  3、根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上
  4、如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储

高可用:
  在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,实现类似于sentinel的自动failover的功能。


  1、redis会有多组分片构成(3组)
  2、redis cluster 使用固定个数的slot存储数据(一共16384slot)
  3、每组分片分得1/3 slot个数(0-5500  5501-11000  11001-16383)
  4、基于CRC16(key) % 16384 ====》值 (槽位号)。

规划、搭建过程:

  6个redis实例,一般会放到3台硬件服务器
  注:在企业规划中,一个分片的两个分到不同的物理机,防止硬件主机宕机造成的整个分片数据丢失。

 

二, 配置

 

端口号:7000-7005

1、安装集群插件


  EPEL源安装ruby支持
  yum install ruby rubygems -y

使用国内源
  gem sources -l
  gem sources -a http://mirrors.aliyun.com/rubygems/
  gem sources  --remove https://rubygems.org/
  gem sources -l
  gem install redis -v 3.3.3

或者:
  gem sources -a http://mirrors.aliyun.com/rubygems/  --remove https://rubygems.org/

2、集群节点准备

  1 mkdir /data/700{0..7}
  2 
  3 vim /data/7000/redis.conf
  4 port 7000
  5 daemonize yes
  6 pidfile /data/7000/redis.pid
  7 loglevel notice
  8 logfile "/data/7000/redis.log"
  9 dbfilename dump.rdb
 10 dir /data/7000
 11 protected-mode no
 12 cluster-enabled yes
 13 cluster-config-file nodes.conf
 14 cluster-node-timeout 5000
 15 appendonly yes
 16 
 17 
 18 vim /data/7001/redis.conf
 19 port 7001
 20 daemonize yes
 21 pidfile /data/7001/redis.pid
 22 loglevel notice
 23 logfile "/data/7001/redis.log"
 24 dbfilename dump.rdb
 25 dir /data/7001
 26 protected-mode no
 27 cluster-enabled yes
 28 cluster-config-file nodes.conf
 29 cluster-node-timeout 5000
 30 appendonly yes
 31 
 32 
 33 vim /data/7002/redis.conf
 34 port 7002
 35 daemonize yes
 36 pidfile /data/7002/redis.pid
 37 loglevel notice
 38 logfile "/data/7002/redis.log"
 39 dbfilename dump.rdb
 40 dir /data/7002
 41 protected-mode no
 42 cluster-enabled yes
 43 cluster-config-file nodes.conf
 44 cluster-node-timeout 5000
 45 appendonly yes
 46 
 47 
 48 
 49 vim /data/7003/redis.conf
 50 port 7003
 51 daemonize yes
 52 pidfile /data/7003/redis.pid
 53 loglevel notice
 54 logfile "/data/7003/redis.log"
 55 dbfilename dump.rdb
 56 dir /data/7003
 57 protected-mode no
 58 cluster-enabled yes
 59 cluster-config-file nodes.conf
 60 cluster-node-timeout 5000
 61 appendonly yes
 62 
 63 
 64 
 65 vim /data/7004/redis.conf
 66 port 7004
 67 daemonize yes
 68 pidfile /data/7004/redis.pid
 69 loglevel notice
 70 logfile "/data/7004/redis.log"
 71 dbfilename dump.rdb
 72 dir /data/7004
 73 protected-mode no
 74 cluster-enabled yes
 75 cluster-config-file nodes.conf
 76 cluster-node-timeout 5000
 77 appendonly yes
 78 
 79 
 80 vim /data/7005/redis.conf
 81 port 7005
 82 daemonize yes
 83 pidfile /data/7005/redis.pid
 84 loglevel notice
 85 logfile "/data/7005/redis.log"
 86 dbfilename dump.rdb
 87 dir /data/7005
 88 protected-mode no
 89 cluster-enabled yes
 90 cluster-config-file nodes.conf
 91 cluster-node-timeout 5000
 92 appendonly yes
 93 
 94 
 95 
 96 vim /data/7006/redis.conf
 97 port 7006
 98 daemonize yes
 99 pidfile /data/7006/redis.pid
100 loglevel notice
101 logfile "/data/7006/redis.log"
102 dbfilename dump.rdb
103 dir /data/7006
104 protected-mode no
105 cluster-enabled yes
106 cluster-config-file nodes.conf
107 cluster-node-timeout 5000
108 appendonly yes
109 
110 
111 vim /data/7007/redis.conf
112 port 7007
113 daemonize yes
114 pidfile /data/7007/redis.pid
115 loglevel notice
116 logfile "/data/7007/redis.log"
117 dbfilename dump.rdb
118 dir /data/7007
119 protected-mode no
120 cluster-enabled yes
121 cluster-config-file nodes.conf
122 cluster-node-timeout 5000
123 appendonly yes


启动节点:

1 redis-server /data/7000/redis.conf
2 redis-server /data/7001/redis.conf
3 redis-server /data/7002/redis.conf
4 redis-server /data/7003/redis.conf
5 redis-server /data/7004/redis.conf
6 redis-server /data/7005/redis.conf
7 redis-server /data/7006/redis.conf
8 redis-server /data/7007/redis.conf

 

 1 [root@db01 ~]# ps -ef |grep redis 

 



3、将节点加入集群管理

1 redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005



4、集群状态查看

集群主节点状态

redis-cli -p 7000 cluster nodes | grep master


集群从节点状态


 1 redis-cli -p 7000 cluster nodes | grep slave 

 

三, 添加节点

 

集群节点管理

  添加主节点:

redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

    add-node 后面写的地址为需要添加的地址

       最后的地址为管理的地址

  

  添加一个从节点

     -----------------------------注意---------------------------

redis-trib.rb add-node --slave --master-id 691dbaf500ffe5a60213a5f8681637ea7868e9c5 127.0.0.1:7007 127.0.0.1:7000

  --master-id 后面的是对应的主节点id值

  后面跟的是从节点地址

  最后的是管理节点地址


    转移slot(重新分片)

    ----------------------------重点-----------------------

每次添加都必须向新添加的节点增加slot,不然没有性能的提升

 

redis-cli -p 7000 cluster nodes | grep master

  

  添加节点后默认是没有slot的

运行

redis-trib.rb reshard 127.0.0.1:7000

      

   后面的数字填写的是需要挪动的slot数 一般是16384除以主节点数得出的结果

   我这里节点数有4个 所以 16384/4 = 4096 

  

    这个id值为需要接收的id 就是哪个新添加需要接收slot的id值

    

               这个是选择从哪里拿slot值,   选择all就是再所有节点上拿一点 每个节点平均分给需要收益的节点

    选择yes 表示开始配置!!!!!

 

 

四, 删除节点

  将需要删除节点的slot先移动走
    redis-trib.rb reshard 127.0.0.1:7000

   进入内容后

  归还第一个空间
    

    因为节点一开始分配了4096的slot ,所以要把4096均匀的还给其余三个节点

    第一个节点归还

    第一个值是归还的大小

    第二个值为归还的目标,我这里第一个归还目标为7000节点

    选择确定

    

    第一个为选择从哪里拿去slot值,因为要删除7006, 所以也是从7006拿区值

    第二个空位done 及结束,表示只在这里拿

    确定

    

    选择yes

  第二次归还

     发现7006空间少了,7000空间添加进去了   

     剩下的开始归还

    

    确定到底,

    第一个值位从7006要删除的节点抽取的slot值

    第二个位抽取的值接收的节点ID

    第三个值为抽取slot值的节点是哪个

    第四个为结束

    确定------>后面的为yes

  第三次归还

    发现slot又少了, 受益者为7001

    

    

    确定到底,

    第一个值位从7006要删除的节点抽取的slot值

    第二个位抽取的值接收的节点ID

    第三个值为抽取slot值的节点是哪个

    第四个为结束

    确定------>后面的为yes

  

   

 最后发现没了

  现在删除他们一主一从 7006 7007

  

1 [root@db01 ~]# redis-trib.rb del-node 127.0.0.1:7006 d3d67f8fd1680caba870a8b5a167c365088f6840
2 >>> Removing node d3d67f8fd1680caba870a8b5a167c365088f6840 from cluster 127.0.0.1:7006
3 >>> Sending CLUSTER FORGET messages to the cluster...
4 >>> SHUTDOWN the node.
5 [root@db01 ~]# redis-trib.rb del-node 127.0.0.1:7007 64701ac2c0cf563cb6160c6948e97d2fdf602bfd
6 >>> Removing node 64701ac2c0cf563cb6160c6948e97d2fdf602bfd from cluster 127.0.0.1:7007
7 >>> Sending CLUSTER FORGET messages to the cluster...
8 >>> SHUTDOWN the node.
View Code

 

  redis-trib.rb del-node 127.0.0.1:7006 d3d67f8fd1680caba870a8b5a167c365088f6840

  redis-trib.rb del-node 127.0.0.1:7007 64701ac2c0cf563cb6160c6948e97d2fdf602bfd

  后面的值为地址和对应的id

  

  要重新添加节点的话需要重新启动节点信息并且删除节点里面的信息

 

以上是关于redis cluster 部署过程的主要内容,如果未能解决你的问题,请参考以下文章

Redis Cluster集群部署搭建

Redis Cluster 4.0高可用集群安装在线迁移操作记录

Redis cluster命令部署集群及数据导入

redis cluster集群部署

部署redis4.0-cluster

Redis-cluster高可用集群部署