docker+redis使用配置文件方式配置redis,一主+一从+2哨兵
** 一、环境**
服务器 | ip | 搭建的环境 |
---|---|---|
centOS7 | 192.168.6.136 | redis的主、哨兵一个 |
centOS7 | 192.168.6.139 | redis的从、哨兵一个 |
两台服务器前提已经安装好docker了。
二、构建redis主从
1. 构建Master
docker pull redis #我这里是下载的最新当前是6.0版本
#创建挂载目录
mkdir /home/docker/redis/conf
mkdir /home/docker/redis/data
cd /home/docker/redis/conf
#配置文件 可以从官网中下载个模板
wget http://download.redis.io/redis-stable/redis.conf
#配置
bind 0.0.0.0
port 16379
logfile "redis.log"
#密码
#保护模式
protected-mode yes
requirepass platform_888888
masterauth platform_888888
#redis最大使用内存 10GB
maxmemory 10737418240
#内存满策略,使用移除最近未使用的key
maxmemory-policy allkeys-lru
#开启AOF
appendonly yes
#让服务后台运行 此处必须no,因为我们要命令执行会与docker的-d冲突
#daemonize yes
#启动master
docker run -p 6379:6379 -e TZ=Asia/Shanghai -v /home/docker/redis/data:/data -v /home/docker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d --name redis redis:latest redis-server /usr/local/etc/redis/redis.conf
2. 构建slave
构建方法与master一致,只不过配置我们需要改一下.如下:
bind 0.0.0.0
port 6379
#密码
requirepass platform_888888
#redis最大使用内存10GB
maxmemory 10737418240
#内存满策略,使用移除最近未使用的key
maxmemory-policy allkeys-lru
#保护模式
protected-mode yes
#开启AOF
appendonly yes
logfile "redis.log"
#主库密码
masterauth platform_888888
#主库地址
replicaof 192.168.6.136 6379
#让服务后台运行
#daemonize no
启动
docker run -p 6379:6379 -e TZ=Asia/Shanghai -v /home/docker/redis/data:/data -v /home/docker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d --name redis redis:latest redis-server /usr/local/etc/redis/redis.conf
redis-server /usr/local/etc/redis/redis.conf
docker logs -f redis #查看日志,一般没error就是配置成功了。
docker exec -it redis bash #进入容器内部
redis-cli #启动客户端
info replication #查看配置状态
#如果配置了密码,需要验证密码
auth password
slave以下信息
验证主从:
在136上执行set k1 2;
在139上执行 get k1,成功取到;
三 、构建哨兵
配置哨兵的配置文件 (139服务下
):
cd /home/docker/redis/conf ;#进入配置文件目录
vim sentinel.conf #编辑并创建该文件
bind 0.0.0.0
port 26379
dir "/tmp"
#保护模式
protected-mode yes
sentinel deny-scripts-reconfig yes
#监听redis的master节点 ip 端口 当满足多少个sentinel投票选举就切换
sentinel monitor mymaster 192.168.6.136 16379 1
#密码
sentinel auth-pass mymaster platform_888888
#主mastr下线检测3000毫秒
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
#切换失败的时间
sentinel failover-timeout mymaster 10000
启动sentinel1:
docker run -it --name sentinel -d -p 26379:26379 --net=host -e TZ=Asia/Shanghai -v /home/docker/redis/conf/sentinel.conf:/usr/local/etc/redis/sentinel.conf --restart=always redis:latest redis-sentinel /usr/local/etc/redis/sentinel.conf
3.1 构建第二个sentinel (136服务器)
配置与139的sentinel差不多,把端口改成36379启动就行然后启动
四、配置springboot(基于Spring的RedisTemplate)
4.1 测试
在136主redis服务器中执行
docker stop redis
可以看到sentinel监听到136下线后选举了139作为master
重启136后停止139又选举136作为新的master,springboot也做了切换
五、遇到的问题和坑
4.1 sentinel启动的时候就检测到slave下线了
1,看日志启动sentinel的时候就发现slave后马上就打印+sdown slave日志了,sentinel认为这个slave下线了。导致选举的时候选举不了。打印 no-good-salve信息
解决方法:
这个坑,初步判断是redis在docker内部网络通信的问题。
在启动redis主从和sentinel的时候指定docker的–net=host
意思就是使用宿主机的ip和端口。