redis 笔记05 Sentinel、集群
Sentinel
1. Sentinel只是一个运行在特殊模式下的Redis服务器,它使用了和普通模式不同的命令表,所以Sentinel模式能够使用的命令和普通的Redis服务器能够使用的命令不同。
2. Sentinel会读入用户指定的配置文件,为每个要被监控的主服务器创建相应的实例结构,并创建连向主服务器的命令连接和订阅连接,其中命令连接用于向主服务器发送命令请求,
而订阅连接则用于接收指定频道的消息。
3. Sentinel通过向主服务器发送INFO命令来获得主服务器属下所有从服务器的地址信息,并为这些从服务器创建相应的实例结构,以及连向这些从服务器命令连接和订阅连接。
4. 在一般情况下,Sentinel以每十秒一次的频率向被监视的主服务器和从服务器发送INFO命令,当主服务器处于下线状态,或者Sentinel正在对主服务器进行故障转移操作时,
Sentinel向从服务器发送INFO命令的频率改为每秒一次。
5. 对于监视同一个主服务器和从服务器的多个Sentinel来说,他们会以每两秒一次的频率,通过向被监视服务器的_sentinel_:hello频道发送消息来向其他Sentinel宣告自己的存在。
6. 每个Sentinel也会从_sentinel_:hello频道中接收其他Sentinel发来的而信息,并根据这些信息为其他Sentinel创建相应的实例结构,以及命令连接。
7. Sentinel只会与主服务器和从服务器创建命令连接和订阅连接,Sentinel与Sentinel之间则只会创建命令连接。
8. Sentinel以每秒一次的频率向实例(包括主服务器、从服务器、其他Sentinel)发送PING命令,并根据实例对PING命令的回复来判断实例是否在线,当一个实例在指定时长中连续向Sentinel
发送无效回复时,Sentinel会将这个实例判断为主观下线。
9. 当Sentinel将一个主服务判断为主观下线时,它会向同样监视这个主服务器的其他Sentinel进行询问,看他们是否同意这个主服务器已经进入主观下线状态。(多次确认)
10. 当Sentinel收集到足够多的主观下线投票之后,它会将主服务器判断为客观下线,并发起一次针对主服务器的故障转移操作。
11. 主服务器下线后,通过一系列筛选条件过滤从服务器,最后比较复制偏移量,如果也相等,则根据主键。
集群
1. 节点通过握手来将其他节点添加到自己所处的集群当中 (双方确认)
2. 集群中的16384个槽可以分别指派给集群中的各个节点,每个节点都会记录哪些槽指派给了自己,而哪些槽又被指派给了其他节点。
3. 节点在接收到一个命令请求时,会先检查这个命令请求要处理的键所在的槽是否由自己负责,如果不是的话,节点向客户端返回一个MOVED错误,MOVED错误携带的信息可以指引客户端转向
至正在负责相关槽的节点。
4. 对Redis集群的重新分片工作是由redis-trib负责执行的,重新分片的关键是将属于某个槽的所有键值对从一个节点转移至另一个节点。
5. 如果节点A正在迁移槽i至节点B,那么当节点A没能在自己的数据库找到命令指定的数据库键时,节点A会向客户端返回一个ASK错误,指引客户端到节点B继续查询指定的数据库键。
6. MOVED错误表示槽的负责权已经从一个节点转移到了另一个节点,而ASK错误只是两个节点在迁移槽的过程中使用一种临时措施。
7. 集群里的从节点用于复制主节点,并在主节点下线时,代替主节点继续处理命令请求。
8. 集群中的节点通过发送和接收消息来进行通信,常见的消息包括MEET 、PING 、PONG 、PUBLISH 、FAIL五种。
9. Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据库共享,并提供复制和故障转移功能。
10. 一个Redis集群通常由多个节点组成,连接各个节点的工作可以使用CLUSTER MEET命令来完成:CLUSTER MEET <ip> <port> 。向一个节点node发送CLUSTER MEET命令,可以让node
节点与ip和port所指定的节点进行握手,当握手成功时,node节点就会将ip和port所指定的节点添加到node节点当前所在的集群中。
11. Redis 需要设置custer_enabled为yes来启动集群模式。
12. Redis集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为16384个槽(slot),数据库中的每个键都属于整个16384个槽的其中一个,集群中的每个节点可以处理0个到16384个槽。
当数据库中的16384个槽都有节点在处理时,集群处于上线状态。如果有一个槽没有得到处理,那么集群处于下线状态(fail)。
13. 通过CLUSTER ADDSLOTS命令,我们可以将一个或多个槽指派给节点负责:CLUSTER ADDSLOTS <slot> [slot.....] 例如:CLUSTER ADDSLOTS 0 1 2 3 ... 5000
14. clusterNode结构的slots(标记节点是否负责槽,如果值为1,负责,值为0,不负责)属性和numslot(槽的数量)属性记录了所有节点负责处理哪些槽。
15. 节点会将自己的slots数组通过消息发送给进群中的其他节点。其他节点将信息存储到自己的clusterNode中
16. clusterState结构中的slots数组记录了集群中所有16384个槽指派信息。
17. clusterState.slots数组记录了集群中的所有槽的指派信息,而clusterNode.slots数组只记录clusterNode结构所代表的节点的槽指派信息,这是两个slots数据的关键区别。
18. 向一个节点发送:CLUSTER REPICATE <node_id> 可以让接收命令的节点成为node_id所指定节点的从节点,并开始对主节点进行复制。