docker-compose实现Redis 哨兵模式

之前写的一篇文章,主要讲了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,并且有异常出现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值