3. Redis集群部署

集群环境搭建

  • 集群拓扑图

    img

  • Redis服务器IP地址及端口规划

    # 也可以不修改Redis服务的端口,这里为了区分
    - client		192.168.4.10		无
    - MGM(admin)	192.168.4.9			无
    - redisA		192.168.4.11		6301
    - redisB		192.168.4.12		6302
    - redisC		192.168.4.13		6303
    - redisD		192.168.4.14		6304
    - redisE		192.168.4.15		6305
    - redisF		192.168.4.16		6306
    
  • 安装配置Redis服务(这里以一台为例)

    [root@node1 ~]# rpm -q gcc || yum -y install gcc
    
    [root@node1 ~]# tar -xf redis-4.0.8.tar.gz 
    [root@node1 ~]# cd redis-4.0.8/
    [root@node1 redis-4.0.8]# make && make install
    [root@node1 redis-4.0.8]# ./utils/install_server.sh
    
    [root@node1 redis-4.0.8]# /etc/init.d/redis_6379 stop
    [root@node1 redis-4.0.8]# vim /etc/redis/6379.conf 
    70 bind 192.168.4.11
    93 port 6301
    
    [root@node1 redis-4.0.8]# /etc/init.d/redis_6379 start
    [root@node1 redis-4.0.8]# /etc/init.d/redis_6379 stop
      
    [root@node1 redis-4.0.8]# ss -ntulp | grep :6303
    [root@node1 redis-4.0.8]# redis-cli -h 192.168.4.13 -p 6303
    
  • 测试

    # 有数据的Redis服务器,需要清空所有数据后才能配置集群(配置Redis集群时,服务器上不能有数据)
    	- flushall
    	- save
    
    [root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301		# 防止意外,对每台服务器进行连接,进行检查
    192.168.4.11:6301> keys *
    192.168.4.11:6301> flushall
    192.168.4.11:6301> save
    

创建Redis集群

  • 在所有集群主机上运行Redis服务

    # 略
    
  • 在所有主机上启用集群功能

    • 启用集群功能(这里以其中一台node1为例,手动开启所有的节点的集群功能)

      [root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301 shutdown
      
      [root@node1 ~]# vim /etc/redis/6379.conf
      # 分别在815 823 829行
      cluster-enabled yes
      cluster-config-file nodes-6379.conf
      cluster-node-timeout 5000
      
      [root@node1 ~]# /etc/init.d/redis_6379 start
      
    • 查看服务信息

      # 查看端口信息,集群的通信端口号是Redis服务端口号+10000
      [root@node1 ~]# ss -ntulp | grep redis-server
      tcp    LISTEN    0     128    192.168.4.11:6301       *:*     users:(("redis-server",pid=59905,fd=6))
      tcp    LISTEN    0     128    192.168.4.11:16301      *:*     users:(("redis-server",pid=59905,fd=8))
      
      [root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301
      192.168.4.11:6301> cluster info		# 查看集群信息
      
      [root@node1 ~]# cat /var/lib/redis/6379/nodes-6379.conf 
      
  • 配置管理主机

    Redis管理主机可以部署在任意一台Redis服务器上,也可以单独部署在一台服务器上
    redis集群管理脚本在Redis软件包源码中
      - ./redis-4.0.8/src/redis-trib.rb
    
    [root@admin ~]# ls
    redis-3.2.1.gem  redis-4.0.8.tar.gz
    
    # redis-3.2.1.gem 是实现ruby语言和Redis通信的一个第三方组件
    
    • 部署Ruby脚本运行环境

      [root@admin ~]# yum -y install ruby
      
      [root@admin ~]# which gem
      /usr/bin/gem		# gem指令由rubygems包提供,没有的话,需要手动安装
      [root@admin ~]# gem install redis-3.2.1.gem
      
    • 创建管理集群脚本

      [root@admin ~]# tar -xf redis-4.0.8.tar.gz 
      [root@admin ~]# cd redis-4.0.8/src/
      [root@admin src]# ls *.rb
      redis-trib.rb
      
      # 将脚本文件拷贝到bin目录下,方便操作
      [root@admin ~]# mkdir /root/bin		
      [root@admin ~]# cp ./redis-4.0.8/src/redis-trib.rb /root/bin/
      
      [root@admin ~]# redis-trib.rb help
      
  • 创建集群

    • 创建集群

      redis-trib.rb <command> <options> <arguments ...>
      - create				# 创建集群
      - check					# 检查集群
      - info					# 查看集群信息
      - reshard				# 重新分片
      - del-node				# 删除主机
      - add-node				# 添加master主机
      - add-node --slave		# 添加slave主机
      - rebalance				# 平均分配hash slots
      
      [root@admin ~]# redis-trib.rb create --replicas 1 192.168.4.11:6301 192.168.4.12:6302 192.168.4.13:6303 192.168.4.14:6304 192.168.4.15:6305 192.168.4.16:6306
        [OK] All nodes agree about slots configuration.
        [OK] All 16384 slots covered.
      
      # --replicas 1 定义每天主库从库的个数;为1的话 1主一从,需要6台,为2,一主2从,需要九台
      # 默认集群有3个主库,只有主库最少为3时,才能达到高可用
      
    • 查看集群信息

      • 在管理主机上查看集群信息

        [root@admin ~]# redis-trib.rb info 192.168.4.11:6301
          192.168.4.11:6301 (badb9cd8...) -> 0 keys | 5461 slots | 1 slaves.
          192.168.4.12:6302 (5846e7fa...) -> 0 keys | 5462 slots | 1 slaves.
          192.168.4.13:6303 (88f25945...) -> 0 keys | 5461 slots | 1 slaves.
          [OK] 0 keys in 3 masters.
        
        # 可以查看到,3个主节点(11,12,13) 0条数据,5461个hash槽,1个slave服务器
        
      • 在Redis服务器上查看集群信息

        [root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301
        192.168.4.11:6301> cluster info		# 查看集群信息
        192.168.4.11:6301> cluster nodes	# 查看集群节点信息
        
    • 检测集群

      [root@admin ~]# redis-trib.rb check 192.168.4.11:6301
        >>> Performing Cluster Check (using node 192.168.4.11:6301)
        M: badb9cd848cf7954d4804518a2dd9427dda4451a 192.168.4.11:6301
           slots:0-5460 (5461 slots) master			# 槽位 0-5460
           1 additional replica(s)
        S: bdc7713c2332cf0110fccaa994110f3c473f644c 192.168.4.15:6305
           slots: (0 slots) slave
           replicates badb9cd848cf7954d4804518a2dd9427dda4451a		# replicates: 指向主服务器的ID值
           ......
      
  • 排错

    1. 检查数据是否清空
    2. 检查Redis服务器集群功能是否启用
    
    出错之后再次创建,需要删掉每一台机子产生的集群配置文件信息
      - /var/lib/redis/6379/nodes-6379.conf
      - 删除配置文件之后需要重新启动Redis服务
      - 最后在管理主机执行创建集群指令
    
  • 访问集群存/取数据

    在客户端可以连接集群中任意一台Redis服务器
      选项 -c 集群模式
      
    访问集群 必须携带'-c' , 不然,不能连接集群节点,只是主机节点
    
    [root@node1 ~]# redis-cli -c -h 192.168.4.11 -p 6301
    192.168.4.11:6301> set name nayue
    -> Redirected to slot [5798] located at 192.168.4.12:6302	# 可以查看到 槽(5798) 数据存储到了12节点
    OK
    
    [root@node5 ~]# redis-cli -c -h 192.168.4.15 -p 6305
    192.168.4.15:6305> get name
    -> Redirected to slot [5798] located at 192.168.4.12:6302	# 可以看到 槽(5798) 从12节点获取数据
    "nayue"
    
  • 集群的工作原理

    Redis的集群是一个高可用的分布式集群,存储的时候,调用一个CRC16算法,做hash计算
      - 为每个节点获得一个编号(槽)范围
      - 变量名与CRC16算法做hash,把计算的结果,与16384做求模运算,
      - 使用最后的值与插槽范围做对比,在哪个插槽的范围,就存放在哪个节点(插槽)
      - Redis一共有16384个槽位
    

管理集群

  • 测试集群功能

    • 故障切换测试

      停止master主机的Redis服务
        - master宕机后对应的slave自动被选举为master
        - 原master启动后,会自动配置为当前master的slave
      
      [root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301 shutdown
      
      检测集群 在管理主机查看信息
      [root@admin ~]# redis-trib.rb check 192.168.4.12:6302
      [root@admin ~]# redis-trib.rb info 192.168.4.12:6302
      
      [root@node1 ~]# /etc/init.d/redis_6379 start
      
      [root@admin ~]# redis-trib.rb check 192.168.4.12:6302
      
      
  • 添加服务器

    • 添加master角色服务器

      1. 克隆新的系统镜像 ip 192.168.4.17
      2. 运行Redis服务并启用集群功能
      3. 在管理主机,向集群添加master角色的Redis服务器
      4. 给新添加的master角色的Redis服务器分配hash槽
      5. 查看集群信息
      6. 访问新添加的master角色redis服务器存取数据
      
      # 省略初始配置相关,从第三步开始
      
      • 添加Master主机

        添加master主机
          - 添加时不指定主机角色,默认新主机被选为master
          - 添加的master主机,需要手动分析hash槽
          - 语法: "redis-trib.rb add-node 添加的Master主机:端口 集群中任意一个节点:端口"
        
        [root@admin ~]# redis-trib.rb add-node 192.168.4.17:6307 192.168.4.11:6301
        ....
        [OK] New node added correctly.
        
        [root@admin ~]# redis-trib.rb info 192.168.4.12:6302
        192.168.4.17:6307 (0fdf2ecf...) -> 0 keys | 0 slots | 0 slaves.	# 查看信息 新的Master主机槽位为零(不存任何数据)
        
      • 分配hash槽位(重新分片)

        重新分片
          - 移出hash槽个数
          - 接收hash槽主机ID
          - 移出hash槽主机ID
          - 16384/4=4096 为了平均,每个master占用4096个槽位
          
        [root@admin ~]# redis-trib.rb reshard 192.168.4.11:6301
        How many slots do you want to move (from 1 to 16384)? 4096	# 接收槽位的数量
        What is the receiving node ID? 0fdf2ecffa517c6de9c01c3005ff2dd14355821b	 # 接收槽位的主机ID(Master)
        Source node #1: all		# 从哪里获取槽位 这里选择所有
        Do you want to proceed with the proposed reshard plan (yes/no)? yes		# yes 同意
        
      • 查看集群信息

        [root@admin ~]# redis-trib.rb info 192.168.4.11:6301
        192.168.4.12:6302 (5846e7fa...) -> 0 keys | 4096 slots | 1 slaves.
        192.168.4.14:6304 (b4b36360...) -> 0 keys | 4096 slots | 1 slaves.
        192.168.4.17:6307 (0fdf2ecf...) -> 1 keys | 4096 slots | 0 slaves.	# 可以查看 槽位分配正常 但是没有slave
        192.168.4.15:6305 (bdc7713c...) -> 0 keys | 4096 slots | 1 slaves.
        
        
    • 添加slave角色服务器

      1. 克隆新的系统镜像 ip 192.168.4.18
      2. 运行Redis服务并启用集群功能
      3. 把'192.168.4.18'redis服务添加到集群里角色是'192.168.4.17'的slave
      4. 查看集群信息
      
      # 这里只演示第三步
      
      • 添加slave主机

        部署一台新的Redis服务器
          - 运行服务并启用集群配置
        
        添加master主机
          'redis-trib.rb add-node --slave [ --master-id id值 ] ip地址:端口 集群任意节点ip地址:端口'
          - 如果不指定master-id 自动寻找slave最少的节点,slave都相同的话 则随机添加
          - Redis的slave会自动同步Master的数据
        
        [root@admin ~]# redis-trib.rb add-node --slave --master-id 0fdf2ecffa517c6de9c01c3005ff2dd14355821b 192.168.4.18:6308 192.168.4.11:6301 
        
      • 查看集群信息

        [root@admin ~]# redis-trib.rb info 192.168.4.11:6301
        192.168.4.12:6302 (5846e7fa...) -> 2 keys | 4096 slots | 1 slaves.
        192.168.4.14:6304 (b4b36360...) -> 1 keys | 4096 slots | 1 slaves.
        192.168.4.17:6307 (0fdf2ecf...) -> 2 keys | 4096 slots | 1 slaves.
        192.168.4.15:6305 (bdc7713c...) -> 1 keys | 4096 slots | 1 slaves.
        
  • 移除服务器

    • 删除slave角色服务器

      移除slave主机
        - 从服务器没有hash槽,直接移除即可
        - 移出时指定从服务器的ID值
        - 移除时,会自动停止该节点的Redis服务
        - 'redis-trib.rb del-node ip地址:端口 从服务器id值'
        
      [root@admin ~]# redis-trib.rb check 192.168.4.12:6302	# 查看一下要移除的从服务器的ID值
      
      [root@admin ~]# redis-trib.rb del-node 192.168.4.11:6301 9374b3bab7ef716ea73eb7d66cf424a25888d9b5
      
      [root@admin ~]# redis-trib.rb info 192.168.4.12:6302
      192.168.4.17:6307 (0fdf2ecf...) -> 2 keys | 4096 slots | 0 slaves.
      
      [root@node8 ~]# ss -ntulp | grep redis
      
    • 删除master服务器

      1. 释放占用的hash槽
      2. 移除Master主机
      3. 查看集群信息
      
      # 释放占用的hash槽时,根据hash槽位存储的信息也会转移到目标服务器
      
      • 释放占用的slots

        这里我们移出'192.168.4.17'
          - 指定移出的slots个数
          - 指定接收slots主机ID
          - 指定移出slots主机ID
        
        [root@admin ~]# redis-trib.rb reshard 192.168.4.11:6301
        How many slots do you want to move (from 1 to 16384)? 4096	# '192.168.4.17'的槽位是4096个
        What is the receiving node ID?5846e7fadcae26fafd8aca87d9e6825d92d4bce3	# 接收槽位的主机(将17的槽位赋予其他主节点)
        Source node #1:0fdf2ecffa517c6de9c01c3005ff2dd14355821b	# 这里指定17 
        Source node #2:done
        Do you want to proceed with the proposed reshard plan (yes/no)? yes
        
        
        [root@admin ~]# redis-trib.rb info 192.168.4.11:6301
        192.168.4.17:6307 (0fdf2ecf...) -> 0 keys | 0 slots | 0 slaves.		# 可以查看到 17主节点的slots为0了
        
      • 移出Master主机

        [root@admin ~]# redis-trib.rb del-node 192.168.4.11:6301 0fdf2ecffa517c6de9c01c3005ff2dd14355821b
        
      • 查看集群信息

        [root@admin ~]# redis-trib.rb info 192.168.4.11:6301
        192.168.4.12:6302 (5846e7fa...) -> 4 keys | 8192 slots | 1 slaves.	# 之前把17的槽位给了12,所以数据也给了12
        192.168.4.14:6304 (b4b36360...) -> 1 keys | 4096 slots | 1 slaves.
        192.168.4.15:6305 (bdc7713c...) -> 1 keys | 4096 slots | 1 slaves.
        [OK] 6 keys in 3 masters.
        
  • 扩展

    经过我们一系列操作,现在槽位不平衡,所以12压力更大,我们可以使用命令平均分配一下槽位
      - rebalance  # 平均分配槽位
      
    [root@admin ~]# redis-trib.rb rebalance 192.168.4.11:6301
    
    [root@admin ~]# redis-trib.rb info 192.168.4.11:6301
    192.168.4.12:6302 (5846e7fa...) -> 2 keys | 5461 slots | 1 slaves.
    192.168.4.14:6304 (b4b36360...) -> 2 keys | 5462 slots | 1 slaves.
    192.168.4.15:6305 (bdc7713c...) -> 2 keys | 5461 slots | 1 slaves.
    
  • 将移出集群的设备添加回集群

    # 先在node8主机上开启Redis服务
    [root@node8 ~]# /etc/init.d/redis_6379 start
    
    # 在管理主机上添加集群几点会报错
    [root@admin ~]# redis-trib.rb add-node --slave 192.168.4.18:6308 192.168.4.11:6301
    Automatically selected master 192.168.4.12:6302
    [ERR] Node 192.168.4.18:6308 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    
    # 我们去该集群主机上查看集群信息
    [root@node8 ~]# ls /var/lib/redis/6379/
    dump.rdb  nodes-6379.conf
    [root@node8 ~]# redis-cli -h 192.168.4.18 -p 6308
    192.168.4.18:6308> cluster info
    cluster_state:ok
    
    # 清理集群信息
    [root@node8 ~]# redis-cli -h 192.168.4.18 -p 6308
    192.168.4.18:6308> cluster reset	# 重置集群信息
    
    192.168.4.18:6308> flushall		# 集群中的数据也需要清除
    192.168.4.18:6308> save
    
    192.168.4.18:6308> cluster info		# 清除之后,查看集群状态,已经恢复正常
    cluster_state:fail
    
    # 再次在管理主机尝试添加主机
    [root@admin ~]# redis-trib.rb add-node --slave 192.168.4.18:6308 192.168.4.11:6301
    [OK] New node added correctly.	# 添加成功
    
    # 查看集群信息
    [root@admin ~]# redis-trib.rb info 192.168.4.11:6301
    192.168.4.12:6302 (5846e7fa...) -> 2 keys | 5461 slots | 2 slaves.	# 可以查看到 12节点变成两个从库了
    

Redis集群解散

这里以192.168.4.11主机为例

  • 停止服务

    [root@node1 ~]# redis-cli -c -h 192.168.4.11 -p 6301
    
  • 删除数据库目录下的所有文件

    [root@node1 ~]# rm -rf /var/lib/redis/6379/*
    
  • 禁用集群功能

    [root@node1 ~]# vim +815 /etc/redis/6379.conf
    # cluster-enabled yes	# 注释掉该功能
    
  • 启动服务

    [root@node1 ~]# /etc/init.d/redis_6379 start
    Starting Redis server...
    
  • 连接服务,查看集群信息,不支持为成功

    [root@node1 ~]# redis-cli -h 192.168.4.11 -p 6301
    192.168.4.11:6301> keys *
    (empty list or set)
    
    192.168.4.11:6301> cluster info
    ERR This instance has cluster support disabled
    
posted @ 2021-12-14 23:47  CatdeXin  阅读(193)  评论(0)    收藏  举报