diff --git a/中间件/redis/redis.md b/中间件/redis/redis.md index 0b8c210..3595dc3 100644 --- a/中间件/redis/redis.md +++ b/中间件/redis/redis.md @@ -199,6 +199,7 @@ - [write safety](#write-safety) - [connected to the majority of masters](#connected-to-the-majority-of-masters) - [connected to the minority of masters](#connected-to-the-minority-of-masters) + - [Availability](#availability) # redis @@ -3240,5 +3241,21 @@ Redis Cluster `tries harder` to retain writes that are performed by clients conn - 如果`network partition`的持续时间超过`NODE_TIMEOUT`,那么所有针对`minority side`的写操作(直到达到NODE_TIMEOUT)都会被丢失 - 因为minority side在`NODE_TIMEOUT`达到后,如果仍然无法连接majority,将拒绝接收写请求,故而minority不可访问后window存在上限 +#### Availability +redis cluster在`minority side of partition`方将不可用。在`majority side of the partition`,假设其拥有`majority of masters`,并对每个不可达的master都拥有一个replica,那么在时间超过`NODE_TIMEOUT`之后,一个replica将会被重新选举变为新的master,此时redis cluster将重新可访问。 + +> 上述描述具体含义如下: +> - 当network partition发生后,majority partition部分可用,而minority partition不可用 +> - 当NODE_TIMEOUT达到后,majority partition会重新选举master,然后majority partition完全可用 +> - 当network partition恢复后,minority partition将作为replicas加入到集群,作为replcias提供服务 + +> 故而,redis cluster允许在少数节点发生故障时进行恢复(需要majority of masters),但是对于`large net splits`场景,redis cluster并不适用。 + +如果cluster由N个master nodes组成,每个master node都拥有一个replica,那么cluster的majority side在一个节点partitioned之后仍然可访问,但是当两个节点partitioned之后,仍然能正常访问的概率为`1-(1/(N*2-1))`。 + +redis cluster目前存在`replicas migration`的特性,replicas将会迁移到`orphaned masters`(masters no longer having replicas),这将在很多场景下提高redis cluster的可访问性。故而,每次正常处理failure event后,cluster都会重新调整replicas layout,以更高的抵御下一次failure。 + + +