redis的集群有多种实现方案且各有优劣,其各种实现的对比参照文章:
1、Redis常见集群方案、Codis实践及与Twemproxy比较(注意回答时间,太早的参考价值可能会有折扣):http://blog.csdn.net/mawming/article/details/52171116
2、Redis集群方案应该怎么做:https://www.zhihu.com/question/21419897
本文主要介绍redis官方提供的redis-cluster的搭建及使用。
-----------------------------------------------------------------------------
配置一个6节点集群,3主3从,主节点端口为6379,6380,6381,从节点端口为6389,6390,6391;
A、全手动方式
1、修改redis.conf配置文件,只需修改对应端口即可
port 6379 //节点端口
cluster-enabled yes //开启集群模式
cluster-node-timeout 15000 //节点超时时间(接收pong消息回复的时间)
cluster-config-file /work/redis-4.0.8/rediscluster/data/nodes-6379.conf //集群内部配置数据存储文件(起始可以不存在,启动后会自动创建)
ps:这里并没有配置从节点slaveof,也就是都是主节点,集群中的主从是后来通过拷贝命令设置的;
2、启动6个redis实例,查看某个节点的id值
可以直接查看cluster-config-file配的文件内容,也可以登录节点,用cluste nodes命令查看,结果是一样的;
启动过程中由于节点数较多,可以考虑手写脚本来启动;
3、节点握手。各个节点启动后,实际还是相互独立的,彼此不知道对方的存在,需要通过握手操作建立联系,这是集群通信的第一步;
握手结束后,cluster nodes可以看到节点数据,上图我们可以看到一共6个节点,三个节点被标记为master,myself是说当前登录节点是哪个节点;
握手成功后,此时集群处于下线状态,禁止所有读写,因为还没有分配哈希槽;
4、分配哈希槽;redis集群有16384个哈希槽(0-16383),需要设置每个节点对应的槽后集群方可使用;
注意,此命令老版本为addslots{0...5461}新版本为addslots {0..5461},新命令两个参数中间少了一个点
移除槽的命令为delslots {0..5461}
从图中看到,分配结束后,集群状态变更为ok,查看cluster info:
此时的cluster nodes:
可以看到所有节点都是master节点,我们想要的是master-slave的,需要手动设置主从:
5、设置主从关系
6389、6390跟6391分别设置主节点为6379、6380跟6381,命令为:cluster replicate masterid
设置完毕后,查看cluster nodes,可以看到3主3从:
此时集群可用,设置值,会发现被重定向到不同主机:
可以看到,本来我连接的是6379,结果执行后被重定向到了6381;
注意:集群模式下,连接使用命令为 redis-cli -h masterip -p port -c,最后有一个-c,表示集群模式,否则会报错而无法重定向;
B、自动方式
方式A需要改大量文件并执行一定量脚本,容易疏忽出错;其实redis提供了比较简洁方便的方式来启动集群。这次我们配一个master带两个slave:
1、准备redis.conf配置文件9份,三组端口分别为:
6379-----6380-----6381
6479-----6480-----6481
6579-----6580-----6581
其中79作为主节点,80跟81作为从节点
启动9个redis
2、在redis-trib.rb所在的目录,执行脚本:
./redis-trib.rb create --replicas 2
192.168.2.100:6379 192.168.2.100:6479 192.168.2.100:6579
192.168.2.100:6380 192.168.2.100:6480 192.168.2.100:6580
192.168.2.100:6381 192.168.2.100:6481 192.168.2.100:6581
为了方便,换行了,实际是一行
执行后会自动握手并分配哈希槽,执行cluster nodes,可以看到有3个master6个slave;
redis-trib.rb check ip:port可以检查集群健康情况,如下:
可以看到三个master分配哈希槽的情况,没有警告,说明一切正常。
########################################################
检测集群是否正常切换主从:
三个端口79结尾的为master节点,从上图也可以看到,直接kill 杀掉6479
可以看到kill掉主节点后,日志一直在打印信息,尝试连接主节点
多次尝试未果,启动fail over机制,启用slave节点
观察时间,从master失联到从节点切换为主节点,整个集群状态一致,大概20s,截图不到20秒,实际后面仍有部分日志,我本次尝试大概在22秒。
再次查看集群状态,发现6481切换为master:
如果要添加密码,需要在配置文件添加requirepass “123456789” 跟 masterauth “123456789”
主从都要添加,因为从节点可能会变成主节点
-------------------------------------------
over