之前写的一篇文章,主要讲了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 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐