Redis集群部署

Redis集群部署

前言

本篇文章为了记录学习过程,方便回溯
参考文章地址:基于Docker-Compose搭建Redis集群模式

环境准备

  1. 操作系统:Centos7.9

  2. docker安装

    1. 查看系统中docker版本

      docker -v
      
    2. 卸载老版本

      sudo yum remove docker \
                        docker-client \
                        docker-client-latest \
                        docker-common \
                        docker-latest \
                        docker-latest-logrotate \
                        docker-logrotate \
                        docker-engine
      
    3. 安装yum工具包

      sudo yum install -y yum-utils
      
    4. 配置仓库源

      #1. 默认使用国外源,非常慢!
      sudo yum-config-manager \
          --add-repo \
          https://download.docker.com/linux/centos/docker-ce.repo
      
      #2. 推荐用国内源
      sudo yum-config-manager \
          --add-repo \
          https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
      
    5. 安装docker engine

      sudo yum install docker-ce docker-ce-cli containerd.io
      
    6. 启动docker

      sudo systemctl enable docker
      sudo systemctl start docker
      
  3. docker-compose 安装,本次部署使用版本2.18.1(后续部署也可以选择使用docker run启动多个实例)

    1. 下载方式一:

      使用wget下载

        wget https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64(版本自己选择)
      
    2. 下载方式二:

      前往github tag寻找资源手动下载,官方网址:https://github.com/docker/compose/releases/tag
      在这里插入图片描述

    上述两种方式下载后,需要将下载文件移动到服务器【/usr/local/bin】目录下

    之后切换目录到【/usr/local/bin】执行一下命令:

    # 重命名
    sudo mv docker-compose-linux-x86_64 docker-compose
    
    # 将可执行权限应用于二进制文件
    sudo chmod +x /usr/local/bin/docker-compose
    
    #测试版本号
    docker-compose -v
    
  4. redis镜像下载(本次使用7.2.4版本,也就是latest,这一步可以省略,后续执行docker-compose没有镜像也会自动下载)

    #拉去镜像包
    docker pull redis:latest/docker pull redis:7.2.4
    
    #查看下载的镜像包
    docker images
    

开始部署

  1. 编写redis-cluster配置文件

    因为本次配的是三主三从,所以后续会启动六个容器,需要六份配置文件,以下列举一份端口为7001模板:

    # 端口(7001 ~ 7006)
    port 7001
    # 可以连接的ip
    bind 0.0.0.0
    # 密码认证,这里your-redis-password 自己设置
    requirepass your-redis-password
    # 设置连接到主节点的密码(通常与requirepass相同),这里your-redis-password 自己设置
    masterauth your-redis-password
    # 开启保护模式
    protected-mode yes
    # 启动集群模式
    cluster-enabled yes
    # 配置文件名称(nodes7001.conf ~ nodes7006.conf)
    cluster-config-file nodes7001.conf
    # 节点超时时间
    cluster-node-timeout 5000
    # 当前节点ip(本次配置的是虚拟机的ip,也就是容器的宿主机ip)
    cluster-announce-ip 192.168.163.130
    # 指定集群节点向其他节点宣布的 TCP 端口号(7001 ~ 7006)
    cluster-announce-port 7001
    # 集群之间通信的端口号(17001 ~ 17006)
    cluster-announce-bus-port 17001
    # 启用AOF持久化
    appendonly yes
    

    仿照上面的配置复制五份,依次命名为redis-cluster7002.conf ~ redis-cluster7006.conf,把文件中所有出现7001的地方改成对应的端口号,文件放置目录根据下面docker-compose yml文件中的 volumes配置决定。

    在这里插入图片描述

  2. 编写docker-compose yml文件
    此处yml文件命名为compose-redis-cluster

    version: '3'  
    services:
      redis-node1:  # 服务名
        image: redis:latest  # 使用的镜像
        container_name: redis-node1 # docker启动的容器名
        ports:  # 映射的端口 7001是redis server使用,17001是集群之间节点通信使用,都必须开放映射,如果不指定17001端口映射的话,创建集群的时候节点之间不能通信,集群会创建失败
          - "7001:7001"  
          - "17001:17001"
        volumes:  # 映射的容器卷
          - /mydata/redis/conf/redis-cluster7001.conf:/usr/local/etc/redis/redis.conf
          - /mydata/redis/data:/data
        command: bash -c "redis-server /usr/local/etc/redis/redis.conf"
        networks:  # 指定使用网络插件名称
          - redis-net
    
      redis-node2:  
        image: redis:latest
        container_name: redis-node2
        ports:  
          - "7002:7002"  
          - "17002:17002"
        volumes:  
         - /mydata/redis/conf/redis-cluster7002.conf:/usr/local/etc/redis/redis.conf 
         - /mydata/redis/data:/data
        command: redis-server /usr/local/etc/redis/redis.conf  
        networks:  
          - redis-net
    
      redis-node3:  
        image: redis:latest
        container_name: redis-node3
        ports:  
          - "7003:7003"  
          - "17003:17003"
        volumes:  
          - /mydata/redis/conf/redis-cluster7003.conf:/usr/local/etc/redis/redis.conf
          - /mydata/redis/data:/data
        command: redis-server /usr/local/etc/redis/redis.conf  
        networks:  
          - redis-net
    
      redis-node4:  
        image: redis:latest
        container_name: redis-node4
        ports:  
          - "7004:7004"
          - "17004:17004"
        volumes:  
          - /mydata/redis/conf/redis-cluster7004.conf:/usr/local/etc/redis/redis.conf
          - /mydata/redis/data:/data
        command: redis-server /usr/local/etc/redis/redis.conf  
        networks:  
          - redis-net
    
      redis-node5:  
        image: redis:latest
        container_name: redis-node5
        ports:  
          - "7005:7005"
          - "17005:17005"
        volumes:  
          - /mydata/redis/conf/redis-cluster7005.conf:/usr/local/etc/redis/redis.conf
          - /mydata/redis/data:/data
        command: redis-server /usr/local/etc/redis/redis.conf  
        networks:  
          - redis-net
    
      redis-node6:  
        image: redis:latest
        container_name: redis-node6
        ports:  
          - "7006:7006"
          - "17006:17006" 
        volumes:  
          - /mydata/redis/conf/redis-cluster7006.conf:/usr/local/etc/redis/redis.conf
          - /mydata/redis/data:/data
        command: redis-server /usr/local/etc/redis/redis.conf  
        networks:  
          - redis-net
    
      redis-cluster-init:  # redis-cli服务,作用是在上面六个redis节点启动成功之后,执行集群创建的命令
        image: redis:latest
        container_name: redis-cluster-init
        depends_on:  # 设置依赖顺序,在上面六个节点启动成功之后启动
          - redis-node1  
          - redis-node2  
          - redis-node3  
          - redis-node4  
          - redis-node5  
          - redis-node6  
        command: bash -c "redis-cli -a your-redis-password --cluster create 192.168.163.130:7001 192.168.163.130:7002 192.168.163.130:7003 192.168.163.130:7004 192.168.163.130:7005 192.168.163.130:7006 --cluster-replicas 1 --cluster-yes && exit 0"  # 执行集群初始化的命令, --cluster-yes 是指定在创建集群的时候需要输入一个参数这里设置为yes也就是代表输入yes,exit0 代表该服务启动成功之后自动退出, -a your-redis-password 是之前conf文件中配置的密码
        networks:  
          - redis-net  
        restart: "no" # 因为该服务只是用来执行Redis集群初始化的命令,所以服务关闭之后不需要重启
        
    networks:  
      redis-net:
    	driver: bridge
    
  3. 执行yml文件,启动容器

    docker-compose -f compose-redis-cluster.yml up -d
    

    在这里插入图片描述

    #dockps查看容器内容
    docker ps 
    

    在这里插入图片描述

  4. 查看redis集群信息

    • 连接redis-node1

      docker exec -it redis-node1 redis-cli -p 7001 -a bingo -c
      
    • 查看集群状态

      cluster info
      

      在这里插入图片描述

    • 查看节点信息

      cluster nodes
      

      在这里插入图片描述

    • 查看主从映射信息

      1. exit 退出当前容器客户端连接,退回系统bash

      2. 进入容器

        #redis-node2为容器名称
        docker exec -it redis-node2 /bin/bash
        
      3. 查询映射

        # bingo 是之前在conf里配置的连接密码
        redis-cli -a bingo --cluster check 192.168.146.130:7002
        

        在这里插入图片描述

验证故障自动转移

  1. 停掉一台master主机

    docker stop redis-node1
    #查看正在运行的容器是不是变成5台
    docker ps
    
  2. 查看主从映射

    #进入容器内部后执行一下代码,ip端口按照conf中写
    redis-cli -a bingo --cluster check 192.168.146.130:7002
    

    在这里插入图片描述
    如果还是还是三台master主机,就表明故障自动转移成功,本例中7004端口的实例从从机转为了主机。

  3. 检查集群状态

    #进入容器后,连接客户端,bingo为密码,7002为端口
    redis-cli -a bingo -p 7002 -c
    
    #查看集群状态,状态为ok表示集群没有问题
    cluster info
    

在这里插入图片描述

  1. 重启关掉的master主机

    docker start redis-node1
    docker ps
    

    在这里插入图片描述
    redis-node1启动成功

  2. 查看是否加入集群

    #进入容器后执行以下代码
    redis-cli -a bingo --cluster check 192.168.146.130:7002
    

    在这里插入图片描述

    可以看到目前是六个实例,7001重新加入集群转变为7004的从机

部署过程故障处理

  1. 自动故障转移失败

    首先检查转移失败的从机日志

    #这里以redis-node4举例
    docker logs redis-node4
    

    在这里插入图片描述

    从日志中,可以看到Redis从服务器(replica)在尝试与主服务器(master)进行同步时遇到了认证问题。主服务器要求从服务器进行身份验证,但从服务器似乎没有提供正确的认证信息。
    错误消息 -NOAUTH Authentication required表明主服务器配置了密码保护(通过requirepass参数),但从服务器在尝试同步时没有提供正确的密码。
    要解决此问题,需要确保从服务器的配置中包含了正确的masterauth参数,该参数的值应与主服务器requirepass参数设置的值相同。这样,在从服务器尝试与主服务器同步时,它会使用这个密码进行身份验证。

    # 各台服务器 conf文件加入masterauth
    masterauth  yourmasterpassword
    
  2. 设置key建失败

在这里插入图片描述

出现这个问题是因为忽略了连接方式 用下面的就可以了连接客户端一个 -c参数 这个就表示 用集群的方式连接 这样就不会报上面那个 MOVED的错误了。

redis-cli -a bingo -p 7002 -c

在这里插入图片描述

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值