本篇文章带大家了解一下Redis中的哨兵模式。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
主从切换技术的方法是:
- 当主服务器宕机时,需要将从服务器手动切换(
slaveof no one
)到主从服务器,这需要人工干预。 - 这既费时又费力,但也会在一段时间内导致服务不可用。 这不是推荐的方法。
- 更多的时间,我们优先考虑哨兵模式,这是当前企业应用程序的主流模式。 Redis Sentinel是Redis的高度可用的实现。
- Sentinel是管理多个Redis实例的工具。 它可以监视,通知Redis并自动进行故障转移。
Redis Sentinel的基本概念
主从复制和Sentinel高可用性架构的示意图
Redis Sentinel架构
Redis Sentinel的主要功能Sentinel的主要功能包括:
主节点生存检测,主从操作检测,自动故障转移以及主从切换。
- Redis的最小标记配置是一台主机和一台从机;
- Redis的Sentinel系统可用于管理多个Redis服务器。
- 系统可以执行以下四个任务:
Redis Sentinel如何工作
- 当哨兵节点连接到Redis实例时,它将创建两个连接:cmd和pub/sub。 Sentinel通过cmd连接将命令发送到Redis,并通过pub/sub连接到Redis实例上的其他哨兵实例。
- Sentinel与Redis主节点和从节点进行交互的命令
- 每个Sentinel每秒向其已知的主实例,从属实例和其他Sentinel实例发送一个PING命令。
- 如果一个实例花费的时间比上次对PING命令的有效回复(毫秒)后down所指定的时间更长,那么Sentinel会将该实例标记为主观离线。
- 如果将主服务器标记为主观注销,则将监视主服务器的所有Sentinel节点以确认主服务器确实已经每秒进入一次主观注销状态。
- 如果将主服务器标记为主观注销,并且在指定的时间范围内有足够的哨兵(至少配置文件中指定的数量)与该判断相符,则将主服务器标记为客观下线。
- 通常,每个Sentinel每10秒向其所有已知的主服务器和从服务器发送INFO命令。 当Sentinel将主服务器标记为脱机时,Sentinel发送INFO命令给脱机主服务器的所有从属服务器的频率将从每10秒一次更改为每秒一次。
- Sentinel和其他哨兵协商主节点的状态。如果主节点处于SDOWN状态,投票将自动选择新的主节点。将其余的从节点指向新的主节点以进行数据复制。
- 如果没有足够的哨兵以允许主服务器注销,则将删除主服务器的客观注销状态。 当主服务器对Sentinel的PING命令返回有效答复时,主服务器的主观脱机状态将被删除。
- note
测试
- 创建配置文件
内容简单配置如下:
port 16379 # 哨兵端口号 daemonize yes sentinel monitor master 127.0.0.1 6379 1 # 监视master protected-mode no logfile "/usr/local/bin/sentinel-1/sentinel-1.log" # 日志文件
登录后复制
- 先启动redis设置集群,启动redis-cli,设6379为master
- 再启动sentinel
sudo redis-sentinel sentinel-1/sentinel.conf
登录后复制
- 关闭6379
- 查看另外两个redis-cli的角色情况
- 再启动6379
- 查看sentinel日志
sentinel.conf说明
# Example sentinel.conf # *** IMPORTANT *** # 绑定IP地址 # bind 127.0.0.1 192.168.1.1 # 保护模式(是否禁止外部链接,除绑定的ip地址外) # protected-mode no # port <sentinel-port> # 此Sentinel实例运行的端口 port 26379 # 默认情况下,Redis Sentinel不作为守护程序运行。 如果需要,可以设置为 yes。 daemonize no # 启用守护进程运行后,Redis将在/var/run/redis-sentinel.pid中写入一个pid文件 pidfile /var/run/redis-sentinel.pid # 指定日志文件名。 如果值为空,将强制Sentinel日志标准输出。守护进程下,如果使用标准输出进行日志记录,则日志将发送到/dev/null logfile "" # sentinel announce-ip <ip> # sentinel announce-port <port> # # 上述两个配置指令在环境中非常有用,因为NAT可以通过非本地地址从外部访问Sentinel。 # # 当提供announce-ip时,Sentinel将在通信中声明指定的IP地址,而不是像通常那样自动检测本地地址。 # # 类似地,当提供announce-port 有效且非零时,Sentinel将宣布指定的TCP端口。 # # 这两个选项不需要一起使用,如果只提供announce-ip,Sentinel将宣告指定的IP和“port”选项指定的服务器端口。 # 如果仅提供announce-port,Sentinel将通告自动检测到的本地IP和指定端口。 # # Example: # # sentinel announce-ip 1.2.3.4 # dir <working-directory> # 每个长时间运行的进程都应该有一个明确定义的工作目录。对于Redis Sentinel来说,/tmp就是自己的工作目录。 dir /tmp # sentinel monitor <master-name> <ip> <redis-port> <quorum> # # 告诉Sentinel监听指定主节点,并且只有在至少<quorum>哨兵达成一致的情况下才会判断它 O_DOWN 状态。 # # # 副本是自动发现的,因此您无需指定副本。 # Sentinel本身将重写此配置文件,使用其他配置选项添加副本。另请注意,当副本升级为主副本时,将重写配置文件。 # # 注意:主节点(master)名称不能包含特殊字符或空格。 # 有效字符可以是 A-z 0-9 和这三个字符 ".-_". sentinel monitor mymaster 127.0.0.1 6379 2 # 如果redis配置了密码,那这里必须配置认证,否则不能自动切换 # Example: # # sentinel auth-pass mymaster MySUPER--secret-0123passw0rd # sentinel down-after-milliseconds <master-name> <milliseconds> # # 主节点或副本在指定时间内没有回复PING,便认为该节点为主观下线 S_DOWN 状态。 # # 默认是30秒 sentinel down-after-milliseconds mymaster 30000 # sentinel parallel-syncs <master-name> <numreplicas> # # 在故障转移期间,多少个副本节点进行数据同步 sentinel parallel-syncs mymaster 1 # sentinel failover-timeout <master-name> <milliseconds> # # 指定故障转移超时(以毫秒为单位)。 它以多种方式使用: # # - 在先前的故障转移之后重新启动故障转移所需的时间已由给定的Sentinel针对同一主服务器尝试,是故障转移超时的两倍。 # # - 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。 # # - 取消已在进行但未生成任何配置更改的故障转移所需的时间 # # - 当进行failover时,配置所有slaves指向新的master所需的最大时间。 # 即使过了这个超时,slaves依然会被正确配置为指向master。 # # 默认3分钟 sentinel failover-timeout mymaster 180000 # 脚本执行 # # sentinel notification-script和sentinel reconfig-script用于配置调用的脚本,以通知系统管理员或在故障转移后重新配置客户端。 # 脚本使用以下规则执行以进行错误处理: # # 如果脚本以“1”退出,则稍后重试执行(最多重试次数为当前设置的10次)。 # # 如果脚本以“2”(或更高的值)退出,则不会重试执行。 # # 如果脚本因为收到信号而终止,则行为与退出代码1相同。 # # 脚本的最长运行时间为60秒。 达到此限制后,脚本将以SIGKILL终止,并重试执行。 # 通知脚本 # # sentinel notification-script <master-name> <script-path> # # 为警告级别生成的任何Sentinel事件调用指定的通知脚本(例如-sdown,-odown等)。 # 此脚本应通过电子邮件,SMS或任何其他消息传递系统通知系统管理员 监控的Redis系统出了问题。 # # 使用两个参数调用脚本:第一个是事件类型,第二个是事件描述。 # # 该脚本必须存在且可执行,以便在提供此选项时启动sentinel。 # # 举例: # # sentinel notification-script mymaster /var/redis/notify.sh # 客户重新配置脚本 # # sentinel client-reconfig-script <master-name> <script-path> # # 当主服务器因故障转移而变更时,可以调用脚本执行特定于应用程序的任务,以通知客户端,配置已更改且主服务器地址已经变更。 # # 以下参数将传递给脚本: # # <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port> # # <state> 目前始终是故障转移 "failover" # <role> 是 "leader" 或 "observer" # # 参数 from-ip, from-port, to-ip, to-port 用于传递主服务器的旧地址和所选副本的新地址。 # # 举例: # # sentinel client-reconfig-script mymaster /var/redis/reconfig.sh # 安全 # 避免脚本重置,默认值yes # 默认情况下,SENTINEL SET将无法在运行时更改notification-script和client-reconfig-script。 # 这避免了一个简单的安全问题,客户端可以将脚本设置为任何内容并触发故障转移以便执行程序。 sentinel deny-scripts-reconfig yes # REDIS命令重命名 # # # 在这种情况下,可以告诉Sentinel使用不同的命令名称而不是正常的命令名称。 # 例如,如果主“mymaster”和相关副本的“CONFIG”全部重命名为“GUESSME”,我可以使用: # # SENTINEL rename-command mymaster CONFIG GUESSME # # 设置此类配置后,每次Sentinel使用CONFIG时,它将使用GUESSME。 请注意,实际上不需要尊重命令案例,因此在上面的示例中写“config guessme”是相同的。 # # SENTINEL SET也可用于在运行时执行此配置。 # # 为了将命令设置回其原始名称(撤消重命名),可以将命令重命名为它自身: # # SENTINEL rename-command mymaster CONFIG CONFIG
登录后复制
更多编程相关知识,请访问:编程教学!!
以上就是聊聊Redis中的哨兵模式的详细内容,更多请关注Work网其它相关文章!