Redis | 哨兵模式
1. 简介
Redis Sentinel(哨兵)是Redis提供的一种高可用性解决方案。它是一个独立的进程,用于监控和管理Redis主从模式的节点,并在主节点故障时自动进行故障转移。哨兵模式可以确保Redis集群的高可用性和数据一致性。
在哨兵模式中,有一个主节点(Master)和多个从节点(Slave),以及一个或多个哨兵(Sentinel)。主节点负责接收写操作和复制数据到从节点,而从节点负责复制主节点的数据。哨兵负责监控主节点和从节点的状态,并在主节点故障时自动将一个从节点提升为新的主节点。
以下是Redis哨兵模式的一些特点和工作原理:
- 哨兵选举:在启动时,每个哨兵都会对主节点进行投票选举,选出一个领头哨兵(Leader Sentinel)。领头哨兵负责协调故障转移过程。
- 监控:哨兵会定期检查Redis节点的健康状态,包括主节点和从节点的状态。如果发现主节点不可用,哨兵会触发故障转移。
- 故障转移:当主节点不可用时,领头哨兵会选出新的主节点,并通知其他哨兵和从节点进行切换。在故障转移期间,客户端的请求会被暂时拒绝,直到新的主节点选举完成。
- 数据一致性:在进行故障转移时,哨兵会确保新的主节点和从节点与旧的主节点数据保持一致。因此,即使主节点故障,数据不会丢失。
2. 配置
-
配置Redis主节点:
在主节点的配置文件(
redis.conf
)中,设置requirepass
选项为主节点的密码。例如:requirepass your_redis_password
-
配置Redis从节点:
在从节点的配置文件(
redis.conf
)中,设置masterauth
选项为主节点的密码,并使用replicaof
选项将从节点连接到主节点。例如:masterauth your_redis_password replicaof <master-ip> <master-port>
<master-ip>
和<master-port>
分别是主节点的IP地址和端口号。 -
配置Redis Sentinel:
创建一个名为
sentinel.conf
的新文件,其中指定以下选项:bind * sentinel resolve-hostnames yes sentinel monitor mymaster <master-ip> <master-port> <quorum> sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel auth-pass mymaster <master-password>
在
sentinel monitor
中,mymaster
是Redis实例的名称,<master-ip> <master-port>
是主节点的IP地址和端口号,<quorum>
是哨兵执行故障转移所需的最少哨兵数目。sentinel auth-pass
配置了连接到主节点的密码,以便哨兵能够正确连接到Redis主节点。 -
启动Redis服务器和哨兵:
首先,启动带密码的Redis主节点和从节点。然后,分别启动哨兵进程,并使用配置文件启动:
redis-sentinel /path/to/sentinel.conf
3. 演示
注意:因为每启动redis都会修改
sentinel.conf
,如果之前测试过想重新开始测试,要将sentinel.conf
内容恢复。
下面以1个主节点,2个从节点,1个哨兵节点演示。
文件树
hello-redis
├── docker-compose.yaml
└── sentinel
└── sentinel.conf
文件
sentinel.conf
bind 127.0.0.1
sentinel resolve-hostnames yes
sentinel monitor mymaster 192.168.200.2 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel auth-pass mymaster 123456
docker-compose.yaml
yaml
version: "3.8"
networks:
network:
ipam:
driver: default
config:
- subnet: '192.168.200.0/24'
services:
master:
container_name: master
image: redis:7.0
networks:
network:
ipv4_address: 192.168.200.2
command:
- redis-server
- --replicaof no one
- --requirepass 123456
- --masterauth 123456
- --bind * -::*
replica1:
container_name: replica1
image: redis:7.0
networks:
network:
ipv4_address: 192.168.200.3
command:
- redis-server
- --requirepass 123456
- --bind * -::*
- --masterauth 123456
- --replicaof 192.168.200.2 6379
depends_on:
- master
replica2:
container_name: replica2
image: redis:7.0
networks:
network:
ipv4_address: 192.168.200.4
command:
- redis-server
- --requirepass 123456
- --bind * -::*
- --masterauth 123456
- --replicaof 192.168.200.2 6379
depends_on:
- master
sentinel1:
container_name: sentinel1
image: redis:7.0
networks:
network:
ipv4_address: 192.168.200.5
volumes:
- ./sentinel:/root/sentinel
command:
- redis-sentinel
- /root/sentinel/sentinel.conf
- --sentinel
depends_on:
- master
- 启动:在
hello-go
文件夹下输入docker compose up
启动。 - 测试故障转移:
docker stop master
停止主节点,等待5秒就能从控制台或sentinel.conf
中看到主节点发生切换。 - 恢复故障主节点:
docker start master
就能看到master
节点又加入集群,并且以从节点身份。
4. 注意
- 在生产环境中,建议使用多个哨兵和Redis Cluster等高级解决方案来实现更可靠和自动化的高可用性。
- 主节点也要指定
masterauth
(主节点授权),防止主节点意外中止恢复正常后以无法以从节点身份连接到集群。