Redis高可用(2.2):Redis Cluster

简述

单机redis的内存和性能都存在瓶颈,为了支持海量数据需要使用多master模式(横向扩容),即redis cluster集群。redis cluster是利用切片技术实现的集群,支持一主多从,读写分离,以及自动故障转移等,从而达到其高可用。

优点

(1)自动将数据进行分片,每个master上放一部分数据

(2)提供内置的高可用支持,部分master不可用时,还是可以继续工作的。(自动主从复制,读写分离[默认所有的读写都是master完成,cluster模式没有所谓的读      写分离的概念]、和故障转移[主备切换],支持多个master的hash slot,支持数据分布式存储)

 (3) 智能自动切换挂载关系:

a、如果某些master挂载了多个(>1)slave,在其他相对挂载slave少的节点出现宕机,挂载多的slave会自动切换的少的节点上

b、集群中的节点宕机后重新启动会自动加入集群(优先变为slave)

端口

扫描二维码关注公众号,回复: 219061 查看本文章

在redis cluster架构下,每个redis要放开两个端口号,比如一个是6379,另外一个就是加10000的端口号,比如16379。16379端口号是用来进行节点间通信的,也就是cluster bus的东西,集群总线。cluster bus的通信,用来进行故障检测,配置更新,故障转移授权cluster bus用了另外一种二进制的协议,主要用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间

算法

redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot。redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot。hash slot让node的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去,移动hash slot的成本是非常低的。

测试环境

服务器3台:192.168.0.200、192.168.0.201、192.168.0.202

每台服务启动两个redis实例,端口分别为:7000、7001

在安装目录建立如下目录结构:

${redis}/cluster/
		7000/
		    conf
		    data
		    logs
		7001/
		    conf
		    data
		    logs
 

启动命令(安装目录执行):

./bin/redis-server ./cluster/7000/conf/7000.conf

./bin/redis-server ./cluster/7001/conf/7001.conf

配置(redis.conf,即7000.conf和7001.conf)

bind 192.168.0.200

port 7001

daemonize yes

pidfile /var/run/redis_7001.pid

logfile "/usr/local/redis/cluster/7001/logs/redis.log"

dir "/usr/local/redis/cluster/7001/data"

appendonly yes

#开启cluster集群

cluster-enabled yes

#集群间通信存储的配置数据

cluster-config-file "/usr/local/redis/cluster/7001/data/nodes-7001.conf"

#集群间通信超时时间

cluster-node-timeout 15000

防火墙(增加如下端口过滤)

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7000 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17000 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7001 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17001 -j ACCEPT

拷贝安装包中的执行(ruby)脚本到安装目录的bin下

cp /usr/local/src/redis3.0/src/redis-trib.rb ./bin/

在线安装ruby环境

yum install ruby

yum install rubygems

#安装redis-trib.rb运行依赖的ruby的包redis-3.3.0.gem(上传“redis-3.3.0.gem”到/usr/local/src/)

gem install /usr/local/src/redis-3.3.0.gem

命令(任意一台服务器执行)

#创建集群(--replicas 1表示需要1个slave)

./bin/redis-trib.rb create --replicas 1 192.168.0.200:7000 192.168.0.200:7001 192.168.0.201:7000 192.168.0.201:7001 192.168.0.202:7000 192.168.0.202:7001

#结果(选择yes同意分配)

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.0.202:7000
192.168.0.201:7000
192.168.0.200:7000
Adding replica 192.168.0.201:7001 to 192.168.0.202:7000
Adding replica 192.168.0.202:7001 to 192.168.0.201:7000
Adding replica 192.168.0.200:7001 to 192.168.0.200:7000
M: f66e9c8f8f794c38679082f513955e7495b471ae 192.168.0.200:7000
   slots:10923-16383 (5461 slots) master
S: 7dd73f9e205f9db9b0896ba05a5ff3e6ccd7728c 192.168.0.200:7001
   replicates f66e9c8f8f794c38679082f513955e7495b471ae
M: 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd 192.168.0.201:7000
   slots:5461-10922 (5462 slots) master
S: 25890bb055947b74b4910f8a83c9a534fc7f824c 192.168.0.201:7001
   replicates b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f
M: b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f 192.168.0.202:7000
   slots:0-5460 (5461 slots) master
S: ca8767ec8451872b75a2659f568c9f55c6915f54 192.168.0.202:7001
   replicates 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd
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.0.200:7000)
M: f66e9c8f8f794c38679082f513955e7495b471ae 192.168.0.200:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f 192.168.0.202:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 7dd73f9e205f9db9b0896ba05a5ff3e6ccd7728c 192.168.0.200:7001
   slots: (0 slots) slave
   replicates f66e9c8f8f794c38679082f513955e7495b471ae
S: 25890bb055947b74b4910f8a83c9a534fc7f824c 192.168.0.201:7001
   slots: (0 slots) slave
   replicates b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f
S: ca8767ec8451872b75a2659f568c9f55c6915f54 192.168.0.202:7001
   slots: (0 slots) slave
   replicates 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd
M: 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd 192.168.0.201:7000
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
  

#检查集群状态(check任意节点即可)

./bin/redis-trib.rb check 192.168.0.200:7000

#结果

>>> Performing Cluster Check (using node 192.168.0.200:7000)
M: f66e9c8f8f794c38679082f513955e7495b471ae 192.168.0.200:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f 192.168.0.202:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 7dd73f9e205f9db9b0896ba05a5ff3e6ccd7728c 192.168.0.200:7001
   slots: (0 slots) slave
   replicates f66e9c8f8f794c38679082f513955e7495b471ae
S: 25890bb055947b74b4910f8a83c9a534fc7f824c 192.168.0.201:7001
   slots: (0 slots) slave
   replicates b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f
S: ca8767ec8451872b75a2659f568c9f55c6915f54 192.168.0.202:7001
   slots: (0 slots) slave
   replicates 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd
M: 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd 192.168.0.201:7000
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
  

#查看集群信息(info任意节点即可)

./bin/redis-trib.rb info 192.168.0.202:7000

结果:

192.168.0.202:7000 (b7a80819...) -> 3 keys | 5461 slots | 1 slaves.
192.168.0.200:7000 (f66e9c8f...) -> 1 keys | 5461 slots | 1 slaves.
192.168.0.201:7000 (11ebb1c8...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 5 keys in 3 masters.
0.00 keys per slot on average.
  

#集群中增加新的master节点(192.168.0.203:7000,新的节点;192.168.0.201:7001,集群中任意节点)

./bin/redis-trib.rb add-node 192.168.0.203:7000 192.168.0.201:7001

#重新分片(192.168.0.201:7001,集群中任意节点。新增的master节点slot为空,需要手动其分配slot和迁移相关slot数据。分配(16384/master节点数)这么slot,类似于平均分配,也可根据自己实际情况分配。)

./bin/redis-trib.rb reshard 192.168.0.201:7001

#集群中增加新的slave节点(建立主从关系),master-id为要加到master主节点的node id,192.168.0.203:7001为新增的从节点,192.168.0.201:7001为集群中任意节点,用来辨识是哪个集群;如果没有给定那个主节点--master-id的话,redis-trib将会将新增的从节点随机到从节点较少的主节点上。

./bin/redis-trib.rb add-node --slave --master-id 1751e5a8a9cf9ac9bad349b3d0949107541a3c22 192.168.0.203:7001 192.168.0.201:7001

#移除master节点(192.168.0.201:7001,集群中任意节点,1751e5a8a9cf9ac9bad349b3d0949107541a3c22为主节点的node id,移除节点前需要转移节点上的slot。主节点移除后,挂在其上的slave节点会优先自动选择一些没有slave的节点进行自动挂载)

./bin/redis-trib.rb del-node 192.168.0.201:7001 1751e5a8a9cf9ac9bad349b3d0949107541a3c22

#移除slave节点(与移除master节点使用命令相同)

./bin/redis-trib.rb del-node 192.168.0.201:7001 38fcf92ee9a0d9b5f8e30c2fdf0ee6884cdbb00e

#redis-cli客户端操作与之前的不同之处

#1、slave节点不能直接读取当前缓存的数据,需要先执行readonly命令

192.168.0.202:7001> get name
(error) MOVED 5798 192.168.0.201:7000
192.168.0.202:7001> readonly
OK
192.168.0.202:7001> get name
"zhangsan"
  

#2、master节点set数据error(key对应的slot不在当前节点,需要转移。可通过redis-cli -c参数实现自动重定向)

192.168.0.201:7000> set age 12
(error) MOVED 741 192.168.0.202:7000

猜你喜欢

转载自hengdu.iteye.com/blog/2403669