docker-compose安装redis一主二从三哨兵

声明:主从复制跟集群是有区别的,而现在讲的是主从复制

分别创建redis、redis-sentinel文件夹

cd redis
mkdir master slave1 slave2 #分别创建master、slave1、slave2文件夹
cd master
mkdir config data #分别创建config、data文件夹

可以到redis官网下载redis.conf文件,并把该配置文件复制到master、slave1、slave2文件夹中的config文件里去
开始创建redis的docker-compose文件

cd redis
touch docker-compose.yml
####以下是docker-composer.yml的内容#####
version: '3'
services:
  master:
    image: redis:latest
    container_name: redis_master  #master节点
    volumes:
      - ./master/config/redis.conf:/etc/redis/redis.conf
      - ./master/data:/data
    command: /bin/bash -c "redis-server /etc/redis/redis.conf"  #这句话就是要加载这个路径下的配置
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.UTF-8
    ports:
      - "6379:6379"

  slave1:
    image: redis:latest
    container_name: redis_slave_1   #slave1节点
    volumes:
      - ./slave1/config/redis.conf:/etc/redis/redis.conf
      - ./slave1/data:/data
    command: /bin/bash -c "redis-server /etc/redis/redis.conf"
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.UTF-8
    ports:
      - "6380:6379"

  slave2:
    image: redis:latest
    container_name: redis_slave_2   #slave2节点
    volumes:
      - ./slave2/config/redis.conf:/etc/redis/redis.conf
      - ./slave2/data:/data
    command: /bin/bash -c "redis-server /etc/redis/redis.conf"
    environment:
      - TZ=Asia/Shanghai
      - LANG=en_US.UTF-8
    ports:
      - "6381:6379"

修改每一个redis.conf配置文件

找到以下代码的位置,并修改
bind 0.0.0.0  #这个一定要设置0.0.0.0,不然别的机器访问不了
protected-mode yes #建议配置主从最好有密码,毕竟线上配置都是设置密码的,何不完整学习呢
requirepass 123456 #设置密码
以上的配置3个redis.conf配置一致,以下就只需要配置从节点的配置文件即可
replica-read-only yes   #这个配置后面会说到
slaveof 172.16.0.08 6379 #配置主节点的ip ,端口
masterauth 123456   #因为主节点设置了密码,必须设置这个,否者连不上主节点

启动redis主从节点

cd redis
docker-compose up -d    #启动


如图启动成功
进入主节点的容器,可以查看相关信息

docker exec -it 容器id bash
#进入容器后
redis-cli -p 6379
auth 123456 #这步是输入密码,就是配置文件的密码
info replication    #这个命令可以查replication的相关信息


可以看到当前容器的角色是什么,role:master
如果是主节点,可以看到当前连接了几个从节点,connected_slaves:2
有这两个信息就表示已经主从复制成功

这个是从节点的信息
就此主从复制已经完成,可以用rdm测试一下结果,测试时只能在主节点写入,然后从节点会同步数据,如果在从节点写入,会报这个错误 “READONLY You can’t write against a read only replica.”,这是因为在从节点配置文件中配置了replica-read-only yes,从节点只能读不能写


配置哨兵

cd redis-sentinel
mkdir sentinel1 sentinel2 sentinel3 #创建3个文件夹
touch sentinel.conf
vim sentinel.conf
#写下一下配置
##这是哨兵的默认端口
port 26379
dir /tmp
##监听master主节点,myredismaster可以随便改成你喜欢的名字,ip 端口 只有的2是指明当有多少个sentinel认为一个master失效时,master才算真正失效,我这里有3台哨兵,当有2台确认失效就切换主从
sentinel monitor myredismaster 172.16.0.8 6379 2 

##主从密码要一直,这是切换主从用到的密码
sentinel auth-pass myredismaster 123456 

##这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒
sentinel down-after-milliseconds myredismaster 30000

##这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
sentinel parallel-syncs myredismaster 1

sentinel failover-timeout myredismaster 180000
sentinel deny-scripts-reconfig yes

配置成功后,把sentinel.conf配置复制到sentinel1、sentinel2、sentinel3中
配置redis-sentinel的docker-compose.yml

version: '3'
services:
  sentinel1:
    image: redis:latest
    container_name: redis_sentinel_1
    ports:
      - "26379:26379"
    volumes:
      - ./sentinel1/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    command: /bin/bash -c "redis-sentinel /usr/local/etc/redis/sentinel.conf"

  sentinel2:
    image: redis:latest
    container_name: redis_sentinel_2
    ports:
      - "26380:26379"
    volumes:
      - ./sentinel2/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    command: /bin/bash -c "redis-sentinel /usr/local/etc/redis/sentinel.conf"

  sentinel3:
    image: redis:latest
    container_name: redis_sentinel_3
    ports:
      - "26381:26379"
    volumes:
      - ./sentinel3/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    command: /bin/bash -c "redis-sentinel /usr/local/etc/redis/sentinel.conf"

cd redis-sentinel
docker-compose up -d #启动哨兵


启动成功输入sentinel master myredismaster可返回图上信息

注意:手动关闭了redis-master容器后,他不会立刻切换到从分支,因为配置文件了30秒才会被sentinel主观认为失效,我就是以为会立刻切换,一直没切换我以为配置不成功,白忙活了好久,隔了一段时间再查看才发现成功了,提醒读者避坑

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!