redis cluster 集群畅谈(二)
上一篇http://www.cnblogs.com/qinyujie/p/9029482.html, 主要讲解 redis cluster 集群 搭建,本篇主要讲解实验多master写入、读写分离、实验自动故障切换(高可用性),下面直接开始吧。
上一篇我们搭建完了redis cluster 集群,下面进行数据存储测试
多master写入 - 海量数据的分布式存储
当我们set 数据的时候会发现如下图问题:
多master写入数据问题
通过上图发现,当插入key1、key2、key3 时报错,它要求我们到相应的master 节点去进行写入,没错,这就是多master写入,以上就验证了,实际的数据写入是要到相应的master 进行操作的,每个master 都可以计算,然后将请求转发至真正的操作节点进行。
根据上图redis 切换到 192.168.43.17:7003 进行key1 1 的写入,如下图
move err
总结:redis cluster写入数据的时候,可以将请求发送到任意一个master上去执行,但是每个 master 都会计算这个 key 对应的 CRC16 值,然后对16384个 hashslot 取模,找到 key 对应的 hashslot,根据 hashslot 寻找对应的master。如果对应的master就在自己本地的话,set key4 4,key4 这个 key 对应的 hashslot 就在自己本地,那么自己就进行写入了。但是如果计算出来的 hashslot 在其他 master 上,那么就会给客户端返回一个 moved error,告诉你,你得到哪个 master 上去执行这条写入的命令。
多master的写入保持每个master都可以进行数据的写入,每条数据只能存在于一个 master 和相应的 slave 上,每条数据只能由对应的 master 负责。
上面说了,每次写入一条数据,如果不在本地 master ,还需要手动切换到对应的master 上去执行,这就相当麻烦了。能不能将手动的方式交给redis 自动切换执行呢 ?
redis-cli -h 192.168.43.16 -p 7001 -c // -c 表示将数据写入move err 手动切换的方式让 redis 自身自动去做
move err redis 自动切换
上图可以看出,redis 做了redirected 重定向,读取数据也是一样的。
slave数据读取 - 读写分离
前面说过,redis cluster 支持读写分离,实际上这个概念在cluster 中已经不是那么重要了,因为水平扩容(多master就已经解决或者实现了 redis replication 主从架构 一主多从的读写分离效果),我们在生产环境中都会发现,直接使用 master 进行读写了。当然redis cluster 还是支持 slave 读的(默认是不支持slave节点读,在读的时候我们需要先执行下 readonly
,如下图所示:
- 先看下 192.168.43.16:7001 对应的 slave 是啥
查看 info Replication 信息
- 192.168.43.16:7002 slave 上读取数据
slave 读取 master 写入的数据
上图可以看出,redis cluster 默认slave 也是不能读的,如果要读取,需要执行 readonly
,就可以了。
注意:在redis cluster的核心的理念里,slave 主要是用做高可用的,每个master挂一两个slave,主要是做数据的热备,还有master故障时的主备切换,实现高可用的。
自动故障切换 - 高可用性
查看集群信息
redis-trib.rb check 192.168.43.16:7001
下面我们来测试将 192.168.43.16:7001 master kill 掉,看看 192.168.43.16:7002 slave 是否自动切换为master,如下图所示:
kill 前
kill 后
192.168.43.16:7001 重新启动后,变为了 slave
通过上图可以看出,redis cluster 集群自身具备了redis repliction + sentinal 哨兵 的故障切换功能,从而实现了高可用性。