SpringCloud-高级篇(十三)

SpringCloud-高级篇(十三)_第1张图片

前面的主从集群可以应对Redis高并发读的问题,Redis主从之间可以做同步,为了提高主从同步时的性能,单节点Redis的内存不要设置太高,如果内存占用过多,做RDB的持久化,或者做全量同步的时候,导致大量的IO性能会有一定的下降, 如果单节点Redis的内存降低了,比如说只能存10g,20g,那么有海量的数据要存储的时候改怎么办?这个问题解决不了,虽然应对高并发读的问题,如果我写的问题高并发也挺高,该怎么办,这就需要Redis的分片集群来解决

(1)搭建分片集群

需要有多个master,每个master都可以写,并发写的问题就可以保障了,每个master存储10g,好几个master加起来,内存就扩大了,数据存储的上限,取决于master的数量,理论上就能应对海量数据存储的问题 

每个master可以有多个slave节点,每个master可以形成主从关系,就能实现高并发读,具备的主从集群的特性了 

master之间有心跳,原来主从需要做哨兵,现在不需要做哨兵了,master之间互相起到哨兵的效果,通过心跳互相监控,多个master对一个master主观下线,也会把它做到可观下线,也可以做主从的切换,类似哨兵的功能,Redis客户端,可以访问集群中的任意节点,这些节点之间可以自动做路由,把你的请求路由到正确的节点上去访问,所以就不在需要哨兵机制了,同时具备的哨兵机制的所有功能,这就是分片集群的结构

SpringCloud-高级篇(十三)_第2张图片

SpringCloud-高级篇(十三)_第3张图片

SpringCloud-高级篇(十三)_第4张图片

SpringCloud-高级篇(十三)_第5张图片

SpringCloud-高级篇(十三)_第6张图片

准备多个配置文件 

SpringCloud-高级篇(十三)_第7张图片

SpringCloud-高级篇(十三)_第8张图片

查看启动状态:SpringCloud-高级篇(十三)_第9张图片

SpringCloud-高级篇(十三)_第10张图片

SpringCloud-高级篇(十三)_第11张图片

SpringCloud-高级篇(十三)_第12张图片

SpringCloud-高级篇(十三)_第13张图片

SpringCloud-高级篇(十三)_第14张图片

输入yes回车

SpringCloud-高级篇(十三)_第15张图片

SpringCloud-高级篇(十三)_第16张图片

SpringCloud-高级篇(十三)_第17张图片

(2)散列插槽

slots叫做散列插槽

SpringCloud-高级篇(十三)_第18张图片

数据为什么跟插槽绑定而不是跟节点绑定,如果数据跟节点绑定,因为Redsi的主节点可能出现宕机的情况的,或者是集群扩容增加了节点,或者是删除了节点,如果节点删除了,或者宕机了数据就跟着丢了,如果跟插槽绑定,当节点宕机时,我们可以这个节点对应的插槽,转移到活着的节点

集群扩容时,我们也可以将插槽进行转移,数据跟着插槽走,永远就能找到数据的位置

集群模式下启动客户端需要加-c的参数

SpringCloud-高级篇(十三)_第19张图片

存储num的话算出的slot值是2765正好在7001分配的插槽内,正好存到这里

当存储a算出的是slot值在7003分配的插槽内,它会重定向到7003进行存储,并且只能在7003获取到这个值,在7003是获取不到num的值的它需要重定向到7001获取

SpringCloud-高级篇(十三)_第20张图片

所以我们说啊你访问集群中的任意一个节点都没有问题,它都可以显示这种重定向

SpringCloud-高级篇(十三)_第21张图片

{}为有效部分,为了让数据存储到一个插槽,可以把{}设为一样,后面的不一样,这样的key就可以存储到同一个Redis实例

SpringCloud-高级篇(十三)_第22张图片

(3)集群伸缩

作为分片集群有一个非常重要的功能,就是集群伸缩,就是集群可以动态的增加节点,或者是移出节点

SpringCloud-高级篇(十三)_第23张图片

添加集群节点帮助文档:

SpringCloud-高级篇(十三)_第24张图片

num存储在的插槽在7001,所以需要把7001的插槽分配到7004上

SpringCloud-高级篇(十三)_第25张图片

修改配置文件 

SpringCloud-高级篇(十三)_第26张图片

添加新节点7004到集群 后面的ip是集群中存在的一个ip端口

SpringCloud-高级篇(十三)_第27张图片

查询集群状态:但是7004是没有插槽的 

SpringCloud-高级篇(十三)_第28张图片

需要把num   2765的插槽分配到7004 

SpringCloud-高级篇(十三)_第29张图片

插槽的分配:把7001上的插槽分配到7004

移动2765的曹操移动过去,或者直接移动3000

SpringCloud-高级篇(十三)_第30张图片

那个曹的id7001的 id,然后done

SpringCloud-高级篇(十三)_第31张图片

输入yes 

SpringCloud-高级篇(十三)_第32张图片

查看发现7004有了插槽:

SpringCloud-高级篇(十三)_第33张图片

此时就可以在7004进行存储获取num

SpringCloud-高级篇(十三)_第34张图片

SpringCloud-高级篇(十三)_第35张图片

(4)故障转移

分片集群虽然没有哨兵但是也具备故障转移的功能

自动故常转移 

SpringCloud-高级篇(十三)_第36张图片

上面我们已经删除了7004节点:

我们让7002master宕机

SpringCloud-高级篇(十三)_第37张图片

发现8003变成主了 

SpringCloud-高级篇(十三)_第38张图片

重新启动7002就变成slave了:就实现了主从的切换

SpringCloud-高级篇(十三)_第39张图片

我们并不需要哨兵,Redis分片集群,具备主从的故障切换

SpringCloud-高级篇(十三)_第40张图片

手动故障转移 

这是自动的故障转移,有时候我们需要手动的进行主从切换,比如说这个机器比较老旧了,需要维护了,这个时候我们可以启动一个新的节点,让他称为7001的slave,然后手动的让它替换7001,实现手动故障转移

SpringCloud-高级篇(十三)_第41张图片

SpringCloud-高级篇(十三)_第42张图片

SpringCloud-高级篇(十三)_第43张图片

SpringCloud-高级篇(十三)_第44张图片

(5)RedisTemplate访问分片集群

我们最终还是使用java代码访问分片集群的,配置根集群的配置一样,这里只要改变分片集群的ip配置

SpringCloud-高级篇(十三)_第45张图片

SpringCloud-高级篇(十三)_第46张图片 

 

SpringCloud-高级篇(十三)_第47张图片

SpringCloud-高级篇(十三)_第48张图片

查询:

SpringCloud-高级篇(十三)_第49张图片

SpringCloud-高级篇(十三)_第50张图片

set:他应该去找7001存取

SpringCloud-高级篇(十三)_第51张图片

SpringCloud-高级篇(十三)_第52张图片

换一个值:

SpringCloud-高级篇(十三)_第53张图片

它存取找的是7003节点:对应的插槽

SpringCloud-高级篇(十三)_第54张图片

所以集群的自动切换,插槽路由啊,读写分离都实现了。

 

你可能感兴趣的:(spring,cloud,spring,后端)