一、实验目的

Redis数据库的主从复制原理及实现

二、主从复制

1、什么是主从复制

将多台数据库服务器分为主节点和从节点,主节点数据更新后会根据配置和策略,自动同步到从节点上,从而保证主从节点中存有相

同的数据。

dbsave redis主从复制 redis主从复制实现_主从复制

2、主从复制的作用

  • 数据可以有多份副本
  • 提升数据库系统的请求处理能力
  • 实现读写分离机制(主节点以写为主;从节点以读为主)
  • 容灾快速恢复(主节点shutdow,可以将从节点提升为主节点)

3、Redis主从复制原理

全量数据同步
主节点发送快照RDB文件给从节点

增量同步(命令传播)
全量数据同步完成后,主节点将执行过的写命令发送给从节点

三、代码实现

1、配置文件

主节点(master):端口号为 6379 完整 IP:127.0.0.1 6379
从节点 1(slave1):端口号为 6380 完整 IP:127.0.0.1 6380
从节点 2(slave2):端口号为 6381 完整 IP:127.0.0.1 6381

配置文件

dbsave redis主从复制 redis主从复制实现_dbsave redis主从复制_02

指定master的节点

dbsave redis主从复制 redis主从复制实现_主从复制_03

启动三台服务器

dbsave redis主从复制 redis主从复制实现_dbsave redis主从复制_04

查看服务器信息

info replication

得到master信息:

dbsave redis主从复制 redis主从复制实现_数据库_05


得到slave信息:

dbsave redis主从复制 redis主从复制实现_数据库_06

主从节点数据同步实验

在master中写入数据,可以在slave中读取

dbsave redis主从复制 redis主从复制实现_redis_07

dbsave redis主从复制 redis主从复制实现_数据库_08

从节点不能写数据实验

dbsave redis主从复制 redis主从复制实现_服务器_09

2、主从复制的容灾处理(手动版)

在 Redis 主从结构中,当 master 服务出现故障时,可手动将其中一个 slave 节点提升为 master 节点,然后将剩下的 slave 节点重新设置为新的 master 节点的从节点,从而继续进行用户请求处理。

将master主节点停止,模拟故障

shutdown

dbsave redis主从复制 redis主从复制实现_redis_10

6380端口提升为master

slaveof no one

dbsave redis主从复制 redis主从复制实现_redis_11

将6381端口挂在新的master上

dbsave redis主从复制 redis主从复制实现_dbsave redis主从复制_12

== 可以看到,现在的主从(Master/Slave)关系为:Master 是 6380 服务器,Slave 是6381 服务器,可以继续处理用户的请求。==

故障机6379重启,虽然是主节点,但是没有从节点

dbsave redis主从复制 redis主从复制实现_主从复制_13

6379变从
6379它虽然是主节点,但是没有从节点,因此需要把它添加到现有的Master/Slave 结构中,让它变成 6380 机的从节点。

info sentinel

dbsave redis主从复制 redis主从复制实现_数据库_14

info replication

dbsave redis主从复制 redis主从复制实现_数据库_15

现在的 Master/Slaver 结构是:

  • Master: 6381 服务器
  • Slave: 6380 和 6379 服务器

四、主从同步优化

主从同步可以保证主从数据的一致性,非常重要。可以从以下几个方面来优化 Redis主从集群:

  • 在 master 中配置 repl-diskless-sync yes 启用无磁盘复制,避免全量同步时的磁盘 IO
  • Redis 单节点上的内存占用不要太大,减少 RDB 导致的过多磁盘 IO
  • 适当提高 repl_baklog 的大小,发现 slave 宕机时尽快实现故障恢复,尽可能避免全量同步
  • 限制一个 master 上的 slave 节点数量,如果实在是太多 slave,则可以采用主- 从-从链式结构,减少 master 压力

五、总结

  • 一个 master 节点可以有多个 slave 节点;
  • slave 节点故障,读请求的处理性能下降;
  • master 节点故障,写请求无法执行
  • 当 master 发生故障,可手动将其中一台 slave 使用 slaveof no one 命令提升为 master,其它 slave 执行 slaveof 命令指向这个新的 master;
  • 主从复制模式的故障转移需要手动操作,要实现自动化处理,这就需要Sentinel 哨兵,实现故障自动转移