docker-compose部署Redis哨兵模式集群
由于服务中根据业务不同使用了redis的多个数据库db0-db15,redis cluster集群只有db0,其他库不显示,无法使用,于是选择了Redis哨兵模式集群。
我的目录结构:
Sentinel配置
Sentinel配置文件路径:
/opt/redis-sentinel/sentinel
redis-sentinel-1.conf
# bind 127.0.0.1 # 哨兵的端口号 # 因为各个哨兵节点会运行在单独的Docker容器中 # 所以无需担心端口重复使用 # 如果需要在单机 port 26379 # 设定密码认证 requirepass "meiyoumima2021" # 配置哨兵的监控参数 # 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum> # master-name是为这个被监控的master起的名字 # ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名 # redis-port是被监控节点所监听的端口号 # quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了 sentinel monitor local-master 127.0.0.1 6379 2 # 连接主节点的密码 # 格式:sentinel auth-pass <master-name> <password> sentinel auth-pass local-master Zdww2021 # master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒 # 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
redis-sentinel-2.conf
# bind 127.0.0.1 # 哨兵的端口号 # 因为各个哨兵节点会运行在单独的Docker容器中 # 所以无需担心端口重复使用 # 如果需要在单机 port 26380 # 设定密码认证 requirepass "meiyoumima2021" # 配置哨兵的监控参数 # 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum> # master-name是为这个被监控的master起的名字 # ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名 # redis-port是被监控节点所监听的端口号 # quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了 sentinel monitor local-master 127.0.0.1 6379 2 # 连接主节点的密码 # 格式:sentinel auth-pass <master-name> <password> sentinel auth-pass local-master Zdww2021 # master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒 # 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
redis-sentinel-3.conf
# bind 127.0.0.1 # 哨兵的端口号 # 因为各个哨兵节点会运行在单独的Docker容器中 # 所以无需担心端口重复使用 # 如果需要在单机 port 26381 # 设定密码认证 requirepass "meiyoumima2021" # 配置哨兵的监控参数 # 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum> # master-name是为这个被监控的master起的名字 # ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名 # redis-port是被监控节点所监听的端口号 # quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了 sentinel monitor local-master 127.0.0.1 6379 2 # 连接主节点的密码 # 格式:sentinel auth-pass <master-name> <password> sentinel auth-pass local-master Zdww2021 # master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒 # 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
Redis配置
/opt/redis-sentinel/server
redis-master.conf
# bind 127.0.0.1
# 启用保护模式
# 即在没有使用bind指令绑定具体地址时
# 或在没有设定密码时
# Redis将拒绝来自外部的连接
# protected-mode yes
# 监听端口
port 6379
# 启动时不打印logo # 这个不重要,想看logo就打开它 always-show-logo yes # 设定密码认证 requirepass meiyoumima2021 # 禁用KEYS命令 # 一方面 KEYS * 命令可以列出所有的键,会影响数据安全 # 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间 # 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃 #rename-command KEYS "" # 此外还应禁止 FLUSHALL 和 FLUSHDB 命令 # 这两个命令会清空数据,并且不会失败
redis-slave1.conf
# bind 127.0.0.1
# 启用保护模式
# 即在没有使用bind指令绑定具体地址时
# 或在没有设定密码时
# Redis将拒绝来自外部的连接
# protected-mode yes
# 监听端口
port 6380
# 启动时不打印logo # 这个不重要,想看logo就打开它 always-show-logo no # 设定密码认证 requirepass meiyoumima2021 # 禁用KEYS命令 # 一方面 KEYS * 命令可以列出所有的键,会影响数据安全 # 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间 # 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃 #rename-command KEYS "" # 此外还应禁止 FLUSHALL 和 FLUSHDB 命令 # 这两个命令会清空数据,并且不会失败 # 配置master节点信息 # 格式: #slaveof <masterip> <masterport> # 此处masterip所指定的redis-server-master是运行master节点的容器名 # Docker容器间可以使用容器名代替实际的IP地址来通信 slaveof redis-server-master 6379 # 设定连接主节点所使用的密码 masterauth meiyoumima2021
redis-slave2.conf
# bind 127.0.0.1
# 启用保护模式
# 即在没有使用bind指令绑定具体地址时
# 或在没有设定密码时
# Redis将拒绝来自外部的连接
# protected-mode yes
# 监听端口
port 6381
# 启动时不打印logo
# 这个不重要,想看logo就打开它
always-show-logo no
# 设定密码认证
requirepass meiyoumima2021
# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的键,会影响数据安全
# 另一方面 KEYS 命令会阻塞数据库,在数据库中存储了大量数据时,该命令会消耗很长时间
# 期间对Redis的访问也会被阻塞,而当锁释放的一瞬间,大量请求涌入Redis,会造成Redis直接崩溃
#rename-command KEYS ""
# 此外还应禁止 FLUSHALL 和 FLUSHDB 命令
# 这两个命令会清空数据,并且不会失败
# 配置master节点信息
# 格式:
#slaveof <masterip> <masterport>
# 此处masterip所指定的redis-server-master是运行master节点的容器名
# Docker容器间可以使用容器名代替实际的IP地址来通信
slaveof redis-server-master 6379
# 设定连接主节点所使用的密码
masterauth meiyoumima2021
docker-compose配置
sentinel和redis-server分别用两个docker-compose文件来管理
sentinel的docker-compose.yml文件
version: '3' services: redis-sentinel-1: image: redis container_name: redis-sentinel-1 restart: always # 为了规避Docker中端口映射可能带来的问题 # 这里选择使用host网络 #network_mode: host ports: - 26379:26379 volumes: - ./s1/:/usr/local/etc/redis/conf/ # 指定时区,保证容器内时间正确 environment: TZ: "Asia/Shanghai" # sysctls: # net.core.somaxconn: '511' command: ["redis-sentinel", "/usr/local/etc/redis/conf/redis-sentinel-1.conf"] redis-sentinel-2: image: redis container_name: redis-sentinel-2 restart: always #network_mode: host ports: - 26380:26380 volumes: - ./s2/:/usr/local/etc/redis/conf/ environment: TZ: "Asia/Shanghai" # sysctls: # net.core.somaxconn: '511' command: ["redis-sentinel", "/usr/local/etc/redis/conf/redis-sentinel-2.conf"] redis-sentinel-3: image: redis container_name: redis-sentinel-3 restart: always #network_mode: host ports: - 26381:26381 volumes: - ./s3/:/usr/local/etc/redis/conf/ environment: TZ: "Asia/Shanghai" # sysctls: # net.core.somaxconn: '511' command: ["redis-sentinel", "/usr/local/etc/redis/conf/redis-sentinel-3.conf"] networks: default: external:
name:server_default
redis的docker-compose文件
version: '3' services: # 主节点的容器 redis-server-master: image: redis container_name: redis-server-master restart: always # 为了规避Docker中端口映射可能带来的问题 # 这里选择使用host网络,mac下虚拟机不支持 #network_mode: host ports: - 6379:6379 # 指定时区,保证容器内时间正确 environment: TZ: "Asia/Shanghai" volumes: # 映射配置文件和数据目录 - ./redis-master.conf:/usr/local/etc/redis/redis.conf - ./data/redis-master:/data #sysctls: # net.core.somaxconn: '511' command: ["redis-server", "/usr/local/etc/redis/redis.conf"] # 从节点1的容器 redis-server-slave-1: image: redis container_name: redis-server-slave-1 restart: always #network_mode: host ports: - 6380:6380 depends_on: - redis-server-master environment: TZ: "Asia/Shanghai" volumes: - ./redis-slave1.conf:/usr/local/etc/redis/redis.conf - ./data/redis-slave-1:/data command: ["redis-server", "/usr/local/etc/redis/redis.conf"] # 从节点2的容器 redis-server-slave-2: image: redis container_name: redis-server-slave-2 restart: always #network_mode: host ports: - 6381:6381 depends_on: - redis-server-master environment: TZ: "Asia/Shanghai" volumes: - ./redis-slave2.conf:/usr/local/etc/redis/redis.conf - ./data/redis-slave-2:/data command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
哨兵模式验证
先启动Redis 后启动sentinel
启动redis
在/opt/redis-sentinel/server路径下执行
docker-compose up
启动sentinel
在/opt/redis-sentinel/sentinel路径下执行
docker-compose up