Redis主从复制
1.简介
(1)什么是主从复制
- 指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave)。
- 数据的复制是单向的,只能由主节点到从节点。
- master以写为主,slave以读为主当master数据变化的时候,自动将新的数据异步同步到其它slave数据库。
(2)主从复制的作用
- 读写分离
- 写操作找主机,读操作找从机,达到读写分离的效果。
- 主机负担减轻,可用性提高。
- 数据备份、容灾恢复
- 从机同步主机数据,是持久化的另一种补充。
- 当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复。
- 水平扩容支持高并发
- 通过一主多从加轮询的方式,应对高并发。
- 实现水平扩容。
- 主从复制还是哨兵和集群能够实施的基础。
(3)如何使用
- 配置原则:配主不配从。
- master如果配置了requirepass参数,需要密码登陆(安全起见要配置)。
- 那么slave就要配置masterauth来设置校验密码否则的话master会拒绝slave的访问请求。
(3)基本操作命令
info replication
:可以查看复制节点的主从关系和配置信息。replicaof 主库ip 主库端口
:一般通过写入配置文件形式实现。slaveof 主库ip 主库端口
- 每次与master断开之后,都需要重新连接,除非配置redis.conf文件。
- 在运行期间修改slave节点的信息,如果该数据库已经是某个主数据库的从数据库那么会停止和原主数据库的同步关系转而和新的主数据库同步重新拜码头
slaveod no one
:使当前数据库停止与其他数据库的同步,转成主数据库,自立为王。
2.案例演示
(1)架构说明
-
一主二从的相关配置。
-
可以使用三台虚拟机,或在一台虚拟机上复制多个配置文件。
-
要保证三边网络相互ping通。
(2)修改配置文件细节
-
开启后台运行:
daemonize yes
-
注释掉绑定ip:
bind 127.00.0.1
-
关闭保护模式:
protected mode no
-
指定端口:
port xxx
-
指定当前工作目录:
dir xxx
-
pid(进程)文件名字:
pidfile XXX
(一般用默认) -
log(日志)文件名字:
logfile XXX
-
requirepass(密码):
requirepass 123456
-
dump.rdb文件名字:
dbfilename dump6379.rdb
-
开启aof,设置存放位置(可选):
appendonly no
-
需要连接的主机(从机配):
replicaof 主库ip 主库端口
-
访问主机的通行密码(从机配):
masterauth
(3)配置成功
-
查看主机日志是否有关于从机的连接信息。
-
也可以使用
info info replication
来查看连接状态。 -
主机可写可读,从机只能读。从机中途掉队,再启动也能跟上主机(仅限配置文件方式,命令手动位置的会占山为王)。
-
主机掉队,从机仍然为从机,等主机启动后仍然进行复制。
-
配置持久稳定,命令单次生效。
(4)其他情况
- 薪火相传
- 上一个slave可以是下一个slave的master,slave同样可以接收slaves的连接和同步请求。
- 该slave作为链条中下一个,可以有效减轻主master的写压力。
- 中途变更转向:会清除之前的数据,重新建立拷贝最新的。
- slaveof 新主库IP 新主库端口
- 反客为主
SLAVEOF no one
- 使当前数据库停止与其他数据库的同步,转成主数据库。
3.复制原理与工作流程
(1)salve启动,请求同步
- 从机启动成功连接到主机后会发送一个psync命令,使用PSYNC命令完成主从数据同步。
- 全新连接一次性完成同步,从机原有数据会被覆盖。
(2)首次连接,全量复制
- master节点收到psync命令后会开始在后台保存快照(即RDB持久化,主从复制时会触发RDB)。
- 同时收集所有接收到的用于修改数据集命令缓存起来。
- master节点执行RDB持久化完后,master将rdb快照文件和所有缓存的命令发送到所有slave,以完成一次完全同步。
(3)心跳持续,保持通信
- 进入命令传播阶段后,主从间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线。
repl-ping-slave-period
决定,默认为10秒。
(4)进入平稳,增量复制
- Master继续将新的所有收集到的修改命令自动依次传给slave。
- 亦步亦趋完成同步。
(5)从机下线,重连续传
- 主机会检查backlog里面的offset,主从都会保存个复制的offset还有一个masterIdoffset是保存在backlog中的。
- 主机只会把已经复制的offset后面的数据复制给从机,类似断点续传。
4.复制缺点
(1)复制延时,信号衰减
- 由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟。
- 当系统很繁忙的时候,延迟问题会更加严重,slave机器数量的增加也会使这人问题更加严重。
(2)主机宕机
- 默认情况下,不会在slave节点中自动重选一个master。
- 这时需要人工干预。
- 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
(3)资源浪费
- Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
- 在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。