docker-compose实现Redis 哨兵模式
compose
compose - Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,通过Compose文件格式简化应用部署过程。
项目地址:https://gitcode.com/gh_mirrors/compose/compose
免费下载资源
·
之前写的一篇文章,主要讲了docker实现Redis 单机,哨兵,集群模式。如果只是部署几个容器还比较简单,但是随着容器环境的增加,每次使用docker命令启动创建容器,这些工作就比较复杂。所以本文主要使用docker-compose编排容器实现redis的哨兵模式。
1.安装docker-compose
这个可以参考官网Overview of installing Docker Compose | Docker Docs。安装完成之后可以查看docker-compose version的版本
2. 配置主从节点,哨兵配置文件
这里配置一主两从两哨兵
redis-master.conf
#绑定端口
port 6379
#设置指定的日志
logfile "redis-6379.log"
#Redis持久化擦用aof文件增量增加的方式
appendonly yes
appendfilename appendonly.aof
#设置主节点(master)认证的密码
masterauth 123456
#设置认证密码
requirepass 123456
redis-slave1.conf
#绑定端口
port 6380
#设置指定的日志
logfile "redis-6380.log"
#Redis持久化擦用aof文件增量增加的方式
appendonly yes
appendfilename appendonly.aof
# 配置master节点信息
# 格式:slaveof <masterip> <masterport>
##<masterip> 是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名.
#<redis-port> 是被监控节点所监听的端口号
#salveof-read-only yes #表示只读,replicaof-read-only yes #表示只读,replicaof 192.168.31.59 6379
slaveof docker_redis_master 6379
#设置主节点(master)认证的密码
masterauth 123456
#设置认证密码
requirepass 123456
redis-slave2.conf
#绑定端口
port 6381
#设置指定的日志
logfile "redis-6381.log"
#Redis持久化擦用aof文件增量增加的方式
appendonly yes
appendfilename appendonly.aof
# 配置master节点信息
# 格式:slaveof <masterip> <masterport>
##<masterip> 是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名.
#<redis-port> 是被监控节点所监听的端口号
#salveof-read-only yes #表示只读,replicaof-read-only yes #表示只读,replicaof 192.168.31.59 6379
slaveof docker_redis_master 6379
#设置主节点(master)认证的密码
masterauth 123456
#设置认证密码
requirepass 123456
sentinel-26379.conf
#绑定端口
port 26379
#设置redis的工作目录
dir "/app/application"
sentinel resolve-hostnames yes
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# <master-name> 是为这个被监控的master起的名字
#<ip> 是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名.只有版本高于 6.2 的 sentinel 才能解析主机名,但默认情况下不启用此功能。sentinel resolve-hostnames yes sentinel.conf。如果您的哨兵具有较旧的版本,则主机名应替换为 和 ip。
#<redis-port> 是被监控节点所监听的端口号
#<quorom> 设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor mymaster docker_redis_master 6379 2
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 60000
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456
#设置认证密码
requirepass 123456
sentinel-26380.conf
#绑定端口
port 26380
#设置redis的工作目录
dir "/app/application"
sentinel resolve-hostnames yes
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# <master-name> 是为这个被监控的master起的名字
#<ip> 是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名.只有版本高于 6.2 的 sentinel 才能解析主机名,但默认情况下不启用此功能。sentinel resolve-hostnames yes sentinel.conf。如果您的哨兵具有较旧的版本,则主机名应替换为 和 ip。
#<redis-port> 是被监控节点所监听的端口号
#<quorom> 设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor mymaster docker_redis_master 6379 2
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 60000
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456
#设置认证密码
requirepass 123456
3.编排redis容器
新建一个Redis编排主从的yml文件
docker-compose-redis.yml
version: "3.0"
networks:
mynetwork:
external: true
#单机模式(或主节点)
services:
docker_redis_master:
image: docker_redis
container_name: docker_redis_master
volumes:
- /home/lx/mytemp/redis-temp:/app/application/redis-temp
command: redis-server /app/application/redis-temp/redis-master.conf
ports:
- 6379:6379
networks:
- mynetwork
#从节点1
docker_redis_slave1:
image: docker_redis
container_name: docker_redis_slave1
volumes:
- /home/lx/mytemp/redis-temp:/app/application/redis-temp
command: redis-server /app/application/redis-temp/redis-slave1.conf
ports:
- 6380:6380
networks:
- mynetwork
#从节点2
docker_redis_slave2:
image: docker_redis
container_name: docker_redis_slave2
volumes:
- /home/lx/mytemp/redis-temp:/app/application/redis-temp
command: redis-server /app/application/redis-temp/redis-slave2.conf
ports:
- 6381:6381
network_mode: host
#哨兵1
docker_redis_sentinel26379:
image: docker_redis
container_name: docker_redis_sentinel26379
volumes:
- /home/lx/mytemp/redis-temp:/app/application/redis-temp
command: redis-sentinel /app/application/redis-temp/sentinel-26379.conf
ports:
- 26379:26379
networks:
- mynetwork
#哨兵2
docker_redis_sentinel26380:
image: docker_redis
container_name: docker_redis_sentinel26380
volumes:
- /home/lx/mytemp/redis-temp:/app/application/redis-temp
command: redis-sentinel /app/application/redis-temp/sentinel-26380.conf
ports:
- 26380:26380
networks:
- mynetwork
执行构建启动容器命令
docker-compose -f docker-compose-redis.yml up -d
登录主节点查看主从信息
登录启动哨兵查看哨兵信息
通过哨兵信息可以看见主节点的信息是docker容器ip,如果服务不是和redis共一个网络,就没办法访问。容器外的springboot服务无法连接
4.解决容器外服务无法访问
因为第三步使用的mynetwork是桥接模式,所以外部服务不能访问容器内的网路。所以修改redis的容器网路模式为host模式,并且redis的从节点和哨兵配置不能再使用主节点的网络别名(docker_redis_master)而是宿主机IP。
redis-slave1.conf
#绑定端口
port 6380
#设置指定的日志
logfile "redis-6380.log"
#Redis持久化擦用aof文件增量增加的方式
appendonly yes
appendfilename appendonly.aof
# 配置master节点信息
# 格式:slaveof <masterip> <masterport>
##<masterip> 是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名.
#<redis-port> 是被监控节点所监听的端口号
#salveof-read-only yes #表示只读,replicaof-read-only yes #表示只读,replicaof 192.168.31.59 6379
slaveof 192.168.31.59 6379
#设置主节点(master)认证的密码
masterauth 123456
#设置认证密码
requirepass 123456
redis-slave2.conf
#绑定端口
port 6381
#设置指定的日志
logfile "redis-6381.log"
#Redis持久化擦用aof文件增量增加的方式
appendonly yes
appendfilename appendonly.aof
# 配置master节点信息
# 格式:slaveof <masterip> <masterport>
##<masterip> 是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名.
#<redis-port> 是被监控节点所监听的端口号
#salveof-read-only yes #表示只读,replicaof-read-only yes #表示只读,replicaof 192.168.31.59 6379
slaveof 192.168.31.59 6379
#设置主节点(master)认证的密码
masterauth 123456
#设置认证密码
requirepass 123456
sentinel-26379.conf
#绑定端口
port 26379
#设置redis的工作目录
dir "/app/application"
sentinel resolve-hostnames yes
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# <master-name> 是为这个被监控的master起的名字
#<ip> 是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名.只有版本高于 6.2 的 sentinel 才能解析主机名,但默认情况下不启用此功能。sentinel resolve-hostnames yes sentinel.conf。如果您的哨兵具有较旧的版本,则主机名应替换为 和 ip。
#<redis-port> 是被监控节点所监听的端口号
#<quorom> 设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor mymaster 192.168.31.59 6379 2
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 60000
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456
#设置认证密码
requirepass 123456
sentinel-26380.conf
#绑定端口
port 26380
#设置redis的工作目录
dir "/app/application"
sentinel resolve-hostnames yes
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# <master-name> 是为这个被监控的master起的名字
#<ip> 是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名.只有版本高于 6.2 的 sentinel 才能解析主机名,但默认情况下不启用此功能。sentinel resolve-hostnames yes sentinel.conf。如果您的哨兵具有较旧的版本,则主机名应替换为 和 ip。
#<redis-port> 是被监控节点所监听的端口号
#<quorom> 设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor mymaster 192.168.31.59 6379 2
# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 60000
# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456
#设置认证密码
requirepass 123456
docker-compose-redis.yml
version: "3.0"
networks:
mynetwork:
external: true
#单机模式(或主节点)
services:
docker_redis_master:
image: docker_redis
container_name: docker_redis_master
volumes:
- /home/lx/mytemp/redis-temp:/app/application/redis-temp
command: redis-server /app/application/redis-temp/redis-master.conf
ports:
- 6379:6379
network_mode: host
#从节点1
docker_redis_slave1:
image: docker_redis
container_name: docker_redis_slave1
volumes:
- /home/lx/mytemp/redis-temp:/app/application/redis-temp
command: redis-server /app/application/redis-temp/redis-slave1.conf
ports:
- 6380:6380
network_mode: host
#从节点2
docker_redis_slave2:
image: docker_redis
container_name: docker_redis_slave2
volumes:
- /home/lx/mytemp/redis-temp:/app/application/redis-temp
command: redis-server /app/application/redis-temp/redis-slave2.conf
ports:
- 6381:6381
network_mode: host
#哨兵1
docker_redis_sentinel26379:
image: docker_redis
container_name: docker_redis_sentinel26379
volumes:
- /home/lx/mytemp/redis-temp:/app/application/redis-temp
command: redis-sentinel /app/application/redis-temp/sentinel-26379.conf
ports:
- 26379:26379
network_mode: host
#哨兵2
docker_redis_sentinel26380:
image: docker_redis
container_name: docker_redis_sentinel26380
volumes:
- /home/lx/mytemp/redis-temp:/app/application/redis-temp
command: redis-sentinel /app/application/redis-temp/sentinel-26380.conf
ports:
- 26380:26380
network_mode: host
再次up容器
登录主节点查看主从信息
登录启动哨兵查看哨兵信息
通过查看从节点和哨兵节点,都可以看出ip已经是宿主机ip了。再次启动容器外部的springboot服务连接redis
验证哨兵生效
停止主节点容器,查看哨兵信息,发现之前的从节点已经升级为主节点。
检查外部的容器外部的springboot服务连接redis,并且有异常出现
GitHub 加速计划 / compose / compose
33.27 K
5.15 K
下载
compose - Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,通过Compose文件格式简化应用部署过程。
最近提交(Master分支:2 个月前 )
501b5acd
Add `jhrotko` to Core Maintainers.
Signed-off-by: Laura Brehm <laurabrehm@hey.com>
9 天前
f51bc4cd
Signed-off-by: Guillaume Lours <705411+glours@users.noreply.github.com>
10 天前
更多推荐
已为社区贡献6条内容
所有评论(0)