Redis 主从切换
来源:互联网 发布:淘宝图片处理软件ps 编辑:程序博客网 时间:2024/05/22 20:51
背景介绍
Redis 2.8版开始正式提供名为Sentinel的主从切换方案,Sentinel用于管理多个Redis服务器实例,主要负责三个方面的任务:
- 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
启动Sentinel
使用–sentinel参数启动,并必须指定一个对应的配置文件,系统会使用配置文件来保存 Sentinel 的当前状态, 并在 Sentinel 重启时通过载入配置文件来进行状态还原。
redis-server /path/to/sentinel.conf --sentinel
使用TCP端口26379,可以使用redis-cli或其他任何客户端与其通讯。
如果启动 Sentinel 时没有指定相应的配置文件, 或者指定的配置文件不可写(not writable), 那么 Sentinel 会拒绝启动。
配置Sentinel
以下是一段配置文件的示例:sentinel monitor mymaster 127.0.0.1 6379 2sentinel down-after-milliseconds mymaster 60000sentinel failover-timeout mymaster 180000sentinel parallel-syncs mymaster 1sentinel monitor resque 192.168.1.3 6380 4sentinel down-after-milliseconds resque 10000sentinel failover-timeout resque 180000sentinel parallel-syncs resque 5
第一行配置指示 Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。
不过需要注意的是,无论你设置要多少个 Sentinel 同意才能判断一个服务器失效,一个 Sentinel 都需要获得系统中多数(majority) Sentinel 的支持,才能发起一次自动故障迁移,并预留一个给定的配置纪元 (Configuration Epoch ,一个配置纪元就是一个新主服务器配置的版本号)。也就是说,如果只有少数(minority)Sentinel 进程正常运作的情况下,是不能执行自动故障迁移的。
down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数(判定为主观下线SDOWN)。
parallel-syncs 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长,但越大就意味着越多的从服务器因为复制而不可用。可以通过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。
主观下线和客观下线
- 主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器做出的下线判断。
- 客观下线(Objectively Down, 简称 ODOWN)指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。
客观下线条件只适用于主服务器: 对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。
只要一个 Sentinel 发现某个主服务器进入了客观下线状态, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对失效的主服务器执行自动故障迁移操作。
每个Sentinel实例都执行的定时任务
- 每个 Sentinel 以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。
- 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 那么这个实例会被 Sentinel 标记为主观下线。 一个有效回复可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。
- 如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有 Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。
- 如果一个主服务器被标记为主观下线, 并且有足够数量的 Sentinel (至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。
- 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被 Sentinel 标记为客观下线时, Sentinel 向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
- 当没有足够数量的 Sentinel 同意主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器重新向 Sentinel 的 PING 命令返回有效回复时, 主服务器的主管下线状态就会被移除。
Sentinel API
有两种方式可以与Sentinel进行通讯:指令、发布与订阅。
Sentinel命令
PING :返回 PONG 。
SENTINEL masters :列出所有被监视的主服务器,以及这些主服务器的当前状态;
SENTINEL slaves :列出给定主服务器的所有从服务器,以及这些从服务器的当前状态;
SENTINEL get-master-addr-by-name : 返回给定名字的主服务器的 IP 地址和端口号。 如果这个主服务器正在执行故障转移操作, 或者针对这个主服务器的故障转移操作已经完成, 那么这个 命令返回新的主服务器的 IP 地址和端口号;
SENTINEL reset : 重置所有名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置操作清楚主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel ;
SENTINEL failover : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移。
客户端可以通过SENTINEL get-master-addr-by-name 获取当前的主服务器IP地址和端口号,以及SENTINEL slaves 获取所有的Slaves信息
发布与订阅信息
客户端可以将 Sentinel 看作是一个只提供了订阅功能的 Redis 服务器: 你不可以使用 PUBLISH 命令向这个服务器发送信息, 但你可以用 SUBSCRIBE 命令或者 PSUBSCRIBE 命令, 通过订阅给定的频道来获取相应的事件提醒。
一个频道能够接收和这个频道的名字相同的事件。 比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。
通过执行 PSUBSCRIBE * 命令可以接收所有事件信息。
+switch-master :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。
可以看出,我们使用Sentinel命令和发布订阅两种机制就能很好的实现和客户端的集成整合:
使用get-master-addr-by-name和slaves指令可以获取当前的Master和Slaves的地址和信息;而当发生故障转移时,即Master发生切换,可以通过订阅的+switch-master事件获得最新的Master信息。
*PS:更多Sentinel的可订阅事件参见官方文档。
sentinel.conf中的notification-script
在sentinel.conf中可以配置多个sentinel notification-script , 如sentinel notification-script mymaster ./check.sh
这个是在群集failover时会触发执行指定的脚本。脚本的执行结果若为1,即稍后重试(最大重试次数为10);若为2,则执行结束。并且脚本最大执行时间为60秒,超时会被终止执行。
PS:目前会存在该脚本被执行多次的问题,查找资料有人解释是:
脚本分为两个级别, SENTINEL_LEADER 和 SENTINEL_OBSERVER ,前者仅由领头 Sentinel 执行(一个 Sentinel),而后者由监视同一个 master 的所有 Sentinel 执行(多个 Sentinel)。
配置sentinel至少需要两个redis服务实例 127.0.0.1 6380 master 127.0.0.1 6381 slave1 127.0.0.1 6382 slave2 127.0.0.1 6383 slave3 主从配置,在从数据库添加 slaveof 127.0.0.1 6380 # 查看主从状态 info replication redis-cli -h 127.0.0.1 -p 6380 -a password info Replication # 查询Sentinel状态 info sentinel redis-cli -h 127.0.0.1 -p 26379 -a password info Sentinel 看到status=ok 说明正常sentinel配置 创建sentinel配置文件 vim /usr/local/redis-master/sentinel.conf port 26379 #sentinel需要监控的master信息 sentinel monitor master 127.0.0.1 6380 2 #master password sentinel down-after-milliseconds master 5000 #master被当前sentinel实例认定为“失效”(SDOWN)的间隔时间 sentinel failover-timeout master 60000 sentinel auth-pass master password sentinel config-epoch master 12 创建其他两个配置文件 端口分别为26479 26579 /usr/local/redis-slave1/sentinel.conf /usr/local/redis-slave2/sentinel.conf 启动sentinel nohup /usr/local/redis-master/redis-server /usr/local/redis-master/sentinel.conf --sentinel & nohup /usr/local/redis-slave1/redis-server /usr/local/redis-slave1/sentinel.conf --sentinel & nohup /usr/local/redis-slave2/redis-server /usr/local/redis-slave2/sentinel.conf --sentinel & 主从切换测试关掉主命令redis-cli -h 127.0.0.1 -p 6380 -a password shutdown 自动切换后sentinel、主、从的配置文件都会发生改变,会在配置文件的最后增加信息 哨兵启动和主数据库建立连接后,会定时执行下面3个操作 1、每10秒哨兵会向主数据库和从数据库发送INFO命令 2、每2秒哨兵会向主数据库和从数据库的_sentinel_:hello 频道发送自己的信息 3、每1秒哨兵会向主数据库、从数据库和其他哨兵节点发送PING命令 redis命令 slaveof no one 全当前数据库停止接收其他数据库同步并转换成主数据库 min-slaves-to-write 3 只有三个或三个以上从数据库连接到主数据库时,主数据库才是可写的,否则会返回错误 repl-diskless-sync yes 启用无硬盘复制 slave-priority 100 slave优先级
- redis主从切换
- redis 主从切换
- redis主从切换
- redis主从切换部署
- Redis 主从切换
- Redis主从自动切换
- redis主从切换
- redis主从配置及主从切换
- redis主从配置及主从切换
- redis主从配置及主从切换
- redis主从配置及主从切换
- redis主从配置及主从切换 .
- redis主从配置及主从切换
- redis主从配置及主从切换
- redis主从配置及主从切换
- Redis主从复制和主从切换
- Redis主从复制和主从切换
- redis主从+sentinel主从自动切换
- Map与List性能比较
- Sentinel-Redis高可用方案(一):主从复制
- 我所理解的面向过程与面向对象
- 在应用程序内加载网页
- qtouch云能效平台
- Redis 主从切换
- 小知识
- 编译 配置
- C语言常用字符串函数
- 构建伪Update服务器工具isr-evilgrade
- C++ Socket编程步骤
- Service
- JAVA虚拟机
- 华为手机Log不打印