一, 特点
高性能:
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.
redis-trib.rb del-node 127.0.0.1:7006 d3d67f8fd1680caba870a8b5a167c365088f6840
redis-trib.rb del-node 127.0.0.1:7007 64701ac2c0cf563cb6160c6948e97d2fdf602bfd
后面的值为地址和对应的id
要重新添加节点的话需要重新启动节点信息并且删除节点里面的信息