Cluster集群
Redis Cluster是官方提供的高可用方案,一个去中心化的Redis集群方案,所有的Redis节点彼此间互联(PING-PONG机制),客户端直连任意节点即可连接到Cluster集群,无需haproxy中间件。
总结:
1、 去中心化,分片存储,把所有的物理节点映射到[0-16383]共16384个slot(槽位)上,并不一定平均分配。
2、 Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
3、 支持主从机制,一个master可以有一个或多个从节点来保证集群的高可用性。
4、 master宕机需要经过集群中的所有master投票,如果有半数以上节点通信超时,则认为当前master宕掉。
5、 如果Cluster集群中的master没有slave,那么任意一台master宕掉后,集群不可用。
6、 集群如果超多半数以上master挂掉,无论是否有slave,集群进入fail状态。
7、 slave节点不会分配槽位
8、 Cluster集群最多支持1000个节点
环境
三台虚拟机,启动redis双实例,部署三主三从集群;此次是讲解最原始的Cluster集群创建,不使用官方的redis.trib.rb脚本创建,这是一个官方的ruby脚本。因为在公司生产中使用官方的脚本创建三台虚拟机双实例的Cluster集群,发现最后一台虚拟机始终是自己的6379和6380组成一对主从,即并非三台都是互为主从,有一对主从的是自己的实例。
172.16.1.7
172.16.1.31
172.16.1.61
#yum安装redis(需要epel源)
yum install -y redis
#创建多实例
mkdir -p /data/redis/{6379,6380}/{db,log}
配置文件
[[email protected] 6379]# cat /data/redis/6379/redis.conf
bind 172.16.1.7
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /data/redis/6379/redis.pid
loglevel notice
logfile /data/redis/6379/log/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis/6379/db
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
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
#启动redis实例
redis-server /data/redis/6379/redis.conf
redis-server /data/redis/6380/redis.conf
#配置requirepass认证
#临时配置(不重启配置)
redis-cli -h 172.16.1.7 -p 6379
172.16.1.7:6379> config get requirepass
1) "requirepass"
2) ""
172.16.1.7:6379> config set requirepass 123456
OK
172.16.1.7:6379> config get requirepass
(error) NOAUTH Authentication required.
172.16.1.7:6379> auth 123456
OK
172.16.1.7:6379> config get requirepass
1) "requirepass"
2) "123456"
#永久配置,必须修改配置文件
#手动修改
requirepass "123456"
#直接保存在命令行中的配置
172.16.1.7:6380> config rewrite
#该命令会把配置刷到配置文件中(刷到磁盘永久化)
requirepass "123456"
#刷入redis.conf、nodes.conf配置文件,如果是集群的配置需要使用
#cluster saveconfig命令
创建cluster集群
修改配置文件
#每个cluster节点都必须启动对cluster集群的支持
cluster-enabled yes
cluster-config-file nodes-6379.conf #(会保存在数据目录下)
cluster-node-timeout 15000
#cluster集群中不能有slaveof的定义
slaveof 172.16.1.61 6379
cluster-enabled yes
cluster-config-file nodes-6380.conf
cluster-node-timeout 15000
Reading the configuration file, at line 57
>>> ‘slaveof 172.16.1.61 6379‘
slaveof directive not allowed in cluster mode
#查看redis进程,是以集群模式启动的
[[email protected] ~]# ps -ef|grep redis
root 1193 1 0 00:08 ? 00:00:01 redis-server 172.16.1.7:6379 [cluster]
root 1212 1 0 00:24 ? 00:00:00 redis-server 172.16.1.7:6380 [cluster]
#此时集群的状态还是fail,因为还没有把其它的节点都加进来,槽位也还没有分配
redis-cli -h 172.16.1.7 -p 6379 -a 123456
172.16.1.7:6379> cluster info
cluster_state:fail
cluster_slots_assigned:1
cluster_slots_ok:1
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:1
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0
cluster_stats_messages_received:0
172.16.1.7:6379> cluster nodes
82424bf0ff964ca5486b7f904b95c155e6dceeb1 :6379 myself,master - 0 0 0 connected 15197
#在任意一个节点上把所有节点加入集群中
#把指定的节点添加到集群中
cluster meet 172.16.1.7 6380
172.16.1.7:6379> cluster nodes
965276bda73d2bce4a44a8fab6e18f676de54f15 172.16.1.61:6380 master - 0 1543768223343 0 connected
56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 172.16.1.31:6379 master - 0 1543768221299 2 connected
673443984a3610fcaa2fcbf3d295f60b2f7f32ae 172.16.1.31:6380 master - 0 1543768222323 3 connected
26d3142fb8766e1cfc01978d01c17e287f4ebd38 172.16.1.61:6379 master - 0 1543768225389 4 connected
85142215ac8c6af9ad0a72fb6ac2a5d2be2608a1 172.16.1.7:6380 master - 0 1543768224368 0 connected
82424bf0ff964ca5486b7f904b95c155e6dceeb1 172.16.1.7:6379 myself,master - 0 0 1 connected 15197
172.16.1.7:6379> cluster info
cluster_state:fail
cluster_slots_assigned:1
cluster_slots_ok:1
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:1
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:96
cluster_stats_messages_received:9
#在slave节点上指定master节点
#把当前节点设置为node_id的slave,即指定当前节点的master节点,在每个slave节点上执行
[[email protected] ~]# redis-cli -h 172.16.1.7 -p 6380 -a 123456
172.16.1.7:6380> cluster nodes
85142215ac8c6af9ad0a72fb6ac2a5d2be2608a1 172.16.1.7:6380 myself,master - 0 0 5 connected
26d3142fb8766e1cfc01978d01c17e287f4ebd38 172.16.1.61:6379 master - 0 1543768446773 4 connected
82424bf0ff964ca5486b7f904b95c155e6dceeb1 172.16.1.7:6379 master - 0 1543768444120 1 connected 15197
965276bda73d2bce4a44a8fab6e18f676de54f15 172.16.1.61:6380 master - 0 1543768445753 0 connected
56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 172.16.1.31:6379 master - 0 1543768441669 2 connected
673443984a3610fcaa2fcbf3d295f60b2f7f32ae 172.16.1.31:6380 master - 0 1543768444734 3 connected
172.16.1.7:6380> cluster replicate 26d3142fb8766e1cfc01978d01c17e287f4ebd38
OK
#最终结果
172.16.1.61:6380> cluster nodes
82424bf0ff964ca5486b7f904b95c155e6dceeb1 172.16.1.7:6379 master - 0 1543768678663 1 connected 15197
56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 172.16.1.31:6379 master - 0 1543768682754 2 connected
965276bda73d2bce4a44a8fab6e18f676de54f15 172.16.1.61:6380 myself,slave 56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 0 0 0 connected
85142215ac8c6af9ad0a72fb6ac2a5d2be2608a1 172.16.1.7:6380 slave 26d3142fb8766e1cfc01978d01c17e287f4ebd38 0 1543768683780 5 connected
673443984a3610fcaa2fcbf3d295f60b2f7f32ae 172.16.1.31:6380 slave 82424bf0ff964ca5486b7f904b95c155e6dceeb1 0 1543768679697 3 connected
26d3142fb8766e1cfc01978d01c17e287f4ebd38 172.16.1.61:6379 master - 0 1543768681741 4 connected
分配槽位
#redis3.0.0规定槽位一共有16384个,我们这里是平均分配到三个主节点上。
for i in {0..5460};do redis-cli -h 172.16.1.7 -p 6379 -a 123456 cluster addslots $i >/dev/null;done
for i in {5461..10922};do redis-cli -h 172.16.1.31 -p 6379 -a 123456 cluster addslots $i >/dev/null;done
for i in {10923..16383};do redis-cli -h 172.16.1.61 -p 6379 -a 123456 cluster addslots $i >/dev/null;done
#把集群配置写入磁盘,每个节点都需要执行cluster saveconfig
#检查集群状态
172.16.1.7:6379> 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:5
cluster_my_epoch:1
cluster_stats_messages_sent:2972
cluster_stats_messages_received:2972
172.16.1.7:6379> cluster nodes
965276bda73d2bce4a44a8fab6e18f676de54f15 172.16.1.61:6380 slave 56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 0 1543769558241 2 connected
56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 172.16.1.31:6379 master - 0 1543769553136 2 connected 5461-10922
673443984a3610fcaa2fcbf3d295f60b2f7f32ae 172.16.1.31:6380 slave 82424bf0ff964ca5486b7f904b95c155e6dceeb1 0 1543769559263 3 connected
26d3142fb8766e1cfc01978d01c17e287f4ebd38 172.16.1.61:6379 master - 0 1543769556196 4 connected 10923-15196 15198-16383
85142215ac8c6af9ad0a72fb6ac2a5d2be2608a1 172.16.1.7:6380 slave 26d3142fb8766e1cfc01978d01c17e287f4ebd38 0 1543769557220 5 connected
82424bf0ff964ca5486b7f904b95c155e6dceeb1 172.16.1.7:6379 myself,master - 0 0 1 connected 0-5460 15197
#配置集群masterauth认证,在集群创建成功之后配置,不然集群会创建失败
172.16.1.7:6379> config set masterauth 123456
OK
172.16.1.7:6379> config get masterauth
1) "masterauth"
2) "123456"
172.16.1.7:6379> config rewrite
OK
原文地址:http://blog.51cto.com/13691477/2328115