一、概念
Redis哨兵(Sentinel)是Redis官方推荐的高可用解决方案。当运行多个Sentinel时,它们会互相协作,达到一个分布式的系统。哨兵有两个主要的任务:
- 监控(Monitoring):哨兵会定期检查主服务器和从服务器是否按照预期正常工作。
- 通知(Notification):如果某个Redis节点出现问题,哨兵可以通过API发送通知给系统管理员。
- 自动故障迁移(Automatic failover):如果主服务器无法正常工作,那么哨兵可以开始一个故障迁移过程,将其中一个从服务器升级为主服务器,并让其余的从服务器改为复制新的主服务器;当客户端试图连接不可用的主服务器时,哨兵会返回新主服务器的地址,以便客户端重新连接。
要启动一个哨兵,你需要一个哨兵配置文件,你可以从Redis distribution获取一个样本配置文件,或者创建一个新的。
在配置文件中,你需要指定主服务器(和从服务器,如果有的话)的地址,以及其他一些哨兵行为的配置选项。
然后,你可以通过 redis-sentinel /path/to/sentinel.conf
命令启动哨兵。注意,哨兵会在启动后修改配置文件,将状态和其他信息写入文件,所以用户必须确保哨兵进程有写入配置文件的权限。
二、配置哨兵
要配置Redis Sentinel模式,您需要遵循以下步骤:
-
启动主Redis服务器:首先,我们需要运行主Redis服务器。这可以通过在命令行中键入以下内容来实现:
redis-server
这将在默认端口6379上启动Redis主服务器。
-
启动从Redis服务器:要创建从服务器,我们需要在不同的端口上启动另一个redis-server实例,并通过配置文件或命令行告诉它主服务器的位置。例如,以下命令将在端口6380上启动一个从服务器,主服务器的地址为127.0.0.1端口6379:
redis-server --port 6380 --slaveof 127.0.0.1 6379
-
配置Sentinel服务器:Sentinel服务器的配置存储在一个名为sentinel.conf的配置文件中。在最简单的情况下,这个文件可以只包含一行,告诉Sentinel主服务器的位置。例如:
sentinel monitor mymaster 127.0.0.1 6379 2
这告诉Sentinel监控一个名为"mymaster"的主服务器,该服务器在127.0.0.1的6379端口上运行,并且要求至少有2个Sentinel服务器同意主服务器已经无法访问,才能执行故障转移。
-
启动Sentinel服务器:然后,我们可以启动Sentinel服务器。这可以通过在命令行中运行以下命令来实现:
redis-sentinel /path/to/sentinel.conf
这将启动Sentinel服务器,并使用我们在sentinel.conf中指定的配置。
-
添加更多的Sentinel服务器:在生产环境中,通常会运行多个Sentinel服务器,以便在一个Sentinel出现问题时,其他Sentinel可以继续运行。您可以通过更改sentinel.conf文件和端口号,然后运行上面的redis-sentinel命令来启动更多的Sentinel服务器。
注意:在生产环境中,一般建议至少运行3个Sentinel服务器,以防止“脑裂”现象发生。
三、sentinel.conf文件
sentinel.conf
文件是用于配置Redis Sentinel的参数和行为的,以下是一些可以在该文件中配置的主要选项:
-
sentinel monitor <master-name> <ip> <port> <quorum>
这是监控Redis主服务器的最重要的指令。
<master-name>
是主服务器的名称,<ip>
和<port>
是主服务器的IP地址和端口号,<quorum>
是开始故障转移所需的最小Sentinel数量。 -
sentinel down-after-milliseconds <master-name> <milliseconds>
这是指定Sentinel认为Redis主服务器已经断开连接所需的毫秒数。
-
sentinel failover-timeout <master-name> <timeout>
这是指定开始故障转移之前Sentinel等待的时间。
-
sentinel parallel-syncs <master-name> <numslaves>
这是在故障转移期间,可以同时与新主服务器进行同步的从服务器的最大数量。
-
sentinel auth-pass <master-name> <password>
如果主服务器需要密码进行连接,则可以使用此参数来设置密码。
-
sentinel notification-script <master-name> <script-path>
这是当主服务器状态发生改变时,Sentinel会执行的脚本的路径。
-
sentinel client-reconfig-script <master-name> <script-path>
这是当故障转移结束时,Sentinel会执行的脚本的路径。
这些只是一些基本的配置选项,更多的配置选项可以在Redis官方文档中找到。在配置这些选项时,需要根据您自己的应用和环境来调整合适的值。
配置举例:
# 监控名为mymaster的Redis主服务器
sentinel monitor mymaster 127.0.0.1 6379 2
# 当主服务器无法按照指定的时间间隔发送回复,那么判断主服务器为失效
sentinel down-after-milliseconds mymaster 30000
# 当主服务器失效后,启动failover
sentinel failover-timeout mymaster 180000
# 指定密码
sentinel auth-pass mymaster MySuperSecretPassword
四、哨兵工作原理
Redis哨兵的工作原理如下:
- 服务监控:哨兵通过定期发送ping命令来监控master和slave服务的运行状态。
- 主服务失效判断:当哨兵连续一段时间(比如10次,时间间隔约1秒)收不到master实例的pong响应,哨兵就会判断master实例为主观下线。当超过半数的哨兵节点都判断master实例为主观下线时,哨兵集群就会判断master实例为客观下线。
- 服务选举:如果master实例为客观下线,哨兵会从slave实例中选举出一个最优的slave实例进行升级,选举规则包括:优先选择复制偏移量最大的slave,如果偏移量相同,则选择run id最小的slave,选举出的slave实例会升级为新的master实例。
- 配置更新:当发生主从切换时,哨兵会通知其他的slave实例和哨兵实例,让它们更新自己的配置,将升级后的master实例地址替换为新的master实例。
- 客户端通知:客户端订阅哨兵的消息,当发生主从切换时,哨兵会通知客户端。
哨兵的工作原理保证了Redis集群的高可用性,当master实例失败时,能够自动进行故障转移,将影响降到最低。
网友评论