下列问题是我在搭建Redis集群之前与实验过程发出的疑问
随着我Redis集群的成功搭建,疑问也一个一个解开
Redis集群搭建参考资料
Redis-Cluster参考资料
Redis集群的数据互通吗?
先说结论:互通的;往Redis集群里存放一个数据时,他会以Hash Slot
哈希槽的方式将数据存放在不同的结点,取出对应Key时,再连接到该结点去取出。
-
以集群模式随机连接至一个Redis结点,此结点中无数据:
root@hadoop102:~/myredis# ./redis-cli -c -h 192.168.150.102 -p 7002
192.168.150.102:7002> keys *
(empty list or set)
-
随机Set多个值,发现客户端居然在结点间不停地切换:
192.168.150.102:7002> set helloWorld OKOK
-> Redirected to slot [519] located at 192.168.150.102:7001
OK
192.168.150.102:7001> set OKOK hahaha
-> Redirected to slot [13171] located at 192.168.150.104:7001
OK
192.168.150.104:7001> set XIXIXI OKOKOK
-> Redirected to slot [10749] located at 192.168.150.103:7001
OK
-
在某一个结点上,查看结点上的Key,并get一个曾经set过的,但是并不存放此结点的Key,发现连接到了该结点,并成功取出了。
192.168.150.102:7001> keys *
1) "hello"
2) "helloWorld"
192.168.150.102:7001> get OKOK
-> Redirected to slot [13171] located at 192.168.150.104:7001
"hahaha"
为什么在集群模式下Set
和Get
总是会出现Redirected to slot
字样,并跳转到目的主机?
因为Redis集群采用了Hash Slot
的模式,每个结点都存放一段不同的分片
Redis集群中有16384个hash slots,为了计算给定的key应该在哪个hash slot上,我们简单地用这个key的CRC16值来对16384取模。(即:key的CRC16 % 16384)
为什么要使用Hash Slots
而不是一致性哈希算法?
-
Hash Slots
继承并增强一致性哈希的容错性,扩展性,以及平衡性。 Redis在此种算法下,可以当缓存,也能当存储数据库!
因为将hash slots从一个节点移动到另一个节点并不需要停止其它的操作,添加、删除节点以及更改节点所维护的hash slots的百分比都不需要任何停机时间。也就是说,移动hash slots是并行的,移动hash slots不会影响其它操作。
集群模式下,不同数据存放在不同的结点,那怎么该结点宕机了怎么办?
结论
- 启动
Master-Slave
模式,为每一个Master
配备Slave
- 当
Master
宕机后,Slave
内有Master
的备份数据,将代替Master
工作,不至于集群的数据丢失
- 当集群中的其中一组
Master
和Slave
都不可用的情况下,,Hash-Slots
的分片数据丢失,集群不可用
实战演示