redis集群中如果有3对主从节点,其中有一对挂掉 集群还能正常工作吗?(不能)

1.正常启动3对主从节点的集群,查看集群节点信息

redis 每个节点的 slot数查下 redis查看节点状态_redis

2.kill掉当前的一个主节点6379

redis 每个节点的 slot数查下 redis查看节点状态_redis_02

redis 每个节点的 slot数查下 redis查看节点状态_redis_03

发现,与6379对应的从节6389点变为主节点,仍能正常从集群查询数据

3.关闭6389主节点,并进行数据查询

redis 每个节点的 slot数查下 redis查看节点状态_接受者_04

redis 每个节点的 slot数查下 redis查看节点状态_redis 每个节点的 slot数查下_05

redis 每个节点的 slot数查下 redis查看节点状态_redis_06

发现获取数据异常!

分析:

消息机制

redis cluster集群中通过消息来进行通信。消息共有以下5种。

meet消息:发送者会向接受者发送cluster meet命令,请求接受者将发送者加入到集群中。上文提到的无中心网络结构就是使用meet命令构建的。

ping消息:集群中的每个节点每秒钟都会从已知节点列表选举出5个节点,然后从这5个节点中选中一个最长时间没有发送ping消息的节点作为目标节点来发送ping消息,来检测目标节点是否处于在线状态。

pong消息:接受者接受到发送者发送的meet消息或者ping消息后,会回复pong消息,用于确认消息已经到达。另外,pong消息也可以用于刷新接收者对发送者的信息,例如故障转移后,从节点会向集群中发送pong消息,用于告知从节点已经升级为主节点。

fail消息:fail消息用于通知将某个节点置为下线状态。例如节点A认为节点B已下线,节点A会向集群中发送一条fail消息,接受到这条消息的节点会将节点B标记为已 下线。

publish消息:当某个节点收到publish命令后,会向集群中发送一条publish消息。

 

1.redis-cluster架构图

redis 每个节点的 slot数查下 redis查看节点状态_接受者_07

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是通过集群中超过半数的master节点检测失效时才生效.

(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->key

2. redis-cluster选举:容错

 

redis 每个节点的 slot数查下 redis查看节点状态_客户端_08

(1)领着选举过程是集群中所有master参与,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作.

(2):什么时候整个集群不可用(cluster_state:fail)

    a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

    b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

 当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

 参考:https://hot66hot.iteye.com/blog/2050676