第五节: Redis架构演变历程和cluster集群模式架构的搭建

一. 铺垫

1. 为什么要用服务器集群

(1). 分摊客户端的压力,提高服务器效率。(高并发)

(2). 解决单点故障问题,即删除服务器节点或者增加服务器节点都不影响使用。(高可用)

2. 集群的类型 

(1). 对称集群:各个集群实例角色的地位相同。(数据计算)

(2). 非对称集群:各个集群实例角色的地位不相同。(数据存储)

下图:秒杀集群是对称集群,DB集群是非对称集群。

 

二. 演变历程

第一代:简单的主从复制,读写分离

  一个主服务器(master)对应多个从服务器(slaver),主从之间实现数据同步,主服务器负责【写】,从服务器负责【读】。

 

 

 分析:主服务器master宕机了,从服务器也跟着就挂了。

第二代:哨兵模式

  在Redis3.0之前的版本,要实现集群一般是借助哨兵(sentinel工具)监视master节点的状态,如果master挂机, 其中一个slaver会顶上去,顶替master使用,哨兵模式的配置略微复杂,并且性能和高可用性等方面表现一般,特别是主从切换的瞬间存在 访问瞬断 的问题。

 

 

分析:

  虽然解决了第一代中主挂全挂的问题,但所有的写压力都在一个master上,且宕机的时候,slaver顶上去的这个切换期间,整个服务停止,从而影响项目的正常运行。而且就一个master,单个节点的极限并发也就10万左右了。

第三代:Cluster

  该模式是由多个主从节点群组成的分布式服务集群,它具有复制、高可用和分片特性。Redis集群不需要Sentinel哨兵也能完成节点移除和故障转移工作。需要将每个节点设置成集群模式,这种集群没有中心节点,可水平扩展,根据官方文档成可以线性扩展到1000个节点,redis集群的性能和高可用性均优于之前的哨兵模式,且集群的配置非常简单。

 

 分析:多个master平行节点,分摊了写的压力,且无论是master还是slave水平都可以扩展很多,另外即使单个的master-slave故障或者瞬断,那么新的请求来了,也不会分发到这个节点上。

 

三. Cluster模式搭建 

1. 需要准备的东西

(1). redis

(2). redis集群搭建工具:redis-trib.rb  (类似IIS协调调度)

(3). Ruby的运行环境

(4). Ruby环境下redis驱动:redis-3.2.2.gem  (好比C#通过ADO.NET访问SQLServer)

补充对应的下载地址:

  下载Redis安装文件:https://github.com/MSOpenTech/redis/releases/,Redis提供msi和zip格式的下载文件,这里下载zip格式Redis-x64-3.2.100版本。

  下载Ruby运行环境文件:http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.2.4-x64.exe

  下载Ruby环境下Redis驱动:https://rubygems.org/gems/redis/versions/3.2.2,考虑到兼容性,这里下载的是3.2.2版本

  下载Redis集群工具redis-trib.rb,路径如下:https://github.com/beebol/redis-trib.rb

2. 搭建步骤

(1). 配置Reids集群

  准备六个配置文件【redis.6380.conf】【redis.6381.conf】【redis.6382.conf】【redis.6383.conf】【redis.6384.conf】【redis.6385.conf】,拷贝到Redis文件夹中。然后通过cmd命令【redis-server.exe redis.6380.conf】【redis-server.exe redis.6381.conf】【redis-server.exe redis.6382.conf】【redis-server.exe redis.6383.conf】【redis-server.exe redis.6384.conf】【redis-server.exe redis.6385.conf】,进行启动。

 

启动成功后,发现文件夹中多了12个文件,如下图:

分析配置文件中的内容:以【redis.6380.conf】为例

  port 6380                                                       #端口号

  appendonly yes                                             #数据的保存为aof格式

  appendfilename "appendonly.6380.aof"        #数据保存文件

  cluster-enabled yes                                        #是否开启集群

  cluster-config-file nodes.6380.conf                #集群节点配置文件

  cluster-node-timeout 15000                           #集群节点的超时时间

  cluster-slave-validity-factor 10                       #校验从节点是否可以进行主从复制,校验10次

  cluster-migration-barrier 1                              #配置数据转移

  cluster-require-full-coverage yes                    #主从节点全量复制

PS:

  这里6个配置文件是平行关系的,配置级别都一样,主从关系是在下面【redis-trib.rb】配置哦。

  这里要求最少得配置3个主master,不能低于3个,有没有从 无要求。

(2). 安装ruby运行环境

  (rubyinstaller-2.2.4-x64.exe)注意勾选后两个,让其自动配置环境变量,最终安装在这个这个文件夹中【Ruby22-x64】

(3). 安装驱动

  进入ruby运行环境的文件夹中【Ruby22-x64】中,进入命令行模式,安装Redis的驱动 【gem install --local C:\Users\DELL\Desktop\redis-cluster\redis-3.2.2.gem】

(4). 利用 redis-trib.rb 进行集群的协调配置

  进入它所在的文件夹cmd命令行,进行集群的配置,指令:【redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385】,这里的 replicas 1,1代表1个master对应1个slave,改为2,则代表1个master对应2个slave。

 

PS:其它指令

  create:创建集群

  check:检查集群

  info:查看集群信息

  fix:修复集群

  reshard:在线迁移slot

  rebalance:平衡集群节点slot数量

  add-node:将新节点加入集群

  del-node:从集群中删除节点

  set-timeout:设置集群节点间心跳连接的超时时间

  call:在集群全部节点上执行命令

  import:将外部redis数据导入集群

问题:我最后配置完了,我写的时候访问哪个?

答案:以上主节点访问访问任何一个都可以,进到redis集群中,会根据负载均衡算法自动进行分发到某个节点上。

3. 测试

(1). 在6380节点进行输入 userName的值为 ypf1, 则6个节点都能获取到数据。

   等等,不一一截图了。

(2). 在6385节点输入age的值为10,则6个节点中都能获取到数据。

 

 总结:无论是master节点还是slave节点写入数据,所有节点都能读取到数据,这里测试使用指令测试,不要用可视化工具直接看,有延迟有缓存不准确哦。

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2020-03-05 08:15  Yaopengfei  阅读(743)  评论(1编辑  收藏  举报