八、主从复制
1.多台服务连接方案
- 提供数据方:master
- 主服务器、主节点、主库、主客户端
- 接受数据方:slave
- 从服务器、从节点、从库、从客户端
2.主从复制简介
主从复制是将master中的数据即时、有效的复制到slave中。
- 特征:一个master可以拥有多个slave,一个slave只对应一个master
- 职责:
- master:
- 写数据
- 执行写操作时,将出现变化的数据自动同步到slave
- 读数据(可忽略)
- slave:
- 读数据
- 写数据(禁止)
- master:
2.主从复制作用
- 读写分离:master写、slave读,提高服务器的读写负载能力
- 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
- 故障恢复:当master出现问题时,由slace提供服务,实现快速的故障恢复
- 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
2.主从复制工作流程
- 建立连接阶段(即准备阶段)
- 数据同步阶段
- 命令传播阶段
2.1 阶段一:建立连接阶段
- 建立slave到master的连接,使master能识别到slave,并保存slave端口号
master | slave |
---|---|
- | 1⃣️:发送指令 |
2⃣️:接收到指令,响应对方 | 3⃣️:保存master的(masterhost)IP与端口(masterport) |
- | 4⃣️:根据保存的信息创建连接master的socket |
- | 5⃣️:周期性发送命令:ping |
6⃣️:响应pong | - |
- | 7⃣️:发送指令:auth password |
8⃣️:验证授权 | - |
- | 9⃣️:发送指令:replconflistenning-port |
1⃣️0⃣️:保存slave的端口号 | - |
主从连接(slave连接master)
- 方式一:客户端发送命令
slaveof <masterip> <masterport>
- 方式二:启动服务器参数
redis-server -slaveof <masterip><masterport>
- 方式三:服务器配置
slave <masterip><masterport>
- slave系统信息
- master_link_down_since_seconds
- masterhost
- masterport
- master系统信息
- slave_listenting_port(多个)
断开连接(slave端使用)
slave no one
授权访问
- master通过配置文件设置密码
requirepass <password>
- master客户端运行时,通过发送指令设置密码
config set requirepass <password>
config get requirepass
- slave客户端通过发送命令输入密码打开
auth <password>
- slave通过配置文件输入密码打开
masterauth <password>
- slave启动客户端时输入密码打开
redis-cli -a <password>
2.2 阶段二:数据同步阶段
- 在slave连接master后,复制master中的所有数据到slave中
- 将slave的数据库状态更新成master当前的数据库状态
1⃣️~5⃣️:全量复制
6⃣️~8⃣️:部分复制
master | slave |
---|---|
- | 1⃣️:发送指令:pasync2(pro synchronize 2) |
2⃣️:执行bgsave | - |
3⃣️:第一个slave连接时,创建命令缓冲区 | - |
4⃣️:生成RDB文件,通过socket发送给slave | - |
- | 5⃣️:接受RDB,清空数据,执行RDB文件恢复过程 |
- | 6⃣️:发送命令告知RDB恢复已经完成 |
7⃣️:发送复制缓冲区的命令信息 | |
- | 8⃣️:接受命令信息,执行bgwriteaof(aof命令重写),恢复余下的数据 |
- | 9⃣️:发送指令:??? |
1⃣️0⃣️接受到指令响应应对方 | - |
-
最终状态:
- slave:具有master端全部数据,包含RDB过程接受的数据
- master:保存slave当前数据同步的位置
-
master端的注意事项:
(1) 如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
(2) 复制缓冲区大小设置不合理,会导致数据溢出。全量复制周期长的话,缓冲区命令丢失,随后必须要进行第二次全量复制,使salve陷入死循环。
repl-backlog-size 1mb //设置复制缓冲区的大小
(3) master内存占用不应过大,建议使用50%~70%的内存,留下30%~50%的内存用于basave和创建复制缓冲区
- slave端的注意事项:
(1) 为避免slave全量复制、部分复制时服务器响应阻塞,或者数据不同步,建议在此期间关闭对外服务
slave-server-stale-data yes|no
(2) salve过多,master要发送的RDB文件会增多,对带宽影响较大,适量错峰
2.3 阶段三:命令传播阶段
- 当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让从数据同步到一致的状态,同步的动作成为命令传播
- master将接受到的数据变更命令发送到slave,slave接受命令后执行命令
部分复制的核心三要素:
- 服务器的运行id(run id,用于认证master和slave之间的关系,master开了后,给slave一份,下次slave连接时,拿这个保证一样)
- 主服务器的复制积压缓冲区(复制缓冲区,装操作命令的,由偏移量和字节值组成,栈,先进先出)
- 主服务器的复制偏移量(slave记录,用于区分不同slave当前数据传播进度的差异,mater记录,用于断网恢复后,和slave的比对,再继续复制)
心跳机制:
- 进入命令传播阶段后,master与slave间需要进行信息交换,使用心跳机制进行维护
- master心跳:
- 指令:PING
- 周期:由repl-ping-slave-period决定,默认10秒
- 作用:判断slave是否在线
- 查询:INFO replication 获取slave最后一次连接时间间隔,lag项维持在0或1视为正常
- slave心跳任务:
- 指令:REPLCONF ACK{offset}
- 周期:1秒
- 作用1:汇报slave自己的复制偏移量,获取最新的数据变更指令
- 作用2:判断master是否在线
- 当slave多数都掉线了,或者延迟过高,master为保证数据稳定性,将拒绝所有的信息同步操作(用REPLCONF ACK{offset}确认slave的数量和延迟)
/*
slave数量少于2个,或所有slave的延迟都大于等于8秒,强制关闭master写功能,并且停止数据同步
*/
min-slaves-to-write 2
min-slaves-max-lag 8