zoukankan      html  css  js  c++  java
  • Redis Cluster 集群节点维护 (三)

    Redis Cluster 集群节点维护:

    集群运行很久之后,难免由于硬件故障,网络规划,业务增长,等原因对已有集群进行相应的调整,比如增加redis nodes 节点,减少节点,节点迁移,更换服务器等
    增加节点和删除节点会涉及到已有槽位的重新分配及数据迁移。

    一 ) Redis Cluster节点添加:

    # 1.1 节点添加环境:
               主从 1       主从 2     主从 3       主从4(待添加) 
    master   10.10.5.11   10.10.5.12  10.10.5.13    10.10.5.17
    slave    10.10.5.15   10.10.5.16  10.10.5.14    10.10.5.18
    
    # 1.2 三个节点的slots区间是:
          节点A覆盖0-5460;
          节点B覆盖5461-10922;
          节点C覆盖10923-16383.
    
    
    # 1.3  
    

    二 ) 集群维护之动态添加节点:

    # 2.1 增加节点需要与之前的redis node 版本相同,配置一致,然后分别启动两台 redis nodes(一主一从). 
    案例:
       因公司业务发展迅猛现有的三主三从 Redis Cluster 架构可能无法满足现有业务的并发写入需求,因此公司采购服务器,需要将它动态添加到集群当中,因为是生产业务的redis cluster 不能影响使用和数据丢失,整体如下:
    
    同步之前redis node 的配置文件到 10.10.5.17 - 18 redis 编译安装目录,注意配置文件的监听ip
    
    # 2.2 提前做好两台主机的redis,安装并启动redis.
        master   10.10.5.17  
        slave    10.10.5.18
        控制节点 10.10.5.11
        
        2.2.1  将17 18两台主机都加入到cluster 集群。
        2.2.2  将18加入17变成slave. (刚加入cluster 两者均为master).
        2.2.3  给新加入的节点(17)分配槽位.
        
    
    # 2.3 在控制节点上操作添加命令:
      # 添加一个node节点, 后面需要跟着集群内的主机(任意一台即可),别忘记加端口号.
     ./redis-trib.rb add-node 10.10.5.17:6379 10.10.5.16:6379
     ./redis-trib.rb add-node 10.10.5.18:6379 10.10.5.16:6379
      
    # 2.4  进入集群内执行命令
      redis-cli  -a 123456 cluster nodes    # 查找一下17和18的ID
      10.10.5.17  390a1809c3312fc3c01ef69382e6836cdbbe8977
      10.10.5.18  bfd4dbea0b85db2895c5152246638832ba1d2ce2
      
      # 在10.10.5.18(slave)上执行命令后面加的是5.17(master)的ID,执行后主从成功创建:
        *** 注意此处的命令需要在新加入cluster内,即将成为从的redis 内执行!***
      cluster replicate 390a1809c3312fc3c01ef69382e6836cdbbe8977   
      
       验证主从是否创建成功:
       [root@srv-1 src]# ./redis-trib.rb info 10.10.5.16:6379
    10.10.5.17:6379 (390a1809...) -> 0 keys | 0 slots | 1 slaves.           # 主上已经显示有了一个slave.
    10.10.5.13:6379 (3a311c96...) -> 0 keys | 5461 slots | 1 slaves.
    10.10.5.15:6379 (761fbb98...) -> 4 keys | 5461 slots | 1 slaves.
    10.10.5.12:6379 (905e3ecb...) -> 1 keys | 5462 slots | 1 slaves.
    [OK] 5 keys in 4 masters.
    0.00 keys per slot on average.
      
      #  重新分配槽位:
       ./redis-trib.rb reshard 10.10.5.11:6379  
       .............省略部分
       M: 390a1809c3312fc3c01ef69382e6836cdbbe8977 10.10.5.17:6379
       slots: (0 slots) master
       1 additional replica(s)
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    How many slots do you want to move (from 1 to 16384)? 4096                  # 要分多少个槽位slots给新的节点. 
    What is the receiving node ID? 390a1809c3312fc3c01ef69382e6836cdbbe8977     # 接收槽位的节点ID(master)。
    Please enter all the source node IDs.                             
      Type 'all' to use all the nodes as source nodes for the hash slots.       # 所有节点匀给新节点
      Type 'done' once you entered all the source nodes IDs.                    # 单个节点ID拿出来给新节点
    Source node #1:all                                                          # 这是新的集群 我就直接ALL,生产环境可能会碰见分配错误.
       .............省略部分 
           Moving slot 1364 from 761fbb98a72600b8322fc34e3b2bbf0adbd3822e
    Do you want to proceed with the proposed reshard plan (yes/no)?             # 确认分配的槽位
    
       ** 从哪些节点上分配槽位给新节点, 数据不多的可以选择all
       ** 会问一些分多少slots给新的节点。 参考 16382 / 4 = 4096个
       
     # 重新分配的时候因为之前在其他老节点添加过数据,所以产生如下问题:
      Moving slot 5798 from 10.10.5.12:6379 to 10.10.5.17:6379:                 # 5799 这个slots这个位置发生了错误.
    [ERR] Calling MIGRATE: ERR Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME | PAUSE | REPLY)
       
      *** 笨点的方法竟然是清除所有数据,如果是生产环境有大量数据 不建议这么操作 *** 
      # 根据提示 5799发生了错误, 看slots数值应该是在B节点上 10.10.5.12 
        redis-cli -h 10.10.5.12 -a 123456 flushall
        redis-cli -h 10.10.5.12 -a 123456 bgsave
      
      # 至此重新执行分配槽位, 不负众望再次出现了错误, 提示需要fix 来修复.(此时如果是生产环境一定要淡定!整个关老爷在边上镇着.)   
      ./redis-trib.rb reshard 10.10.5.11:6379  
      [WARNING] The following slots are open: 5798
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    *** Please fix your cluster problems before resharding
     
     # 修复cluster集群数据:
     ./redis-trib.rb fix 10.10.5.11:6379
     
     .............省略部分
    >>> Check for open slots...
    >>> Fixing open slot 5798
    Set as importing in: 10.10.5.17:6379
    Moving slot 5798 from 10.10.5.12:6379 to 10.10.5.17:6379: 
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
          *** 至此redis cluster 添加节点并分配槽位完成 ***
     
    # 查看最后分配的slots情况:
     [root@srv-1 src]# ./redis-trib.rb info 10.10.5.11:6379
    10.10.5.13:6379 (3a311c96...) -> 0 keys | 5461 slots | 1 slaves.
    10.10.5.15:6379 (761fbb98...) -> 0 keys | 5461 slots | 1 slaves.
    10.10.5.17:6379 (390a1809...) -> 0 keys | 338 slots | 1 slaves.    # 由于分配槽位时发生了错误,导致仅仅分配了338个slots.
    10.10.5.12:6379 (905e3ecb...) -> 0 keys | 5124 slots | 1 slaves.
    [OK] 0 keys in 4 masters.
    0.00 keys per slot on average.
    
    *** 由于分配槽位时发生了错误,导致仅仅分配了338个slots,这在生产环境是绝对不能原谅的, 为了均衡每个机器上的slots数量 可以再次进行重新分配
    *** 生产环境还是 建议一台一台操作 分配每台多余的slots给新加入的节点, 不要用all 这个自动分配的选项. 虽然单台操作比较麻烦,数据无价.
    
    
      # 查看集群节点上的key 和 slots个数:
    [root@srv-1 src]# ./redis-trib.rb info 10.10.5.16:6379
    10.10.5.17:6379 (390a1809...) -> 0 keys | 0 slots | 0 slaves.        # 5.17 没有slots和slave
    10.10.5.13:6379 (3a311c96...) -> 0 keys | 5461 slots | 1 slaves.
    10.10.5.18:6379 (bfd4dbea...) -> 0 keys | 0 slots | 0 slaves.        # 5.18 没有slots和slave
    10.10.5.15:6379 (761fbb98...) -> 4 keys | 5461 slots | 1 slaves.
    10.10.5.12:6379 (905e3ecb...) -> 1 keys | 5462 slots | 1 slaves.
    [OK] 5 keys in 5 masters.
    0.00 keys per slot on average.
    
      # 查看添加到集群内主机的信息,
    [root@srv-1 src]# ./redis-trib.rb check 10.10.5.16:6379
    >>> Performing Cluster Check (using node 10.10.5.16:6379)
    S: 57e6cc3af523aa829705cd0072d6283b988a43c7 10.10.5.16:6379
       slots: (0 slots) slave
       replicates 905e3ecb99a4723b12bb5d7fda91372ee72909be
    M: 390a1809c3312fc3c01ef69382e6836cdbbe8977 10.10.5.17:6379       # 新添加的节点主机
       slots: (0 slots) master                                        # 没有分配任何slots,是个master.
       0 additional replica(s)                                        # 没有主从关系, 没有从库.
    M: 3a311c961450d50f6236d814106fcd0f7723e071 10.10.5.13:6379
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    M: bfd4dbea0b85db2895c5152246638832ba1d2ce2 10.10.5.18:6379      # 新添加的节点主机
       slots: (0 slots) master                                       # 没有分配任何slots,是个master.
       0 additional replica(s)                                       # 没有主从关系, 没有从库.
    S: bad22bcf6c5c42b13c3692c4d1cfcbde7fd7ce14 10.10.5.14:6379
       slots: (0 slots) slave
       replicates 3a311c961450d50f6236d814106fcd0f7723e071
    M: 761fbb98a72600b8322fc34e3b2bbf0adbd3822e 10.10.5.15:6379
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    M: 905e3ecb99a4723b12bb5d7fda91372ee72909be 10.10.5.12:6379
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: 291faee66636effee60e8409894a4ebae40fe4a6 10.10.5.11:6379
       slots: (0 slots) slave
       replicates 761fbb98a72600b8322fc34e3b2bbf0adbd3822e
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    
    
  • 相关阅读:
    IIS常见500错误解决方案
    发送邮件代码
    IIS站点/虚拟目录中访问共享目录(UNC)
    简简单单,一目了然C#与Matlab
    [转载]C#——DataGridView分页功能的实现
    博客之旅
    ASP.Net, Php , Java/Java EE?好困惑
    【转载】DataGridView中虚拟模式(Virtual Mode)用法
    selenium4.0降级为3版本
    web自动化中影响页面定位的场景有哪些?
  • 原文地址:https://www.cnblogs.com/zhenxing06/p/12860037.html
Copyright © 2011-2022 走看看