集群介绍 Redis cluster 是 redis 的分布式解决方案,在3.0版本正式推出,当遇到单机、内存、并发、流量等瓶颈时,可以采用cluster 架构方案达到负载均衡目的。 Redis Cluster 之前的分布式方案有两种: 1、客户端分区方案,优点,分区逻辑可控,缺点是需要自己处理数据路由,高可用和故障转移等。 2、代理方案,优点,简化客户端分布式逻辑和升级维护便利,缺点,加重架构部署和性能消耗。 官方提供的Redis Cluster集群方案,很好的解决了集群方面的问题 数据分布: 分布式数据库首先要解决把整个数据库集 按照 分区规则 映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集,需要关注的是数据分片规则,Redis Cluster采用哈希分片规则。 ++++++++++ 槽位:slot 一个集群中有 16384 个槽位,无论有多少个节点,总的槽位,就只有这么多。 重点是槽的数量,而不是序号。 0----5460 5461个槽位 5461----10922 5462个槽位 10923----16383 5461个槽位 只要有一个槽位有问题或者没分配,整个集群都不可使用,必须是16384个槽位全部分配完毕,并且所有的槽都能正常工作,这个集群才能用。 合理的集群架构:redis 群集搭建: 三台服务器: 192.168.189.14 redis01 主节点6380 从节点6381 192.168.189.15 redis02 主节点6380 从节点6381 192.168.189.16 redis03 主节点6380 从节点6381 一、创建目录(3台服务器上都操作) mkdir -p /usr/local/redis_cluster/redis_{6380,6381}/{conf,logs,pid} mkdir -p /data/redis_cluster/redis_{6380,6381} 二、写入配置文件,在 192.168.189.14 上面操作 vim /usr/local/redis_cluster/redis_6380/conf/redis_6380.conf bind 192.168.189.14 port 6380 daemonize yes pidfile "/usr/local/redis_cluster/redis_6380/pid/redis_6380.pid" logfile /usr/local/redis_cluster/redis_6380/logs/redis_6380.log" dbfilename "redis_6380.rdb" dir "/data/redis_cluster/redis_6380" cluster-enabled yes cluster-config-file nodes_6380.conf cluster-node-timeout 15000 保存,退出。 +++++++++++++++ 创建从节点,配置文件 cd /usr/local/redis_cluster/redis_6380/conf/ cp ./redis_6380.conf /usr/local/redis_cluster/redis_6381/conf/redis_6381.conf 把6380 端口修改为,6381 。 启动 6380 6381 这两个节点 三、配置另外两台服务器 把192.168.189.14 的6380 6381的配置文件,拷贝到 另外两个节点的对应的目录下面 修改bind 后面的IP 为对应两台服务器的IP cd /usr/local/redis_cluster/redis_6380/conf scp -r ./redis_6380.conf root@192.168.189.15:/usr/local/redis_cluster/redis_6380/conf/ scp -r ./redis_6380.conf root@192.168.189.16:/usr/local/redis_cluster/redis_6380/conf/ cd /usr/local/redis_cluster/redis_6381/conf scp -r ./redis_6381.conf root@192.168.189.15:/usr/local/redis_cluster/redis_6381/conf/ scp -r ./redis_6381.conf root@192.168.189.16:/usr/local/redis_cluster/redis_6381/conf/ 启动 6380 6381 这两个节点 ++++++++++++++++++ 配置文件说明: #激活集群模式 cluster-enabled yes #集群的配置文件,在你定义的数据目录下面。 cluster-config-file nodes_6380.conf #集群的超时时间, 单位是毫秒。建议不要设置得太短,一般在5-10秒。 cluster-node-timeout 15000 192.168.189.14 登录6380 ++++++++++++ 四、手动配置 集群发现节点(登录任意一台服务器) 集群的配置文件不要手动修改,集群会自动发现,修改。 集群命令: cluster nodes #查看集群节点
cluster meet 192.168.189.15 6380 ##发现其他节点
![]()
++++++++ 登录 192.168.189.14 的6381 发现集群其他两节点 ##群集里面的信息都是共享的,当一个节点进入一个集群里面,他就能共享到这个集群里面其他节点的信息。
其他服务器上,看到的内容也是一样的,都在一个集群内。
++++++++++++ Redis Cluster 通讯流程 在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责哪些数据,是否出现故障灯状态信息,redis集群采用Gossip(流言)协议,Gossip 协议工作原理就是节点彼此不断交换信息,一段时间后,所有的节点都会知道集群完整信息,这种方式类似流言传播。 1、集群中的每个节点都会单独开辟一个Tcp通道,用于节点之间彼此通信,通信端口在基础端口上加10000
2、每个节点在固定周期内通过特定规则选择结构节点发送ping信息 3、接收到ping信息的节点用 pong 消息作为响应。集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,只要这些节点彼此可以通信,最终他们会达成一致的状态,当节点出现故障,新节点加入,主从角色变化等,它能够给不断的ping/pong消息,从而达到同步目的。 Gossip协议职责就是信息交换,信息交换的载体就是节点间彼此发送 Gossip 消息 常见的Gossip消息分为:ping 、pong 、meet、fail等 meet 消息:用于通知新节点加入,消息发送者通知接收者加入到当前集群,meet消息通信正常完成后,接收节点会加入到集群中并进行ping、pong消息交接。 ping 消息:集群内每个节点每秒向多个其他节点发送ping消息,用于检测节点是否在线和交换彼此信息。 pong 消息:当接收到ping , meet 消息时,作为响应消息回复给发送方确认消息 正常通信,节点也可以向集群内广播自身的pong 消息来通知整个集群,对自身状态进行更新。 fail 消息:当节点判定集群内另一个节点下线时,会向集群内广播一个fail消息,其他节点收到fail消息之后,把对应节点更新为下线状态。 ++++++++++++++ 五、手动分配槽位: 虽然有6个节点,但是真正负责数据写入的只有3个节点,其他3个节点只是作为主节点的从节点,也就是说,只需要分配其中三个节点的槽位就可以了。 分配槽位的命令: redis-cli -h 192.168.189.14 -p 6380 cluster addslots {0..5461} redis-cli -h 192.168.189.15 -p 6380 cluster addslots {5462..10922} redis-cli -h 192.168.189.16 -p 6380 cluster addslots {10923..16383} 查看集群状态:登录集群 cluster info
![]()
+++++++++ 六、手动创建主从复制关系: 查看节点(192.168.189.14 上面操作) redis-cli -h 192.168.189.14 -p 6380 cluster nodes|awk '/6380/{print $1,$2 }' 58c2ec39dccc3e4c9b8b9628d8d6729b8f3879b2 192.168.189.15:6380@16380 9e53332aebe80f6b1a04f91483c9a7d1e196d073 192.168.189.14:6380@16380 386a4eba8f2b5179aa11fe0b3596de690b8ded21 192.168.189.16:6380@16380 主从复制关系拓扑图:
创建主从关系命令:(192.168.189.14) redis-cli -h 192.168.189.14 -p 6381 cluster replicate 58c2ec39dccc3e4c9b8b9628d8d6729b8f3879b2 redis-cli -h 192.168.189.15 -p 6381 cluster replicate 386a4eba8f2b5179aa11fe0b3596de690b8ded21 redis-cli -h 192.168.189.16 -p 6381 cluster replicate 9e53332aebe80f6b1a04f91483c9a7d1e196d073
++++++++++++++++++ 七、数据写入测试:(登录任意一个主节点) redis-cli -h 192.168.189.16 -p 6380
redis-cli -h 192.168.189.16 -p 6380 ###流程图
Redis Cluster ASK路由 在集群模式下Redis接收任何键相关命令时,首先会计算对应的槽,再根据槽找出对应的节点,如果节点是自身,则处理命令,否则回复 MOVED 重写错误,通知客户端去请求正确的节点,这个过程称为Mover重定向。 重新登录192.168.189.16 6380 redis-cli -c -h 192.168.189.16 -p 6380 -c Enable cluster mode (follow -ASK and -MOVED redirections).
redis-cli -c -h 192.168.189.16 -p 6380 ### 流程图
+++++++++++ 集群故障转移: 192.168.189.14 上面,关掉 6380
![]()
启动192.168.189.14 6380