Docker 搭建 Redis as sentinel
1. 使用docker拉取redis image
2. 创建Redis挂载目录
新建 /usr/local/redis/ 文件夹
在redis文件夹下新建/conf ,用于挂载conf文件
在redis文件夹下新建/data ,挂载redis数据文件,防止docker容器损坏而导致数据丢失
在conf文件夹下新建6370、6371、6372三个文件夹用于挂载三个redis容器
将 redis.conf 和 sentinel.conf 文档上传到到6370、6371、6372文件夹中
3.主服务器redis配置
进入redis.conf文件进行配置,其他项保持默认配置
#redis日志文件位置,日志文件都存入logs目录下 logfile "/etc/redis/log/redis.log" #配置rbd模式持久化数据 save 900 1 save 300 10 save 60 10000 #配置rdb的文件名 dbfilename "dump.rdb" #指定数据文件的目录,如rdb文件和aof文件 dir "/ etc/redis/data" #如果本服务器切换为从服务器时,只读,不可写 replica-read-only yes #redis服务器的密码 requirepass test #开启aof持久化模式 appendonly yes #配置aof文件名 appendfilename "appendonly.aof" #redis日志文件位置,日志文件都存入logs目录下 logfile "/etc/redis/log/redis.log" #配置rbd模式持久化数据 save 900 1 save 300 10 save 60 10000 #配置rdb的文件名 dbfilename "dump.rdb" #指定数据文件的目录,如rdb文件和aof文件 dir "/ etc/redis/data" #如果本服务器切换为从服务器时,只读,不可写 replica-read-only yes #redis服务器的密码 requirepass test #开启aof持久化模式 appendonly yes #配置aof文件名 appendfilename "appendonly.aof" #用于接收所有端口的连接,或者直接注释掉 bind 0.0.0.0 #关闭保护模式(开启只能本地访问) protedcted-mode no #设置redis连接密码 requirepass “password” #设置主从连接的密码 masterauth “password”
4、执行命令,生成Redis容器(按命令生成redis-6370、redis-6371、redis-6372三个容器)
docker run --name redis-6370 -p 20111:6379 -v /usr/local/redis/conf/redis-slave.conf:/etc/redis/redis.conf -v /usr/local/redis/conf/sentinel.conf:/etc/redis/sentinel.conf -v /usr/local/redis/data/:/data -d redis redis-server /etc/redis/redis.conf
至此,所有redis容器都已生成并启动
5、设置Redis主从模式
选择一个redis作为master,其他的redis作为slave
对于作为slave的容器进入客户端执行 slaveof master容器IP 6379(端口号统一为6379)
#查看容器内部IP 172.17.0.X #选为master的那一个 docker inspect containerID #进入redis容器内 docker exec -ti containerID /bin/bash #进入redis客户端 redis-cli # slaveof 172.17.0.2 6379
4、查看主从模式是否设置成功
auth password //权限验证;输入密码
info replication // 查看当前redis的状态信息
对于master会显示slave个数及IP,对于slave会显示master信息
在master客户端执行set k1 v1,存储数据
在slave客户端执行get k1 获得v1,即表示主从模式设置成功
5、设置哨兵模式
5.1、进入/docker/redis/conf/637X文件夹下编辑sentinel.conf 文件
#注释bind #bind 0.0.0.0 #设置master的IP sentinel monitor mymaster 172.17.0.3 6379 1 #设置连接master的密码 sentinel auth-pass mymaster password
5.2、启动哨兵监控
#进入redis容器内 docker exec -ti containerID /bin/bash #执行哨兵配置文件,启动哨兵监控 redis-sentinel /etc/redis/sentinel.conf --sentinel
5.3、测试哨兵模式是否成功
#查看运行的docker容器; 停掉master容器 docker ps docker stop containerID(master)
查看sentinel运行日志,是否有选举
进入还在运行的redis容器客户端执行info replication 查看状态信息
可以看到新的master被选举出来,即哨兵模式搭建成功
首次部署的时候master自动选举失败,报错如下:
log info bottom: 1:X 28 Aug 2021 03:40:19.696 # Could not rename tmp config file (Device or resource busy) 1:X 28 Aug 2021 03:40:19.696 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
经查原因是 https://github.com/docker-library/redis/issues/287
I would guess the problem is that the conf file is mounted directly (by inode) and when redis goes to save/edit it, then that will fail because the "idempotent" way to write a file is to write it to a temporary file and then rename to the real file and that won't work on a bind-mounted file. Try mounting the directory of the config file instead. May want to make a "conf" sub-directory for it.
就是docker run 命令中在挂载配置文件的时候,直接挂载的文件,这里要挂载文件件就可以了。
原文链接:https://blog.csdn.net/dongrixueyang/article/details/121632074