Redis cluster 简介
1.采用去中心化的思想,没有中心节点的说法,它使用hash slot方式将16348个hash slot覆盖到所有节点上,对于存储的每个key值,使用CRC16(KEY)&16348=slot得到他对应的hash slot,并在访问key的时候就去找他的hash slot在哪一个节点上,然后由当前访问节点从实际被分配了这个hash slot的节点去取数据,节点之间使用轻量协议通信 减少带宽占用 性能很高,自动实现负载均衡与高可用,自动实现failover并且支持动态扩展,官方已经玩到可以1000个节点 实现的复杂度低。
2.其内部中也需要配置主从,并且内部也是采用哨兵模式,如果有半数节点发现某个异常节点,共同决定更改异常节点的状态,如果改节点是主节点,则对应的从节点自动顶替为主节点,当原先的主节点上线后,则会变为从节点。如果集群中的master没有slave节点,则master挂掉后整个集群就会进入fail状态,因为集群的slot映射不完整。如果集群超过半数以上的master挂掉,无论是否有slave,集群都会进入fail状态。
3.根据官方推荐 集群部署至少要3台以上的master节点。
搭建过程
Ip 端口
192.168.83.128 6000
192.168.83.128 6001
192.168.83.128 6002
192.168.83.128 6003
192.168.83.128 6004
192.168.83.128 6005
1. 先安装redis
cd /usr/local
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xzf redis-5.0.5.tar.gz
cd redis-5.0.5/
make
2.创建目录
mkdir rediscluster
cd rediscluster/
[root@localhost rediscluster]# mkdir redis6000
[root@localhost rediscluster]# mkdir redis6001
[root@localhost rediscluster]# mkdir redis6002
[root@localhost rediscluster]# mkdir redis6003
[root@localhost rediscluster]# mkdir redis6004
[root@localhost rediscluster]# mkdir redis6005
在每个目录下面创建 data和log
3.启动参数
存放目录 /usr/local/rediscluster/redis6000/redis6000.conf,由于是6个节点,每个节点的目录和端口是不一样的,请参照这个进行修改
protected-mode no
port 6005
pidfile "/var/run/redis_6005.pid"
save 9 1
save 300 10
save 60 10000
daemonize yes
timeout 1800
databases 16
loglevel notice
logfile "/usr/local/rediscluster/redis6005/log/redis.log"
rdbcompression yes
dbfilename "dump.rdb"
dir "/usr/local/rediscluster/redis6005/data"
maxclients 50000
maxmemory 1063256064
stop-writes-on-bgsave-error yes
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 128mb
activerehashing yes
rdbchecksum yes
#vw-enabled yes
aof-use-rdb-preamble yes
aof-load-truncated yes
no-appendfsync-on-rewrite yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 1000
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hz 10
aof-rewrite-incremental-fsync yes
#repliaction
#masterauth "123456"
#requirepass "123456"
#slave-serve-stale-data yes
#slave-read-only yes
#repl-diskless-sync no
#repl-diskless-sync-delay 5
#repl-disable-tcp-nodelay no
#slave-priority 100
#cluster
cluster-enabled yes
cluster-config-file nodes_6005.conf
cluster-node-timeout 15000
4.启动redis
[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6000/redis6000.conf
[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6001/redis6001.conf
[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6002/redis6002.conf
[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6003/redis6003.conf
[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6004/redis6004.conf
[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6005/redis6005.conf
[root@localhost redis-5.0.5]# ps -ef |grep redis
root 57466 1 0 10:45 ? 00:00:00 src/redis-server *:6000 [cluster]
root 57473 1 0 10:46 ? 00:00:00 src/redis-server *:6001 [cluster]
root 57487 1 0 10:46 ? 00:00:00 src/redis-server *:6002 [cluster]
root 57492 1 0 10:46 ? 00:00:00 src/redis-server *:6003 [cluster]
root 57498 1 0 10:46 ? 00:00:00 src/redis-server *:6004 [cluster]
root 57504 1 2 10:46 ? 00:00:00 src/redis-server *:6005 [cluster]
root 57510 52442 0 10:46 pts/0 00:00:00 grep --color=auto redis
5.启动后我们就可以创建集群
注意:
在redis5.0后 创建集群统一使用redis-cli,之前的版本使用redis-trib.rb,但是需要安装ruby软件相对复杂,相比之前的版本5.0不需要安装额外的软件,方便。具体的可以参照redis官方网站查看
https://redis.io/topics/cluster-tutorial
创建集群命令:其中 cluster-replicas 1 代表 一个master后有几个slave,1代表为1个slave节点
src/redis-cli --cluster create 192.168.83.128:6000 192.168.83.128:6001 192.168.83.128:6002 192.168.83.128:6003 192.168.83.128:6004 192.168.83.128:6005 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.83.128:6004 to 192.168.83.128:6000
Adding replica 192.168.83.128:6005 to 192.168.83.128:6001
Adding replica 192.168.83.128:6003 to 192.168.83.128:6002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 6104062a1f3e7f183a01064ca225a43d903c6fa9 192.168.83.128:6000
slots:[0-5460] (5461 slots) master
M: 236ef722de05fb03af442eb528b7aa12da482f35 192.168.83.128:6001
slots:[5461-10922] (5462 slots) master
M: 94f272ebb67027861a5e788b86388b979e16a4c3 192.168.83.128:6002
slots:[10923-16383] (5461 slots) master
S: 72de2e9a41f4b4d5f155efac41aebbeb90b5af7b 192.168.83.128:6003
replicates 94f272ebb67027861a5e788b86388b979e16a4c3
S: 17900d952666c054aeb169c2880d49662b222a58 192.168.83.128:6004
replicates 6104062a1f3e7f183a01064ca225a43d903c6fa9
S: 16d1233717f7f2c26f398e155328b324a4d26449 192.168.83.128:6005
replicates 236ef722de05fb03af442eb528b7aa12da482f35
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 192.168.83.128:6000)
M: 6104062a1f3e7f183a01064ca225a43d903c6fa9 192.168.83.128:6000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 17900d952666c054aeb169c2880d49662b222a58 192.168.83.128:6004
slots: (0 slots) slave
replicates 6104062a1f3e7f183a01064ca225a43d903c6fa9
M: 236ef722de05fb03af442eb528b7aa12da482f35 192.168.83.128:6001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: 94f272ebb67027861a5e788b86388b979e16a4c3 192.168.83.128:6002
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 72de2e9a41f4b4d5f155efac41aebbeb90b5af7b 192.168.83.128:6003
slots: (0 slots) slave
replicates 94f272ebb67027861a5e788b86388b979e16a4c3
S: 16d1233717f7f2c26f398e155328b324a4d26449 192.168.83.128:6005
slots: (0 slots) slave
replicates 236ef722de05fb03af442eb528b7aa12da482f35
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
6.我们验证一下集群是否创建成功
登录redis客户端 src/redis-cli -c -p 6000, -c 参数代表连接到集群中
我们先看一下主从配对情况,根据node ID匹配可以得出配比。大家可以看看是否有对应的ID,这样我们就区分了主从节点的关系了。
[root@localhost redis-5.0.5]# src/redis-cli -c -p 6000
127.0.0.1:6000> cluster nodes
17900d952666c054aeb169c2880d49662b222a58 192.168.83.128:6004@16004 slave 6104062a1f3e7f183a01064ca225a43d903c6fa9 0 1578021017661 5 connected
236ef722de05fb03af442eb528b7aa12da482f35 192.168.83.128:6001@16001 master - 0 1578021016656 2 connected 5461-10922
94f272ebb67027861a5e788b86388b979e16a4c3 192.168.83.128:6002@16002 master - 0 1578021015000 3 connected 10923-16383
6104062a1f3e7f183a01064ca225a43d903c6fa9 192.168.83.128:6000@16000 myself,master - 0 1578021015000 1 connected 0-5460
72de2e9a41f4b4d5f155efac41aebbeb90b5af7b 192.168.83.128:6003@16003 slave 94f272ebb67027861a5e788b86388b979e16a4c3 0 1578021016000 4 connected
16d1233717f7f2c26f398e155328b324a4d26449 192.168.83.128:6005@16005 slave 236ef722de05fb03af442eb528b7aa12da482f35 0 1578021016000 6 connected
查看群集信息
[root@localhost redis-5.0.5]# src/redis-cli -c -p 6000
127.0.0.1:6000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:7
cluster_my_epoch:1
cluster_stats_messages_ping_sent:2368
cluster_stats_messages_pong_sent:1921
cluster_stats_messages_fail_sent:4
cluster_stats_messages_auth-ack_sent:1
cluster_stats_messages_update_sent:1
cluster_stats_messages_sent:4295
cluster_stats_messages_ping_received:1916
cluster_stats_messages_pong_received:2020
cluster_stats_messages_meet_received:5
cluster_stats_messages_fail_received:1
cluster_stats_messages_auth-req_received:1
cluster_stats_messages_received:3943
验证数据匹配是否采用哈希槽的方式。我在6000客户端设置的数据,被分配到6004上了。
127.0.0.1:6000> set aa "1111"
OK
[root@localhost redis-5.0.5]# src/redis-cli -c -p 6004
127.0.0.1:6004> get aa
-> Redirected to slot [1180] located at 192.168.83.128:6000
"1111"
7.验证故障转移
我们从上面可以看出6002为master,6003为其从节点。我们按照如下流程进行操作
先停掉6002,发现6003转为了master节点,然后恢复6002上线,6002变为slave节点。
[root@localhost redis-5.0.5]# ps -ef |grep redis
root 57919 1 0 11:05 ? 00:00:02 src/redis-server *:6000 [cluster]
root 57925 1 0 11:05 ? 00:00:02 src/redis-server *:6001 [cluster]
root 57931 1 0 11:05 ? 00:00:02 src/redis-server *:6002 [cluster]
root 57937 1 0 11:05 ? 00:00:02 src/redis-server *:6003 [cluster]
root 57943 1 0 11:05 ? 00:00:02 src/redis-server *:6004 [cluster]
root 57949 1 0 11:06 ? 00:00:02 src/redis-server *:6005 [cluster]
root 58505 52442 0 11:36 pts/0 00:00:00 grep --color=auto redis
[root@localhost redis-5.0.5]# kill -9 57931
[root@localhost redis-5.0.5]# ps -ef |grep redis
root 57919 1 0 11:05 ? 00:00:02 src/redis-server *:6000 [cluster]
root 57925 1 0 11:05 ? 00:00:02 src/redis-server *:6001 [cluster]
root 57937 1 0 11:05 ? 00:00:02 src/redis-server *:6003 [cluster]
root 57943 1 0 11:05 ? 00:00:02 src/redis-server *:6004 [cluster]
root 57949 1 0 11:06 ? 00:00:02 src/redis-server *:6005 [cluster]
root 58509 52442 0 11:37 pts/0 00:00:00 grep --color=auto redis
[root@localhost redis-5.0.5]# src/redis-server /usr/local/rediscluster/redis6002/redis6002.conf
[root@localhost redis-5.0.5]# src/redis-cli -c -p 6000
127.0.0.1:6000> cluster nodes
17900d952666c054aeb169c2880d49662b222a58 192.168.83.128:6004@16004 slave 6104062a1f3e7f183a01064ca225a43d903c6fa9 0 1578022689000 5 connected
236ef722de05fb03af442eb528b7aa12da482f35 192.168.83.128:6001@16001 master - 0 1578022689187 2 connected 5461-10922
94f272ebb67027861a5e788b86388b979e16a4c3 192.168.83.128:6002@16002 slave 72de2e9a41f4b4d5f155efac41aebbeb90b5af7b 0 1578022690194 7 connected
6104062a1f3e7f183a01064ca225a43d903c6fa9 192.168.83.128:6000@16000 myself,master - 0 1578022689000 1 connected 0-5460
72de2e9a41f4b4d5f155efac41aebbeb90b5af7b 192.168.83.128:6003@16003 master - 0 1578022688176 7 connected 10923-16383
16d1233717f7f2c26f398e155328b324a4d26449 192.168.83.128:6005@16005 slave 236ef722de05fb03af442eb528b7aa12da482f35 0 1578022687000 6 connected
8.集群节点扩容
在rediscluster,新增2个redis节点配置6006和6007两个端口。将6006作为新增的master节点,6007作为从节点,然后启动节点:
添加主节点:
./redis-cli --cluster add-node 192.168.83.128:6006 192.168.83.128:6000
添加从节点:
./redis-cli --cluster add-node 192.168.83.128:6007 192.168.83.128:6000 --cluster-slave --cluster-master-id 22e8a8e97d6f7cc7d627e577a986384d4d181a4f(此ID为6006端口的ID)
添加成功后,为新节点分配数据:
./redis-cli --cluster reshard 192.168.83.128:6006
这样就新增完毕了,可以通过cluster nodes命令查看一下新增后的slot分布
9.集群节点缩减
缩减节点时先缩减从节点:
./redis-cli --cluster del-node 192.168.83.128:6007
然后进行主节点slot转移:
./redis-cli --cluster reshard 192.168.83.128:6006
最后在缩减主节点
./redis-cli --cluster del-node 192.168.83.128:6006
閱讀更多 碩果累累1316 的文章