Redis进击(二)搭建Redis主从复制服务集群(一主两从、反客为主)【Windows环境】

楔子:某个时间,由于不清不楚的某些原因,导致了一次严重的线上事故。后来,开发不清不楚的配合把项目升级到了 Redis 高可用集群的哨兵模式(Redis-Sentinel),再后来,我们逐渐的又不清不楚的淡忘了这件事。节点化的工作很容易导致一定程度上只知其然而不知其所以然,这是项目开发中的一个众相。回想起来,我还是想记点什么。

该篇可以为以下应用场景提供解决方案:

  • 读写分离场景:其中主节点以写为主(可读可写),从节点只能读不可写
  • Redis 容灾:如果主节点出现故障,数据丢失,则可以通过 salve 进行恢复(其中主节点写入的数据会同步到从节点 salve 上,但不准时,因为数据不是实时同步,所以主节点可能会存在从 salve 恢复数据后有数据丢失问题)

1. Redis 枝繁叶茂

为了使得集群在一部分节点下线或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运作, Redis 集群对节点使用了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。[ 摘自 Redis 集群中的主从复制 ]

简单的来说,就是一个主节点(master)可以拥有一个甚至多个从节点 slave,而一个 slave 也可以拥有多个 slave,就像一棵枝繁叶茂的大树般,树叉生树叉,最终形成织罗密布的强大的多级服务器集群架构。

Redis 主从复制同步的几种方法:

  • 一主二仆:一个 Master 两个 Slave
  • 薪火相传:A - B - C ,B既是C的 Master,又是A的 Slave 从节点,即上一个 Slave 是下一个 Slave 的 Master
  • 反客为主:主节点挂掉后,手动升级从节点为主节点
  • 哨兵模式:主节点挂掉后,自动升级从节点为主节点(反客为主)

这篇主要介绍 一主二仆 和 手动反客为主。哨兵模式后面另开一篇进行介绍。Redis 安装操作如有疑问请参考 Redis进击(一)从0到1,Redis的安装与使用

2. Redis 一主二仆

2.1. 配置操作

2.1.1 准备三份 Redis

解压已经下载好的 Redis 资源,然后再复制两份,都放在同一目录下。我本地修改了复制后的文件夹名称,以端口号区分。如下:

2.1.2 修改 redis.windows.conf

不需要修改 redis.windows.conf 配置文件的 6379:

  • 6379 的文件夹,这里不需要修改 redis.windows.conf 配置文件

需要修改 redis.windows.conf 配置文件的 6380、6381:

  • 该配置文件的第约40行,需要修改端口号
  • 该配置文件的第约200行,需要增加子节点(后面用作 master 的从节点)

6380 的文件夹,修改 redis.windows.conf 如下:

# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 6380

......

# slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379

6381 的文件夹,修改 redis.windows.conf 如下:

# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 6381

......

# slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379

port 端口的配置分别是 6379、6380、6381,都分别与目录上的端口相对应。故障转移统一配置成指向 6379:slaveof 127.0.0.1 6379 

2.2. 启动测试

启动规则:先启动主节点,然后再启动从节点

CMD 进入本地刚刚弄的资源目录 \Redis\demo1\Redis-x64-3.0.504 - 6379,然后分别执行下面的命令:

redis-server.exe redis.windows.conf
redis-cli.exe -p 6379

然后同样的分别启动从节点 6380 和 6381 的服务端

上面运行结果中可以看到,两个从节点 6380 和 6381 已经成功转接上了主节点 master (6379)。

然后,再回到主节点 master 上看一下主从复制信息:

可以看到,master 角色 6379 上已经连接的有两个从节点 savle。分别是 6380、6381。

然后同样的再分别启动从节点 6380 和 6381 的客户端

可以看到,从节点 slave 的端口、只读、已连接的从节点数量为0等 slave 特性信息。

2.3. 数据验证

验证构想:主节点可读可写,从节点只能读不可写

构想成立。

2.4. 容灾验证

验证构想:当主节点 master 宕掉后,从节点可读,且不会自动升级为主节点

当主节点 master 重启恢复之后,从节点依然可以连接主节点:

而且,主节点可读可写,从节点只能读不可写的状态依然正常:

构想成立。

2. Redis 反客为主

线上 Redis 主节点 down 掉后,如果预估短时间内无法恢复的话,可以看情况手动升级从节点为主节点。但风险点是,因为数据可能不是实时同步,所以主节点可能会存在从 salve 恢复数据后有数据丢失问题。

用法:Redis 客户端执行命令 slaveof no one

可以观察到:有了两个 master

  1. 主节点 6379 宕掉之后,从手动操作从节点 6380,执行指令 slaveof no one 使其反客为主变成一个没有从节点的主节点,且可读可写
  2. 主节点 6379 再次重启,原来的从节点 6381 还是会成为其从节点
  3. 主节点 6379 上新加的键值,在 6380 主节点上读取不到;反之亦然

3. Redis 技能问答

问:从节点 slave 在连接 master 之前,master 就已经添加了一些 key,那么 slave 连接进来的时候,这之前 master 上的 key 是否也会复制?
答:全部都会复制,即全量复制。

问:是否可以向从节点 slave 里面写数据?是否可以 set key?
答:不可以,从节点 slave 只可以 read,master 既可以 read 又可以 write。

问:主机 shutdown 后,从机情况如何?从机是上位(反客为主变 master)还是原地待命?
答:原地待命,依旧是从节点 slave,等待 master 恢复。

问:主机恢复后,主机新增记录,从机能否顺利复制?
答:必须能


Redis 进击物语:
Redis进击(一)从0到1,Redis的安装与使用
Redis进击(二)搭建Redis主从复制服务集群(一主两从、反客为主)【Windows环境】
Redis进击(三)搭建Redis高可用集群的哨兵模式(Redis-Sentinel)【Windows环境】
Redis进击(四)Java中配置和使用Redis高可用集群的哨兵模式(Redis-Sentinel)【Spring&SpringBoot环境】
Redis进击(五)redis.conf配置文件说明备注手册
Redis异常:Creating Server TCP listening socket *:26379: bind : No such file or directory
Redis异常:JedisException: Can connect to sentinel, but 127.0.0.1:6379 seems to be not monitored...
Redis异常:JedisConnectionException: All sentinels down, cannot determine where is mymaster master is

发布了63 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/itanping/article/details/100521596