zoukankan      html  css  js  c++  java
  • 第五节: 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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    366. Find Leaves of Binary Tree输出层数相同的叶子节点
    716. Max Stack实现一个最大stack
    515. Find Largest Value in Each Tree Row查找一行中的最大值
    364. Nested List Weight Sum II 大小反向的括号加权求和
    156. Binary Tree Upside Down反转二叉树
    698. Partition to K Equal Sum Subsets 数组分成和相同的k组
    244. Shortest Word Distance II 实现数组中的最短距离单词
    187. Repeated DNA Sequences重复的DNA子串序列
    java之hibernate之基于主键的双向一对一关联映射
    java之hibernate之基于主键的单向一对一关联映射
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/12418227.html
Copyright © 2011-2022 走看看