04.`Ubuntu18.04`下`docker-compose`实现`redis`哨兵模式

1. 编写docker-compose.yml
version: '3.7'

services:
  redis-master:
    image: redis
    ports:
      - 6379:6379
    volumes:
      - ./master/conf/redis.conf:/var/local/redis/redis.conf
      # 容器中默认将数据就是放在 /datas目录下
      - ./master/datas/:/datas/
    command: ['redis-server', '/var/local/redis/redis.conf']

  redis-slave1:
    image: redis
    ports:
      - 6380:6379
    volumes:
      - ./slave1/conf/redis.conf:/var/local/redis/redis.conf
      # 容器中默认将数据就是放在 /datas目录下
      - ./slave1/datas/:/datas/
    command: ['redis-server', '/var/local/redis/redis.conf']
  
  redis-slave2:
    image: redis
    ports:
      - 6381:6379
    volumes:
      - ./slave2/conf/redis.conf:/var/local/redis/redis.conf
      # 容器中默认将数据就是放在 /datas目录下
      - ./slave2/datas/:/datas/
    command: ['redis-server', '/var/local/redis/redis.conf']
  
  redis-sentinel1:
    image: redis
    ports:
      - 26391:26379
    volumes:
      - ./sentinel1/conf/sentinel.conf:/var/local/redis/sentinel.conf
      # 容器中默认将数据就是放在 /datas目录下
    command: ['redis-sentinel', '/var/local/redis/sentinel.conf']
  
  redis-sentinel2:
    image: redis
    ports:
      - 26392:26379
    volumes:
      - ./sentinel2/conf/sentinel.conf:/var/local/redis/sentinel.conf
      # 容器中默认将数据就是放在 /datas目录下
    command: ['redis-sentinel', '/var/local/redis/sentinel.conf']
  
  redis-sentinel3:
    image: redis
    ports:
      - 26393:26379
    volumes:
      - ./sentinel3/conf/sentinel.conf:/var/local/redis/sentinel.conf
      # 容器中默认将数据就是放在 /datas目录下
    command: ['redis-sentinel', '/var/local/redis/sentinel.conf']
  1. 容器中默认将数据就是放在 /datas/ 目录下
  2. volumes将数据映射到了宿主机上,要编辑各自的redis-confsentinel.conf
2. 编辑redis.conf
  1. 根据docker-compose.ymlvolumes,创建文件夹

    # 创建 conf/ 目录
    mkdir -p master/conf/ slave1/conf/ slave2/conf/ sentinel1/conf/ sentinel2/conf/ sentinel3/conf/
    
    # 创建 datas/ 目录
    mkdir -p master/datas/ slave1/datas/ slave2/datas/
    
  2. redis-masterreids.conf

    1. 下载redis.conf

      # 进入 master/conf/ 目录 
      cd master/conf/
      
      # 下载
      wget http://download.redis.io/redis-stable/redis.conf
      

      下载

    2. 编辑redis.conf文件

      vim redis.conf
      

      编辑redis.conf

    3. 修改的内容

      1. 命令模式命令输入使用/关键字查找

        快捷查找

      2. bind 127.0.0.1注释掉(69行左右),可以远程访问

        原来

        修改后

      3. # requirepass foobared786行左右)撤销注释,修改密码

        原来

        修改后

      4. # masterauth <master-password>392行左右)撤销注释,修改成自己设置的密码

        原来

        修改后

  3. redis-slave1redis.conf

    1. masterredis.conf复制

      # 返回到docker-compose.yml同级目录
      cd ../../
      
      # 复制
      cp master/conf/redis.conf slave1/conf/
      
      # 进入文件夹
      cd slave1/conf/
      

      复制

      进入

    2. 编辑redis.conf文件

      vim redis.conf
      

      编辑redis.conf文件

    3. 内容

      1. 因为是直接复制masterredis.conf文件,只需要再修改一处即可

      2. # replicaof <masterip> <masterport>385行左右)撤销注释,修改为replicaof redis-master 6379

        1. <masterip>可以是ip,也可以是docker-compose.yml设置的服务名,建议是服务名,因为docker-compose启动的ip不确定
        2. <masterport>为容器里的ip

        修改前

        修改后

      3. redis.conf文件复制

        # 返回到docker-compose.yml同级目录
        cd ../../
        
        # 复制文件到 slave2/conf/
        cp slave1/conf/redis.conf slave2/conf/
        

        复制

  4. sentinel1sentinel.conf文件

    1. 下载sentinel.conf文件

      # 进入文件夹
      cd sentinel1/conf/
      
      # 下载
      wget http://download.redis.io/redis-stable/sentinel.conf
      

      进入文件夹

      下载sentinel.conf文件

    2. 编辑sentinel.conf文件

      vim sentinel.conf
      

      编辑 sentinel.conf 文件

    3. sentinel monitor mymaster 127.0.0.1 6379 284行左右)修改成sentinel monitor mymaster redis-master 6379 2

      1. mymaster这个名字随意起,是sentinel的名字,如果该名字重新定义,全文都要修改(有多个)
      2. 127.0.0.1ip地址,也可以写成docker-compose.yml文件中服务名
      3. 6379是主节点的端口号
      4. 2表示需要2个哨兵才能确定主节点

      修改前

      修改后

    4. # sentinel auth-pass <master-name> <password>

      1. <master-name>改为第三步中mymaster的值,因为没有修改,所以直接为mymaster
      2. <password>改为主节点设置的密码

      修改前

      修改后

    5. sentinel myid <字符串>检查是否有这个,删掉(这个是启动容器后再生成的,如果重新启动,那么必须删掉这个)

    6. 复制文件

       # 返回到docker-compose.yml同级目录
      cd ../../
      
      # 复制文件
      cp sentinel1/conf/sentinel.conf sentinel2/conf/
      
      cp sentinel1/conf/sentinel.conf sentinel3/conf/
      

      复制文件

  5. 启动

    # 启动
    docker-compose up -d
    
    # 查看容器状态
    docker ps -a
    

    启动容器

    查看容器

3. 哨兵模式高可用的验证
  1. 查看master状态

    # -p 后面是 端口
    # -a 后面是设置的 密码
    # 登录redis
    redis-cli -p 6379 -a password
    
    # 查看状态
    info replication
    

    查看master状态

  2. 查看slave状态

    # 登录redis-slave1
    redis-cli -p 6380 -a password
    
    # 查看状态
    info replication
    
    # 登录redis-slave2
    redis-cli -p 6381 -a password
    
    # 查看状态
    info replication
    

    查看 slave1 状态

    查看 slave2 状态

  3. 查看sentinel

    # redis-sentinel1
    redis-cli -p 26391 -a password
    
    # 查看状态
    info sentinel
    
    # redis-sentinel2
    redis-cli -p 26392 -a password
    
    # 查看状态
    info sentinel
    
    # redis-sentinel3
    redis-cli -p 26393 -a password
    
    # 查看状态
    info sentinel
    

    查看 sentinel1 状态

    查看 sentinel1 状态

    查看 sentinel1 状态

  4. 6379端口的redis-master设置值

    1. 设置值

      set name "zhangsan"
      

      master

      slave1

      slave2

    2. 删除值

      # 删除所有的键
      flushall
      

      master删除值

      # 从库查看
      keys *
      

      slave1

      slave2

  5. 停止6379端口这个redis-master

    docker stop <容器ID>
    

    停止 master

    # 6380 6381都查看各自的状态
    info replication
    

    6380 slave 的状态

    6381 slave 的状态

    • 6381这个端口的slave变成了master主节点,可以确认容器 ip
    # 查看容器的内部 ip
    docker inspect <容器id> | grep IPA
    

    容器内部ip

  6. 6381主节点设置值

    1. set key "zero"

      6381 主节点设置值

    2. 6380从是否获取了值

      # 查看所有的键
      keys *
      
      # 获取值
      get key
      

      6380 slave

  7. 启动停止的6379

    docker start <容器ID>
    

    启动 6379

    # 查看 6379 此时的状态
    info replication
    

    6379 状态

    1. 此时6379端口的redis变成了从 slave

    2. 验证高可用,是否获取了停止时主节点6381设置的值

      # 获取所有的键
      keys *
      
      # 获取 key 的值
      get key
      

      获取所有的键

      获取值

  8. redis哨兵模式安装成功,达到了高可用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值