Redis3集群 结构

Redis集群:
1. redis集群是主从结构, 多个master(主)节点共享集群的hash slot(哈希槽 16384个).
2. 主从数据的异步备份, 不能保证数据的强一致性. (原因:主节点在与从节点进行数据同步前, 会把对客户端的处理 结果返回客户端, 然后再与从节点进行数据同步; 若在主节点返回结果到客户端后, 在与从节点进行同步前, 主节点(master)宕掉了, 然后此master的一个slave被提拔为主节点, 那么这个新的主节点的数据是有部分丢失的. 见下图)
3. 需要两个TCP port: 一个是客户端的连接端口(6379), 另一个端口用于节点间的数据交换和信息通信(一般是在客户端端口上再加上10000: 例如16379)
4. 集群是高可用的, 高效的, 可线性扩展到1000个节点.
5. 当需要保证数据的强一致性时, 可使用Redis集群提供的 WAIT命令 (wait会保证主节点与其从节点完成数据同步后再把结果返回到客户端. 注意:在性能和一致性上进行取舍.), 这样会保证数据丢失的最小化. 但也不能保证数据的绝对一致性, 例如当发生网络分区时.
(注: 关于集群的主从同步, 持久化和管道请见: http://blog.csdn.net/weidenglu11/article/details/58060806 )

发生网络分区情景(scenario):
redis集群中有6个节点, 3个主节点(A, B, C)和三个对应的从节点(A1, B1, C1). 客户端 Z1.
网络分区1里有: A, C, A1, B1, C1.
网络分区2里有: B 和 Z1.
客户端Z1仍能够向B中写数据, 若网络分区能够在很短时间内恢复, 集群人能够正常运行.
如果网络分区持续的时间足够让redis cluster把网络分区1里的从节点B1升级为主节点的话, 那么刚刚Z1发送到B中的数据将会丢失.
这个时间是由配置的node timeout值决定的. 当一个主节点与集群失去联系的时间超过此timeout时, 就会认为当前主节点失败, 并会提拔它的一个从节点作为新的主节点. 当一个主节点与其它大多数主节点失联时间超过timeout值后, 会进入一个错误状态并停止接受任何写操作.

Redis的shardding分片: 哈希槽(hash slot)在主节点上怎样分布的操作.
当增减节点时会发生Resharding. 或者手动调动slot的分布.
hash slot其实就是key的集合.

a hash slot is just a set of keys, so what Redis Cluster really does during resharding is to move keys from an instance to another instance. Moving a hash slot means moving all the keys that happen to hash into this hash slot.

Each master node in a cluster handles a subset of the 16384 hash slots. The cluster is stable when there is no cluster reconfiguration in progress (i.e. where hash slots are being moved from one node to another). When the cluster is stable, a single hash slot will be served by a single node

Redis中映射键(KEY)到槽(Slot)的基本算法是: HASH_SLOT = CRC16(key) mod 16384
key的Hash tags能确保多个key能够分配到同一个hash slot里. 这是为了实现redis集群对multi-key的操作.
hash tags模式是: {xxx}, 只有在这 第一个花括号 ‘{’ 和 第一个‘}’ 之间的部分才会被hash. 如果 ‘{’ 和 ‘}’之间为空则会对整个key进行hash.
多建操作例子multi-key operation: (在resharding过程中不可以多键操作)
MSET {user:1000}.name Angela {user:1000}.surname White

https://img-blog.csdn.net/20170225181833347?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpZGVuZ2x1MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
节点:
1. 每个节点都有唯一的节点id, 有集群的配置信息, 发送最近ping的时间, 最近接收到pong的时间, 连接状态, slot信息, node flag(标记是master还是slave)等.
2. Redis集群中的每个节点都与其它的每个节点通过TCP保持连接. 若一个集群中有N个节点, 那么每个节点都向外连接着其它的N-1个节点, 每个节点也被其它的N-1个节点连接着. 节点间通过心跳(ping - pong)来判断节点是否可达. 在节点不可达前, 会自动尝试重连.
3. 非集群节点发送的包会被忽略摒弃掉.
在以下2种情况会认为是来自redis集群的节点:

A node will accept another node as part of the cluster only in two ways:
If a node presents itself with a MEET message. A meet message is exactly like a PING message, but forces the receiver to accept the node as part of the cluster. Nodes will send MEET messages to other nodes only if the system administrator requests this via the following command:
CLUSTER MEET ip port
A node will also register another node as part of the cluster if a node that is already trusted will gossip about this other node. So if A knows B, and B knows C, eventually B will send gossip messages to A about C. When this happens, A will register C as part of the network, and will try to connect with C.

This mechanism makes the cluster more robust but prevents different Redis clusters from accidentally mixing after change of IP addresses or other network related events.

Redis实现HA(高可用high available)中的点, 在此记录一下:
Redis HA的实现是, 当master宕掉时, 集群会提升它的一个slave为master.
假设主节点: A, B, C
主节点对应的从节点: A1, B1, C1, C2 (C1和C2都是C的从节点, A1位A的从节点, B1位B的从节点)
情景1: 主节点B宕掉了, 集群会提升B的从节点B1为新的主节点(注意B1没有从节点了) — 集群可继续正常运行.
情景2: 若B1再宕掉集群就无法运行了.
其实Redis的真实做法是这样的: 当B1升为主节点后, 集群会把主节点C的其中一个从节点(比如说C2)过继给B1, 作为B1的从节点使用. 这样就能最大化地保证集群的高可用. 若B1当掉时, C2会被提拔为主节点来替代B1, 这样集群还能继续运行.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值