From 9ba2b98e362c1481fd3cdbf46bc8720e60297a7c Mon Sep 17 00:00:00 2001 From: heibaiying <31504331+heibaiying@users.noreply.github.com> Date: Mon, 30 Dec 2019 16:37:46 +0800 Subject: [PATCH] =?UTF-8?q?Update=20Redis=5F=E5=93=A8=E5=85=B5=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Redis_哨兵模式.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/notes/Redis_哨兵模式.md b/notes/Redis_哨兵模式.md index 06ef610..0a75f5f 100644 --- a/notes/Redis_哨兵模式.md +++ b/notes/Redis_哨兵模式.md @@ -27,7 +27,8 @@ - 直接在从节点上执行 `slaveof {masterHost} {masterPort}` 命令。
-主从节点复制关系建立后,可以使用 `info replication` 命令查看相关的复制状态。需要注意的是每个从节点只能有一个主节点,但主节点可以同时拥有多个从节点,复制行为是单向的,只能由主节点复制到从节点,因此从节点默认都是只读模式,即 `slave-read-only` 的值默认为`yes`。 + +主从节点复制关系建立后,可以使用 `info replication` 命令查看相关的复制状态。需要注意的是每个从节点只能有一个主节点,但主节点可以同时拥有多个从节点,复制行为是单向的,只能由主节点复制到从节点,因此从节点默认都是只读模式,即 `slave-read-only` 的值默认为 `yes`。 ### 1.2 断开复制关系 @@ -36,7 +37,7 @@ 通过 slaveof 命令还可以实现切换主节点的操作,命令如下: ```shell -slaveof{newMasterIp} {newMasterPort} +slaveof {newMasterIp} {newMasterPort} ``` 需要注意的是,当你从一个主节点切换到另外一个主节点时,该从节点上的原有的数据会被完全清除,然后再执行复制操作,从而保证该从节点上的数据和新主节点上的数据相同。 @@ -57,7 +58,7 @@ slaveof{newMasterIp} {newMasterPort} #### 1. Sentinel 与 Redis Node -Redis Sentinel 是一个特殊的 Redis 节点。在哨兵模式创建时,需要通过配置指定 Sentinel 与 Redis Master Node 之间的关系,然后 Sentinel 会从主节点上获取所有从节点的信息,之后 Sentinel 会定时向主节点和从节点发送`info`命令获取其拓扑结构和状态信息。 +Redis Sentinel 是一个特殊的 Redis 节点。在哨兵模式创建时,需要通过配置指定 Sentinel 与 Redis Master Node 之间的关系,然后 Sentinel 会从主节点上获取所有从节点的信息,之后 Sentinel 会定时向主节点和从节点发送 `info` 命令获取其拓扑结构和状态信息。 #### 2. Sentinel 与 Sentinel @@ -65,25 +66,22 @@ Redis Sentinel 是一个特殊的 Redis 节点。在哨兵模式创建时,需 #### 3. 心跳机制 -通过以上两步所有的 Sentinel 节点以及它们与所有的 Redis 节点之间都已经彼此感知到,之后每个 Sentinel 节点会向主节点、 从节点、 以及其余 Sentinel 节点定时发送 ping 命令作为心跳检测, 来确认这些节点是否可达。 +通过以上两步所有的 Sentinel 节点以及它们与所有的 Redis 节点之间都已经彼此感知到,之后每个 Sentinel 节点会向主节点、从节点、以及其余 Sentinel 节点定时发送 ping 命令作为心跳检测, 来确认这些节点是否可达。 ### 2.2 故障转移原理 -每个 Sentinel 都会定时进行心跳检查,当发现某个主节点出现心跳检测超时的情况时,此时认为该主节点已经不可用,这种判定称为主观下线。之后该 Sentinel 节点会通过 `sentinel ismaster-down-by-addr` 命令向其他 Sentinel 节点询问对主节点的判断, 当 quorum 个 Sentinel 节点都认为该节点故障时,则执行客观下线,即认为该节点已经不可用。这也同时解释了为什么必须需要一组 Sentinel 节点,因为单个 Sentinel 节点很容易对故障状态做出误判。 +每个 Sentinel 都会定时进行心跳检查,当发现主节点出现心跳检测超时的情况时,此时认为该主节点已经不可用,这种判定称为主观下线。之后该 Sentinel 节点会通过 `sentinel ismaster-down-by-addr` 命令向其他 Sentinel 节点询问对主节点的判断, 当 quorum 个 Sentinel 节点都认为该节点故障时,则执行客观下线,即认为该节点已经不可用。这也同时解释了为什么必须需要一组 Sentinel 节点,因为单个 Sentinel 节点很容易对故障状态做出误判。 > 这里 quorum 的值是我们在哨兵模式搭建时指定的,后文会有说明,通常为 `Sentinel节点总数/2+1`,即半数以上节点做出主观下线判断就可以执行客观下线。 因为故障转移的工作只需要一个 Sentinel 节点来完成,所以 Sentinel 节点之间会再做一次选举工作, 基于 Raft 算法选出一个 Sentinel 领导者来进行故障转移的工作。 被选举出的 Sentinel 领导者进行故障转移的具体步骤如下: 1. 在从节点列表中选出一个节点作为新的主节点,选择方法如下: - + 过滤不健康或者不满足要求的节点; - + 选择 slave-priority(优先级)最高的从节点, 如果存在则返回, 不存在则继续; + 选择复制偏移量最大的从节点 , 如果存在则返回, 不存在则继续; + 选择 runid 最小的从节点。 - -2. Sentinel 领导者节点会对选出来的从节点执行 slaveof no one 命令让其成为主节点。 +2. Sentinel 领导者节点会对选出来的从节点执行 `slaveof no one` 命令让其成为主节点。 3. Sentinel 领导者节点会向剩余的从节点发送命令,让他们从新的主节点上复制数据。 4. Sentinel 领导者会将原来的主节点更新为从节点, 并对其进行监控, 当其恢复后命令它去复制新的主节点。 @@ -181,10 +179,12 @@ redis-sentinel sentinel-26381.conf 使用 `ps -ef | grep redis` 命令查看进程,此时输出应该如下:
-可以使用 `info replication` 命令查看 Redis 复制集的状态,此时输出如下。可以看到 6379 节点为 master 节点,并且有两个从节点,分别为 slave0 和 slave1,对应的端口为 6380 和 6381。 + +可以使用 `info replication` 命令查看 Redis 复制集的状态,此时输出如下。可以看到 6379 节点为 master 节点,并且有两个从节点,分别为 slave0 和 slave1,对应的端口为 6380 和 6381:
-可以使用 `info Sentinel` 命令查看任意 Sentinel 节点的状态,从最后一句输出可以看到 Sentinel 节点已经感知到 6379 的 master 节点,并且也知道它有两个 slaves 节点;同时 Sentinel 节点彼此之间也感知到,共有 3 个 Sentinel 节点。 + +可以使用 `info Sentinel` 命令查看任意 Sentinel 节点的状态,从最后一句输出可以看到 Sentinel 节点已经感知到 6379 的 master 节点,并且也知道它有两个 slaves 节点;同时 Sentinel 节点彼此之间也感知到,共有 3 个 Sentinel 节点: