redis replication,单master数据容量有限,要支撑海量数据,只能使用redis cluster。
- hash算法
来了一个key,计算hash值,对节点数量取模。缺陷:只要任一master宕机,那么剩下三分之二的数据都要重新哈希计算。这个很不好。在上述过程没完成前,几乎缓存100%不可用。
- 一致性hash算法+虚拟节点
哈希环,保证任何一个master宕机,只有之前在master上的数据会受到影响,因为照着顺时针走,全部在之前master上找不到了,master宕机了,会走到下一个master上去,但是也找不到。使用虚拟节点,均匀分布在哈希环中,避免某区间数据全部落在单个节点上。
- hash slot算法
来了一个key,计算hash值,对hash slot取模。而hash slot是分配到不同的redis 实例中的,当某台实例宕机后,只有该实例上的那部分数据会丢失,而不会像哈希算法一样出现全部缓存不可用的情况。
- redis cluster节点通信
采用gossip,与集中式的快速感知不同,它降低了集中式的压力,但是元数据更新有所延时。
- smart jedis
在JedisCluster初始化的时候,会随机选择一个node,初始化hashslot->node映射表,同时为每个节点创建一个JedisPool连接池,每次基于JedisCluster执行操作,首先JedisCluster都会在本地计算key的hashslot,然后在本地映射表找到对应的节点,如果那个node正好还是持有那个hashslot,那么就ok;如果说进行了reshard这样的操作,可能hashslot已经不在那个node上,就会返回moved,此时Jedis API会借助该节点更新自己的本地映射表。
- 高可用性与主备切换原理
主观宕机;客观宕机;从节点过滤,如果超过cluster-node-timeout * cluster-slave-validity-factor,那么就没有资格成为master;从节点选举,按slave priority;offset;run id进行排序。