之间提到的哨兵+主从模式的方案,主要存在以下两个缺点:
一、集群简介
redis集群是redis提供的分布式数据库方案,集群通过分片(Sharding)来进行数据共享,并提供复制和故障转移功能;
一个redis集群由多个节点(node)组成,各个节点之间的连接工作可以使用cluster meet来完成。而redis服务器在启动时会根据cluster-enabled配置选项的yes/no来决定是否开启服务器的集群模式。
集群的作用:
二、集群详细介绍
2.1 集群的数据结构
2.2 数据存储设计:
说明:节点使用以下算法来计算给定键key属于哪个槽:
def slot_number(key):
return CRC16(key) & 16383
其中CRC16(key)语句用于计算键key的CRC-16校验和,而&16383语句则用于计算出一个介于0至16383之间的整数作为key的槽号;
使用CLUSTER KEYSLOT <key>可以查看一个指定key属于哪个槽
2.3 重新分片
所谓增加节点和减少节点,就是改变槽对应的存储位置。加机器的时候相当于把自己的槽分给新的机器;去机器就把自己的返回给其他机器;
redis重新分片工作是由redis-trib负责执行的,重新分片的关键是将某个槽的所有键值对从一个节点转移到另外一个节点。
内部的通讯设计:各个数据库相互通信,保存各个库槽的编号数据;当key过来的时候,一次命中,直接返回;一次未命中,告知具体的位置,最多两次就可以找到key
2.4 复制与故障转移
redis集群中的节点分为主节点master和从节点slave,主节点用来处理槽,从节点用于复制某个主节点,并在被复制的主节点下线时,代替下线的主节点继续处理命令请求。
2.4.1 设置从节点
向一个节点发送指令:cluster replicate <node_id> 可以让接收命令的节点成为node_id所指定节点的从节点,并开始对主节点进行复制
2.4.2 故障检测
集群中的每个节点都会定期地向其他节点发送PING消息,以此来检测对方是否下线,如果接收PING的节点没有在规定的时间内向发送PING的节点返回PONG消息,这个时候发送PING的节点将对方标记为疑似下线(PFAIL)。
如果一个集群里面,半数以上负责处理槽的主节点都将某个主节点A报告为疑似下线,那么这个主节点将被标记为已下线(FAIL),将这个主节点A标记为已下线的节点会向集群广播一条消息,收到的消息的加二点都会立即将主节点A标记为已下线。
2.4.3 故障转移
当一个从节点发现自己正在复制的主节点进入已下线状态时,从节点将开始对下线主节点进行故障转移,以下是故障转移的执行步骤:
2.4.4 选举新的主节点
新的主节点通过选举产生,选举的方法类似哨兵的选举,都是基于Raft算法的领头选举;简要描述如下:
三、Cluster集群的搭建
3.1 cluster配置
功能 | 指令 |
设置加入cluster,成为其中的节点 | cluster-enabled yes/no |
cluster配置文件名(该文件自动生成的) | cluster-config-file <filename> |
节点服务访问超时时间,用来判断该节点是否下线并切换从节点 | cluster-node-timeout <millseconds> |
master连接的最小slave数量 | cluster-migration-barrier <count> |
3.2 cluster节点操作
功能 | 指令 |
查看集群节点信息 | cluster nodes |
进入一个从节点redis,切换其主节点 | cluster replicate <master-id> |
发现一个新节点,增加主节点 | cluster meet ip:port |
忽略一个没有solt的节点 | cluster forget <id> |
手动故障转移 | cluster failover |
这一篇就到这里。下一篇来聊一下缓存预热的相关话题。
原文:https://www.cnblogs.com/leijisong/p/14027477.html