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

 

posted @ 2022-07-08 18:03  RyderWang  阅读(567)  评论(0编辑  收藏  举报