Java架构技术进阶

Redis 集群演进探讨和总结

2020-07-14  本文已影响0人  Java进阶师猩猩

Redis为什么需要集群?

首先Redis单实例主要有单点,容量有限,流量压力上限的问题。

Redis单点故障,可以通过主从复制replication,和自动故障转移sentinel哨兵机制。

但Redis单Master实例提供读写服务,仍然有容量和压力问题,因此需要数据分区,构建多个Master实例同时提供读写服务(不仅限于从replica节点提供读服务)。

那么就需要一定的机制保证数据分区。这样能充分把容量分摊到多台计算机,或能充分利用多核计算机的性能。

并且数据在各个主Master节点间不能混乱,当然最好还能支持在线数据热迁移的特性。

探讨数据分区方案

Redis 集群演进探讨和总结

针对数据分区,一般来说,分为两个大类:

固定取模

Redis 集群演进探讨和总结

假设有三个 Master,配置IP 和权重如下:

Real Server IPweight10.0.2.21110.0.2.22210.0.2.233

那么会根据每一个real Server 及其权重虚拟出对应权重 weight 个的虚拟vritual server节点,映射关系会是:

Real Server IPvirtual server10.0.2.21110.0.2.222,310.0.2.234,5,6

一个 key 存储在那个虚拟vritual server节点,通过哈希hash算法:

virtual_server_index = hash(key) % (total_virtual_weight)

假设某个key,它的 hash 值是 10,那么以上: 10%6=4,将落到 10.0.2.23 这个真实的 Master上。

随机

Redis 集群演进探讨和总结

随机选取一个存储和访问。 一般结合 list,用于非顺序性要求的消息队列场景。

一致性哈希

一致性哈希算法(Consistent Hashing)最早在论文《Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web》中被提出。 简单来说,一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希空间环如下:

Redis 集群演进探讨和总结

哈希槽(PreSharding)

这个跟哈希一致性很相似。 区别在于,它预先分配好真实节点管理的哈希槽(slot),并存储管理起来,我们可以预先知道哪个master主机拥有哪些哈希槽(slot),这里总数是16384。

Redis 集群演进探讨和总结
127.0 .0 .1 : 7001 > cluster nodes
2aaf59558f1b9f493a946a695e51711eb03d15f9 127.0 .0 .1 : 7002 @17002 master - 0 1590126183862 2 connected 5461 - 10922
6439c3e9468fd2c545a63b3b9bfe658c5fc14287 127.0 .0 .1 : 7003 @17003 master - 0 1590126181856 3 connected 10923 - 16383
340d 985880c23de9816226dff5fd903322e44313 127.0 .0 .1 : 7001 @17001 myself, master - 0 1590126182000 1 connected 0 - 5460

我们可以清晰看到Redis Cluster中的每一个master节点管理的哈希槽。 比如 127.0.0.1:7001 拥有哈希槽 0-5460, 127.0.0.1:7002 拥有哈希槽 5461-10922, 127.0.0.1:7003 拥有哈希槽 10923-16383。

Redis 集群演进探讨和总结
➜ redis - cli - p 7001
127.0 .0 .1 : 7001 > set a 1
(error) MOVED 15495 127.0 .0 .1 : 7003

➜ redis - cli - p 7001 - c
127.0 .0 .1 : 7001 > set a 1
- > Redirected to slot [15495] located at 127.0 .0 .1 : 7003
OK

具体方案

上一篇 下一篇

猜你喜欢

热点阅读