Redis入门完整教程:哨兵的安装和部署
7749
上一节介绍了Redis Sentinel的基本架构,本节将介绍如何安装和部署 Redis Sentinel。 9.2.1 部署拓扑结构 下面将以3个Sentinel节点、1个主节点、2个从节点组成一个Redis Sentinel进行说明,拓扑结构如图9-13所示。
具体的物理部署如表9-2所示。
9.2.2 部署Redis数据节点 9.1节提到过,Redis Sentinel中Redis数据节点没有做任何特殊配置,按 照之前章节介绍的方法启动就可以,下面以一个比较简单的配置进行说明。 1.启动主节点 配置: redis-6379.conf port 6379 daemonize yes logfile "6379.log" dbfilename "dump-6379.rdb" dir "/opt/soft/redis/data/" 启动主节点: redis-server redis-6379.conf 确认是否启动。一般来说只需要ping命令检测一下就可以,确认Redis数 据节点是否已经启动。 $ redis-cli -h 127.0.0.1 -p 6379 ping PONG 此时拓扑结构如图9-14所示。
图9-14 启动主节点
2.启动两个从节点 配置: 两个从节点的配置是完全一样的,下面以一个从节点为例子进行说明, 和主节点的配置不一样的是添加了slaveof配置。 redis-6380.conf port 6380 daemonize yes logfile "6380.log" dbfilename "dump-6380.rdb" dir "/opt/soft/redis/data/" slaveof 127.0.0.1 6379 启动两个从节点: redis-server redis-6380.conf redis-server redis-6381.conf 验证: $ redis-cli -h 127.0.0.1 -p 6380 ping PONG $ redis-cli -h 127.0.0.1 -p 6381 ping PONG 3.确认主从关系 主节点的视角,它有两个从节点,分别是127.0.0.1:6380和127.0.0.1: 6381: $ redis-cli -h 127.0.0.1 -p 6379 info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=281,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=281,lag=0 ................. 从节点的视角,它的主节点是127.0.0.1:6379: $ redis-cli -h 127.0.0.1 -p 6380 info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up ................. 此时拓扑结构如图9-15所示。
9.2.3 部署Sentinel节点 3个Sentinel节点的部署方法是完全一致的(端口不同),下面以 sentinel-1节点的部署为例子进行说明。 1.配置Sentinel节点 redis-sentinel-26379.conf port 26379 daemonize yes logfile "26379.log" dir /opt/soft/redis/data sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 1)Sentinel节点的默认端口是26379。 2)sentinel monitor mymaster127.0.0.163792配置代表sentinel-1节点需要监 控127.0.0.1:6379这个主节点,2代表判断主节点失败至少需要2个Sentinel节 点同意,mymaster是主节点的别名,其余Sentinel配置将在下一节进行详细说 明。 2.启动Sentinel节点 Sentinel节点的启动方法有两种: 方法一,使用redis-sentinel命令: redis-sentinel redis-sentinel-26379.conf 方法二,使用redis-server命令加--sentinel参数: redis-server redis-sentinel-26379.conf --sentinel 两种方法本质上是一样的。 3.确认 Sentinel节点本质上是一个特殊的Redis节点,所以也可以通过info命令 来查询它的相关信息,从下面info的Sentinel片段来看,Sentinel节点找到了主 节点127.0.0.1:6379,发现了它的两个从节点,同时发现Redis Sentinel一共 有3个Sentinel节点。这里只需要了解Sentinel节点能够彼此感知到对方,同时 能够感知到Redis数据节点就可以了: $ redis-cli -h 127.0.0.1 -p 26379 info Sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3 当三个Sentinel节点都启动后,整个拓扑结构如图9-16所示。 至此Redis Sentinel已经搭建起来了,整体上还是比较容易的,但是有2 点需要强调一下: 1)生产环境中建议Redis Sentinel的所有节点应该分布在不同的物理机 上。 2)Redis Sentinel中的数据节点和普通的Redis数据节点在配置上没有任 何区别,只不过是添加了一些Sentinel节点对它们进行监控。
9.2.4 配置优化 了解每个配置的含义有助于更加合理地使用Redis Sentinel,因此本节将 对每个配置的使用和优化进行详细介绍。Redis安装目录下有一个 sentinel.conf,是默认的Sentinel节点配置文件,下面就以它作为例子进行说 明。 1.配置说明和优化 port 26379 dir /opt/soft/redis/data sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 #sentinel auth-pass
port 26379
daemonize yes
logfile "26379.log"
dir "/opt/soft/redis/data"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# 发现两个 slave 节点
sentinel known-slave mymaster 127.0.0.1 6380
sentinel known-slave mymaster 127.0.0.1 6381
# 发现两个 sentinel 节点
sentinel known-sentinel mymaster 127.0.0.1 26380 282a70ff56c36ed56e8f7ee6ada741
24140d6f53
sentinel known-sentinel mymaster 127.0.0.1 26381 f714470d30a61a8e39ae031192f1fe
ae7eb5b2be
sentinel current-epoch 0
failover-timeout通常被解释成故障转移超时时间,但实际上它作用于故 障转移的各个阶段: a)选出合适从节点。 b)晋升选出的从节点为主节点。 c)命令其余从节点复制新的主节点。 d)等待原主节点恢复后命令它去复制新的主节点。 failover-timeout的作用具体体现在四个方面: 1)如果Redis Sentinel对一个主节点故障转移失败,那么下次再对该主 节点做故障转移的起始时间是failover-timeout的2倍。 2)在b)阶段时,如果Sentinel节点向a)阶段选出来的从节点执行
slaveof no one一直失败(例如该从节点此时出现故障),当此过程超过 failover-timeout时,则故障转移失败。 3)在b)阶段如果执行成功,Sentinel节点还会执行info命令来确认a) 阶段选出来的节点确实晋升为主节点,如果此过程执行时间超过failover- timeout时,则故障转移失败。 4)如果c)阶段执行时间超过了failover-timeout(不包含复制时间), 则故障转移失败。注意即使超过了这个时间,Sentinel节点也会最终配置从 节点去同步最新的主节点。 (5)sentinel auth-pass 配置如下: sentinel auth-pass
sentinel monitor master-business-1 10.10.xx.1 6379 2
sentinel down-after-milliseconds master-business-1 60000
sentinel failover-timeout master-business-1 180000
sentinel parallel-syncs master-business-1 1
sentinel monitor master-business-2 10.16.xx.2 6380 2
sentinel down-after-milliseconds master-business-2 10000
sentinel failover-timeout master-business-2 180000
sentinel parallel-syncs master-business-2 1
3.调整配置 和普通的Redis数据节点一样,Sentinel节点也支持动态地设置参数,而 且和普通的Redis数据节点一样并不是支持所有的参数,具体使用方法如 下:
sentinel set
表9-3是sentinel set命令支持的参数。
有几点需要注意一下: 1)sentinel set命令只对当前Sentinel节点有效。 2)sentinel set命令如果执行成功会立即刷新配置文件,这点和Redis普 通数据节点设置配置需要执行config rewrite刷新到配置文件不同。 3)建议所有Sentinel节点的配置尽可能一致,这样在故障发现和转移时 比较容易达成一致。 4)表9-3中为sentinel set支持的参数,具体可以参考源码中的sentinel.c的 sentinelSetCommand函数。 5)Sentinel对外不支持config命令。 9.2.5 部署技巧 到现在有关Redis Sentinel的配置和部署方法相信读者已经基本掌握了, 但在实际生产环境中都有哪些部署的技巧?本节将总结一下。 1)Sentinel节点不应该部署在一台物理“机器”上。 这里特意强调物理机是因为一台物理机做成了若干虚拟机或者现今比较 流行的容器,它们虽然有不同的IP地址,但实际上它们都是同一台物理机, 同一台物理机意味着如果这台机器有什么硬件故障,所有的虚拟机都会受到 影响,为了实现Sentinel节点集合真正的高可用,请勿将Sentinel节点部署在 同一台物理机器上。 2)部署至少三个且奇数个的Sentinel节点。 3个以上是通过增加Sentinel节点的个数提高对于故障判定的准确性,因 为领导者选举需要至少一半加1个节点,奇数个节点可以在满足该条件的基 础上节省一个节点。有关Sentinel节点如何判断节点失败,如何选举出一个 Sentinel节点进行故障转移将在9.5节进行介绍。 4)只有一套Sentinel,还是每个主节点配置一套Sentinel? Sentinel节点集合可以只监控一个主节点,也可以监控多个主节点,也 就意味着部署拓扑可能是图9-19和图9-20两种情况。
图9-20 多套Sentine节点集合
那么在实际生产环境中更偏向于哪一种部署方式呢,下面分别分析两种 方案的优缺点。 方案一:一套Sentinel,很明显这种方案在一定程度上降低了维护成 本,因为只需要维护固定个数的Sentinel节点,集中对多个Redis数据节点进 行管理就可以了。但是这同时也是它的缺点,如果这套Sentinel节点集合出 现异常,可能会对多个Redis数据节点造成影响。还有如果监控的Redis数据 节点较多,会造成Sentinel节点产生过多的网络连接,也会有一定的影响。 方案二:多套Sentinel,显然这种方案的优点和缺点和上面是相反的, 每个Redis主节点都有自己的Sentinel节点集合,会造成资源浪费。但是优点 也很明显,每套Redis Sentinel都是彼此隔离的。 运维提示 如果Sentinel节点集合监控的是同一个业务的多个主节点集合,那么使 用方案一、否则一般建议采用方案二。