5.1 redis-cluster 架构图
redis-cluster 投票:容错
架构细节:
(1)所有的 redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的 fail 是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与 redis 节点直连,不需要中间 proxy 层.客户端不需要连接集群所有节点,连接集群中任何一个可用
节点即可
(4)redis-cluster 把所有的物理节点映射到[0-16383]slot 上,cluster 负责维护 node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key
使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在
0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
5.2 Redis 集群规划
Redis 集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。
Redis 集群至少需要 6 台服务器。
搭建伪分布式。可以使用一台虚拟机运行 6 个 redis 实例。需要修改 redis 的端口号 7001-7006
5.3 集群搭建环境
1、使用 ruby 脚本搭建集群。需要 ruby 的运行环境。
安装 ruby
yum install ruby
yum install rubygems
2、安装 ruby 脚本运行使用的包。
[root@localhost ~]# gem install redis-3.0.0.gem
Successfully installed redis-3.0.0
1 gem installed
Installing ri documentation for redis-3.0.0...
Installing RDoc documentation for redis-3.0.0...
5.4 搭建步骤
需要 6 台 redis 服务器。搭建伪分布式。
需要 6 个 redis 实例。
需要运行在不同的端口 7001-7006
第一步:创建 6 个 redis 实例,每个实例运行在不同的端口。需要修改 redis.conf 配置文件。
配置文件中还需要把 cluster-enabled yes(632 行)前的注释去掉。修改端口(45 行)
每一台设置后台启动 daemonize yes
第二步:启动每个 redis 实例。
Vi start-all.sh
#!/bin/bash for I in {1..6} do echo "start 700$I redis" cd /usr/local/redis-cluster/700$I/bin ./redis-server redis.conf echo "700$I redis started" done
第三步:使用 ruby 脚本搭建集群。
将 redis-trib.rb 复制到/usr/local/redis-cluster 下
cp ~/redis-3.0.0/src/redis-trib.rb /usr/local/redis-cluster/
cd /usr/local/redis-cluster/
运行 redis-trib.rb 脚本
./redis-trib.rb create --replicas 1
192.168.81.142:7001 192.168.81.142:7002
192.168.81.142:7003 192.168.81.142:7004
192.168.81.142:7005 192.168.81.142:7006
>>> Creating cluster
Connecting to node 192.168.81.142:7001: OK
Connecting to node 192.168.81.142:7002: OK
Connecting to node 192.168.81.142:7003: OK
Connecting to node 192.168.81.142:7004: OK
Connecting to node 192.168.81.142:7005: OK
Connecting to node 192.168.81.142:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.81.142:7001
192.168.81.142:7002
192.168.81.142:7003
Adding replica 192.168.81.142:7004 to 192.168.81.142:7001
Adding replica 192.168.81.142:7005 to 192.168.81.142:7002
Adding replica 192.168.81.142:7006 to 192.168.81.142:7003
M: 7ca25ac01d3da5efb9f25aa7259e24cd9d16910d 192.168.81.142:7001
slots:0-5460 (5461 slots) master
M: 2c39ffee04aed3d1100b6b9d6640b630bcc295e1 192.168.81.142:7002
slots:5461-10922 (5462 slots) master
M: ab054ceb45e6c4e3d1efee645a8fb7d64abd28b5 192.168.81.142:7003
slots:10923-16383 (5461 slots) master
S: ad2e038493605c98f7b516877d393fe21f3fbf85 192.168.81.142:7004
replicates 7ca25ac01d3da5efb9f25aa7259e24cd9d16910d
S: 35859f9240701728bf93b0cd6868816e4efdbd67 192.168.81.142:7005
replicates 2c39ffee04aed3d1100b6b9d6640b630bcc295e1
S: 0b6c9898513c50f74ef4a690e1c07c04140cef7f 192.168.81.142:7006
replicates ab054ceb45e6c4e3d1efee645a8fb7d64abd28b5
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.81.142:7001)M: 7ca25ac01d3da5efb9f25aa7259e24cd9d16910d 192.168.81.142:7001
slots:0-5460 (5461 slots) master
M: 2c39ffee04aed3d1100b6b9d6640b630bcc295e1 192.168.81.142:7002
slots:5461-10922 (5462 slots) master
M: ab054ceb45e6c4e3d1efee645a8fb7d64abd28b5 192.168.81.142:7003
slots:10923-16383 (5461 slots) master
M: ad2e038493605c98f7b516877d393fe21f3fbf85 192.168.81.142:7004
slots: (0 slots) master
replicates 7ca25ac01d3da5efb9f25aa7259e24cd9d16910d
M: 35859f9240701728bf93b0cd6868816e4efdbd67 192.168.81.142:7005
slots: (0 slots) master
replicates 2c39ffee04aed3d1100b6b9d6640b630bcc295e1
M: 0b6c9898513c50f74ef4a690e1c07c04140cef7f 192.168.81.142:7006
slots: (0 slots) master
replicates ab054ceb45e6c4e3d1efee645a8fb7d64abd28b5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
第四步:使用集群
随便找一台机器连接即可,但是要加-c 参数 代表连接的是集群
7004/bin/redis-cli -h 192.168.81.142 -p 7004 -c
第五步 :停止集群
Vi stop-all.sh
#!/bin/bash cd /usr/local/redis-cluster/7001/bin for I in {1..6} do echo "stop 700$I redis" ./redis-cli -p 700$I shutdown echo "700$I redis stoped" done