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 协议》,转载必须注明作者和本文链接
推荐文章: