• 第六节:Redis Cluster搭建详解和集群运维(节点、槽位等)


    一. Cluster搭建

    1. 事先准备

    (1). 服务器环境:Centos8

    (2). Redis环境:安装redis5.0版本

    PS: 在redis 5.0之前,redis cluster的搭建需要借助Ruby环境,使用redis-trib指令进行集群的管理,redis5.0以后,redis已经内置了集群管理,使用redis-cli客户端指令就可以进行集群的搭建和管理了。

    (3). 准备好6个配置文件,对应端口分别为6379、6380、6381、6382、6383、6384,为了方便启动管理,我们根据端口号建立6个不同的文件夹,同时把redis-server服务端程序也分别copy到对应的文件夹下,方便启动。

    PS:我们可以在window下进行这一步,然后再copy到Linux系统,另外redis cluster对应的配置修改如下:

    # 一. 允许远程访问
    #1. 注释掉下面代码,或者改为 bind 0.0.0.0
    #bind 127.0.0.1 
    #2. 关闭保护模式
    protected-mode no
    
    #二. 通用配置
    #1. 开启守护进程
    daemonize yes
    #2. 配置密码(必须设置相同的密码,不设masterauth的话宕机了不能自动恢复)
    requirepass 123456
    #集群节点间的访问密码 masterauth 123456 #三.集群配置 port 6384 #配置端口 cluster-enabled yes #开启集群 cluster-config-file nodes-6384.conf #集群节点配置文件 pidfile /var/run/redis_6384.pid cluster-node-timeout 5000 #集群节点超时时间,超过这个时间,集群认为该节点故障,如果是主节点,会进行相应的主从切换

    如图:

    2. 搭建步骤

    (1). 将准备好的6个节点文件夹都copy到Centos下的redis-cluster文件夹内,执行下面的启动指令。

    PS:由于是从windows中copy进来的,所以第一次启动需要授权一下,后续再启动则不需要。

     

    启动指令(第一次需要授权一下)

    cd /root/redis-cluster/6379 &&chmod 777 redis-server&& ./redis-server redis.conf
    cd /root/redis-cluster/6380 &&chmod 777 redis-server&& ./redis-server redis.conf
    cd /root/redis-cluster/6381 &&chmod 777 redis-server&& ./redis-server redis.conf
    cd /root/redis-cluster/6382 &&chmod 777 redis-server&& ./redis-server redis.conf
    cd /root/redis-cluster/6383 &&chmod 777 redis-server&& ./redis-server redis.conf
    cd /root/redis-cluster/6384 &&chmod 777 redis-server&& ./redis-server redis.conf

    后续启动指令(不需要授权) 

    cd /root/redis-cluster/6379 && ./redis-server redis.conf &&
    cd /root/redis-cluster/6380 && ./redis-server redis.conf &&
    cd /root/redis-cluster/6381 && ./redis-server redis.conf &&
    cd /root/redis-cluster/6382 && ./redis-server redis.conf &&
    cd /root/redis-cluster/6383 && ./redis-server redis.conf &&
    cd /root/redis-cluster/6384 && ./redis-server redis.conf

    通过配置集群后,启动的redis实例后面有(cluster),如下图:

     

    (2). 回到redis安装目录下,执行集群构建指令(如果没有密码,则不需要 -a 123456,cluster最低要求3个主节点)

    ./redis-cli  -a 123456 --cluster  create 192.168.137.202:6379 192.168.137.202:6380 192.168.137.202:6381 192.168.137.202:6382 192.168.137.202:6383 192.168.137.202:6384 --cluster-replicas 1

    输入yes,确定集群关系的建立。

    如下图:

    (3). 连接到集群上(任何一个节点即可),进行集群信息的查看

    ./redis-cli -c -h 192.168.137.202 -p 6380 -a 123456

     如下图,连接成功:

    查看节点信息:cluster nodes

    查看集群信息:cluster info

    特别注意:

     这里是在一台服务器部署的,所以各个redis实例之间是可以相互通信的,如果是多服务部署cluster,除了保证redis基础端口开发,还要保证cluster的通信端口开放,即 通信端口=基础端口号 + 10000 。

     (通信流程详见:https://www.cnblogs.com/yaopengfei/p/13884649.html)

    3.上述指令总结

    (1). 构建集群

    # 无密码 (--cluster-replicas 1 表示1个master对应1个从,如果是2,则表示1个master对应2个slave)
    ./redis-cli --cluster create 192.168.137.201:6379 192.168.137.201:6380 192.168.137.201:6381 192.168.137.201:6382 192.168.137.201:6383 192.168.137.201:6384 --cluster-replicas 1 
    #有密码
    ./redis-cli  -a 123456 --cluster  create 192.168.137.201:6379 192.168.137.201:6380 192.168.137.201:6381 192.168.137.201:6382 192.168.137.201:6383 192.168.137.201:6384 --cluster-replicas 1

    (2). 连接与退出

    #连接(cluster连接必须加 -c)
    ./redis-cli -c -h 192.168.137.201 -p 6380 -a 123456
    #退出
    exit

    (3). 查看节点

    cluster nodes

    (4). 查看集群信息

    cluster info

    (5). 查看槽位信息

    cluster slots

    (6).查看某个节点信息

    ./redis-cli -h 192.168.137.201 -c -p 6384 info replication

    (7). 计算某个key的槽位

    cluster keyslot xxx

    (8). 查看redis进程

    ps -ef|grep redis

    (9). 关闭redis

    #关闭redis
    ./redis-cli shutdown
    #直接杀死
    kill -p pid

    4. 测试

    (1). 挂掉1个主节点,看从节点是否会变为主节点顶替上去? 然后再把重启刚才的挂掉的节点,看集群情况?

    6384 节点是 6381的从节点,挂掉6381节点,发现6384变为了主节点。

    重新启动6381,发现6381变成了6384的从节点了。 

    二. 集群运维(节点、槽位)

     通过./redis-cli --cluster help 查看命令帮助大全。

    redis-cli --cluster help
    Cluster Manager Commands:
      create         host1:port1 ... hostN:portN   #创建集群
                     --cluster-replicas <arg>      #从节点个数
      check          host:port                     #检查集群
                     --cluster-search-multiple-owners #检查是否有槽同时被分配给了多个节点
      info           host:port                     #查看集群状态
      fix            host:port                     #修复集群
                     --cluster-search-multiple-owners #修复槽的重复分配问题
      reshard        host:port                     #指定集群的任意一节点进行迁移slot,重新分slots
                     --cluster-from <arg>          #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入
                     --cluster-to <arg>            #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入
                     --cluster-slots <arg>         #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。
                     --cluster-yes                 #指定迁移时的确认输入
                     --cluster-timeout <arg>       #设置migrate命令的超时时间
                     --cluster-pipeline <arg>      #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10
                     --cluster-replace             #是否直接replace到目标节点
      rebalance      host:port                                      #指定集群的任意一节点进行平衡集群节点slot数量 
                     --cluster-weight <node1=w1...nodeN=wN>         #指定集群节点的权重
                     --cluster-use-empty-masters                    #设置可以让没有分配slot的主节点参与,默认不允许
                     --cluster-timeout <arg>                        #设置migrate命令的超时时间
                     --cluster-simulate                             #模拟rebalance操作,不会真正执行迁移操作
                     --cluster-pipeline <arg>                       #定义cluster getkeysinslot命令一次取出的key数量,默认值为10
                     --cluster-threshold <arg>                      #迁移的slot阈值超过threshold,执行rebalance操作
                     --cluster-replace                              #是否直接replace到目标节点
      add-node       new_host:new_port existing_host:existing_port  #添加节点,把新节点加入到指定的集群,默认添加主节点
                     --cluster-slave                                #新节点作为从节点,默认随机一个主节点
                     --cluster-master-id <arg>                      #给新节点指定主节点
      del-node       host:port node_id                              #删除给定的一个节点,成功后关闭该节点服务
      call           host:port command arg arg .. arg               #在集群的所有节点执行相关命令
      set-timeout    host:port milliseconds                         #设置cluster-node-timeout
      import         host:port                                      #将外部redis数据导入集群
                     --cluster-from <arg>                           #将指定实例的数据导入到集群
                     --cluster-copy                                 #migrate时指定copy
                     --cluster-replace                              #migrate时指定replace
      help           
    
    For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
    View Code

    参考:https://www.cnblogs.com/zhoujinyi/p/11606935.html

    几个关键点:

      当被删除掉的节点重新起来之后不能自动加入集群,但其和主的复制还是正常的,也可以通过该节点看到集群信息(通过其他正常节点已经看不到该被del-node节点的信息)。

      如果想要再次加入集群,则需要先在该节点执行cluster reset,再用add-node进行添加,进行增量同步复制。

    1.  目标

     (1). 向已有的redis cluster中添加两个新节点 6385 和 6386,其中6385为主节点,并给6385分配1000个槽位(这1000个槽位随机从其他主节点中抽取),然后将6386为6385的从节点。

     (2). 删除6386这个从节点,然后删除6385这个主节点(删除主节点前,先把主节点上的槽位还给6379节点)。

    2. 事先准备

     (1). 将redis cluster环境搭建好,3主3从,端口依次为:6379-6384,主从关系如下图:

      (2). 准备好6385 和 6386 的服务和配置文件,然后copy到对应目录下。(配置文件详见上面搭建过程的配置的修改)

    3.  步骤

    (1). 启动6385 和 6386这两个服务

    (第一次需要授权一下).

    cd /root/redis-cluster/6385 &&chmod 777 redis-server&& ./redis-server redis.conf
    cd /root/redis-cluster/6386 &&chmod 777 redis-server&& ./redis-server redis.conf

    (2). 配置6385为主节点

      使用add-node命令新增一个主节点6385(master),前面的ip:port为新增节点,后面的ip:port为已知存在节点,看到日志最后有"[OK] New node added correctly"提示代表新节点加入成功 。(下面指令要手敲,复制进去可能不识别)

    cd /root/redis
    ./redis-cli -a 123456 --cluster add-node 192.168.137.202:6385 192.168.137.202:6379

     查看集群状态:6385已经添加进去了,但是并没有分配槽位。

     注:新加进去的节点默认都为master主节点。

    (3). 为6385分配1000个槽位

    A. 找到集群任何一个主节点(这里用6380吧),然后对其进行分片操作。

    ./redis-cli -a 123456 --cluster reshard 192.168.137.202:6380

    B. 进入提示流程:

    How many slots do you want to move (from 1 to 16384)?   (移动多少个槽位)

    输入:1000

    What is the receiving node ID?  (输入接收槽位的节点ID)

    输入6385对应的ID:d282c41660c14959195bb0a4c4c8a61a0d6be0fc 

    Source node #1:

    输入:all (代表从所有主节点中随机获取1000个槽位,这里也可以输入某个主节点的id,则表示从该主节点拿1000个槽位进行分配,如果输入某个主节点id,下面还会有一步骤,输入目标节点的id,选择all,则没有)

    Do you want to proceed with the proposed reshard plan (yes/no)?  (是否开始执行迁移)

    输入:yes

    C. 查看集群状态:6385节点被随机分配了1000个槽位。

    (4). 配置6386为6385的从节点

     A. 先将6386节点添加进去

    ./redis-cli -a 123456 --cluster add-node 192.168.137.202:6386 192.168.137.202:6379

     查看集群状态:,默认是加进去都是称为matser节点

    B. 先连接到6386这个节点上,然后运行指令让其称为6385的从节点 (下面replicate后面的是6385的节点ID)

     ./redis-cli -c -h 192.168.137.202 -p 6386 -a 123456
     cluster replicate d282c41660c14959195bb0a4c4c8a61a0d6be0fc

    查看集群状态:6386已经成为6385的从节点了 

    (5). 删除6386这个从节点

     运行下面指令(redis.cli 在redis安装目录下的),指定删除的ip加端口,6386节点的id

     ./redis-cli -a 123456 --cluster del-node 192.168.137.202:6386 84686cb24cfe4ae37e13bcb7013d24e9f81a83cb

     查看节点状态:6386节点已经被移除

     注意:从节点不涉及槽位的问题,可以直接被删除

    (6). 删除6385这个主节点

    注:主节点上有槽位,删除前必须先把槽位迁移,这里我们把6385上的1000个槽位统一移到6379节点上(这里只能全部移动到一个固定节点上)。

    A.  运行下面指令 (这里可以随意一个端口)

    ./redis-cli -a 123456 --cluster reshard 192.168.137.202:6385

    B. 进入提示流程:

    How many slots do you want to move (from 1 to 16384)?   (移动多少个槽位)

    输入:1000

    What is the receiving node ID?  (输入接收槽位的节点ID  这里输入6379)

    输入6379对应的ID:xxxx

    Source node #1:    (表示从哪个节点迁移,这里输入6385节点的id)

    输入:d282c41660c14959195bb0a4c4c8a61a0d6be0fc

    Source node 2:  (输入done,开始生成迁移计划)

    输入:done

    Do you want to proceed with the proposed reshard plan (yes/no)?  (是否开始执行迁移)

    输入:yes

     

     C. 查看节点情况:6385节点已经没有槽位了

     D. 删除6385节点

      运行下面指令(redis.cli 在redis安装目录下的),指定删除的ip加端口,6385节点的id

     ./redis-cli -a 123456 --cluster del-node 192.168.137.202:6385 d282c41660c14959195bb0a4c4c8a61a0d6be0fc

    E. 查看集群情况,6385节点已经被移除了 

    !

    • 作       者 : Yaopengfei(姚鹏飞)
    • 博客地址 : http://www.cnblogs.com/yaopengfei/
    • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    第35条:注解优先于命名模式
    Apache Shiro入门实例
    第34条:用接口模拟可伸缩的枚举
    Lua数组排序
    C++多态性的理解
    爱推软件
    VMProtect使用小计【一】
    android软件开发之webView.addJavascriptInterface循环渐进【二】
    cocos2dx如何添加popScene的场景动画
    Cocos2d-x 3.0 cocostudio骨骼动画的动态换肤
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/13856347.html
Copyright © 2020-2023  润新知