Redis 高可用(一) 主从理论

2020-11-16  本文已影响0人  _大叔_

Redis 高可用主要是使用 主从复制 和 哨兵来做,集群不能算是高可用,因为当节点B有大量的数据,如果节点B挂掉,就再无法访问到节点B的数据,因为其他节点并不会有节点B的数据。其中的原因跟本身Redis的设计有关。

复制

使用和配置主从复制非常简单,从 Redis 服务器(下文称 slave)能精确得复制主 Redis 服务器(下文称 master)的内容。每次当 slave 和 master 之间的连接断开时, slave 会自动重连到 master 上,并且无论这期间 master 发生了什么, slave 都将尝试让自身成为 master 的精确副本。
这个系统的运行依靠三个主要的机制:

Redis 默认使用异步复制,其特点是低延迟和高性能。slave 服务会异步地确认其从 master 服务器周期接收到的数据量。

Redis 复制的非常重要的事实:

强烈建议在 master 和在 slave 中启用持久化。否则会有如下问题:
我们设置节点 A 为 master 并关闭它的持久化设置,slave B 和 C 从 节点 A 复制数据。节点 A 崩溃,但是他有一些自动重启的系统可以重启进程。但是由于持久化被关闭了,节点重启后其数据集合为空。节点 B 和 节点 C 会从节点 A 复制数据,但是节点 A 的数据集是空的,因此复制的结果是它们会销毁自身之前的数据副本。
当 Redis Sentinel 被用于高可用并且 master 关闭持久化,这时如果允许自动重启进程也是很危险的。例如, master 可以重启的足够快以致于 Sentinel 没有探测到故障,因此上述的故障模式也会发生。

工作模式

Redis不管是旧版还是新版,复制的实现都可以分为七个步骤:

1. 设置主服务的地址与端口
127.0.0.1:12345> SLAVEOF 127.0.0.1 6379

当客户端向 slave 器发送以上命令时或者在配置文件中配置slaveof选项。slave 将向发送 SLAVEOF 命令的 客户端 返回OK,表示复制指令已经被接收,而实际上复制工作是在OK返回之后进行。

2. 建立套接字连接

slave 器根据设置的套接字创建连向 master 的套接字连接。 master 接收 slave 器的套接字连接之后,为该套接字创建响应的客户端状态,并将此时的 slave 器看做是 master 的客户端,也就是该 slave 器同时具备服务器与客户端两个身份。

3. 发送PING命令

slave 成为 master 的客户端之后,做的第一件事就是向 master 发送PING命令。PING命令主要有两种作用:

slave 在发送PING命令之后将遇到以下三种情况的其中一种:

4. 身份验证

slave 接收到 master 返回的“PONG”回复,接下来就需要考虑身份验证的事。

如果 slave 设置了 masterauth 选项,那么进行身份验证
如果 slave 没有设置 masterauth 选项,那么不进行身份验证
slave 在身份验证的时候可能遇到三种情况

5. 发送端口信息

在身份验证步骤之后,slave 将执行命令REPLCONF listening-port <port>,向 master 发送 slave 的监听端口号。

6. 同步 7. 命令传播

slave 向 master 发送PSYNC命令,执行同步操作,值得注意的是只有 slave 是 master 的客户端,但是执行同步操作之后,master 也会成为 slave 的客户端。

master slave 备注
主从完成同步 主从完成同步 主从都启动,并完成同步
set k1,v1 set k1,v1 master 执行set会传播到slave 进行set
set k2,v2 set k2,v2 master 执行set会传播到slave 进行set
...... ...... 更多的操作
主从断开连接 主从断开连接 slave故障停止了同步操作
set k5002,v5002 slave 尝试重新连接
set k5003,v5003 slave 尝试重新连接
主从重连接成功 主从重连接成功 主从重连接成功
PSYNC 连接成功,slave 向 master 发送PSYNC命令,执行同步,以上第6步
向slave返回+CONTINUE,并执行同步
接收+CONTINUE slave 接收+CONTINUE,准备执行部分同步
向 slave 发送 set k5002,v5002 和 set k5003,v5003 命令
set k5002,v5002 set k5003,v5003 从接收到命令并执行
主从完成同步 主从完成同步 同步完成

高版本的 Redis slave 默认为只读。

上一篇 下一篇

猜你喜欢

热点阅读