• 第五节: 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:UsersDELLDesktop edis-cluster edis-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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    jQuery基础之让出$,与其他库共存
    什么是闭包
    绑定repeater时三目运算加特殊结果处理
    将同一张表出来的两部分内容再合成一张表
    后台往前台写弹窗代码不显示
    固定行列转换加分段统计
    js调用后台方法(如果你能容忍执行的后台方法变成一个常量)
    javascript遍历数组
    基于SpringMVC框架使用ECharts3.0实现折线图,柱状图,饼状图,的绘制(上篇)
    echarts
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/12418227.html
Copyright © 2020-2023  润新知