ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【Redis】主从复制

【Redis】主从复制 目录一、什么是主从复制二、主从复制能解决什么问题三、配置 redis 主从结构3.1 建⽴复制3.2 查看复制结构3.3 断开主从结构四、主从复制的拓扑结构4.1 ⼀主⼀从结构4.2 ⼀主多从结构4.3 树形主从结构五、数据同步 psync命令5.1 replicationid/replid (复制id)5.2 offset (偏移量)5.3 psync命令 运⾏流程5.4 全量复制5.5 部分复制5.6 实时复制一、什么是主从复制Redis 主从复制是 Redis 最核心的高可用机制之一简单说就是让一台 Redis 服务器主节点 / Master的数据实时同步到其他一台或多台 Redis 服务器从节点 / Slave并且主节点写从节点读数据单向同步只能从主节点流向从节点。主节点唯一负责写操作新增、修改、删除数据主动把数据同步给所有从节点一个集群可以只有一个主节点也可以有多个独立主节点从节点只能读操作查询数据不能写数据完全来自主节点的同步可以有多个从节点每个从节点只能有一个主节点复制原理主节点会记录所有写操作从节点主动拉取 / 主节点主动推送这些操作保证数据一致。二、主从复制能解决什么问题读写分离写请求 → 主节点读请求 → 从节点。大幅提升 Redis 的读取性能支撑高并发。数据备份从节点是主节点的完整数据副本相当于自动备份。高可用基础主节点挂了可以手动 / 自动把一个从节点升级成新主节点保证服务不中断配合哨兵 Sentinel。水平扩展读能力加从节点就能线性提升读取性能三、配置 redis 主从结构3.1 建⽴复制配置复制的⽅式有以下三种在配置⽂件中加⼊slaveof {masterHost} {masterPort}随 Redis 启动⽣效。在 redis-server 启动命令时加⼊--slaveof {masterHost} {masterPort}⽣效。直接使⽤ redis 命令slaveof {masterHost} {masterPort}⽣效。3.2 查看复制结构可以通过info replication命令查看复制相关状态。主节点的核心汇报自己的角色 所有从节点列表# Replication role:master -- 角色主节点 connected_slaves:2 -- 已连接的从节点数量 slave0:ip127.0.0.1,port6380,stateonline,offset1120,lag0 slave1:ip127.0.0.1,port6381,stateonline,offset1120,lag0 master_replid:8bf5c5a4... -- 主节点复制ID唯一标识 master_replid2:0 master_repl_offset:1120 -- 主节点复制偏移量同步进度 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1120role:master当前是主节点connected_slaves:2当前挂了 2 个从节点slave0:xxx从节点 0 的 IP、端口、状态、同步进度stateonline从节点在线正常同步offset偏移量判断同步是否一致用master_repl_offset主节点最新同步位置从节点的核心汇报自己角色 主节点信息 同步状态# Replication role:slave -- 角色从节点 master_host:127.0.0.1 -- 主节点IP master_port:6379 -- 主节点端口 master_link_status:up -- 与主节点连接状态up正常, down断开 master_last_io_seconds_ago:3 -- 多久没和主节点通信秒 master_sync_in_progress:0 -- 是否正在全量同步0否1是 slave_repl_offset:1120 slave_priority:100 slave_read_only:1 -- 从节点是否只读1是 connected_slaves:0 -- 从节点没有下级从节点时为0 master_replid:8bf5c5a4...role:slave当前是从节点master_host/port主节点地址master_link_status:up 最重要up 主从连接正常down 主从断开master_sync_in_progress:00 同步完成1 正在全量复制 RDB会阻塞slave_read_only:1从节点只读默认开启3.3 断开主从结构在从节点执⾏slaveof no one来断开与主节点复制关系。(命令行操作如果通过配置文件进行主从复制那么命令行操作是临时的断开复制主要流程断开与主节点复制关系。从节点可以写操作。从节点断开复制后并不会抛弃原有数据只是⽆法再获取主节点上的数据变化。通过 slaveof 命令还可以实现切主操作将当前从节点的数据源切换到另⼀个主节点。执⾏slaveof {newMasterIp} {newMasterPort}命令即可。切换操作主要流程断开与旧主节点复制关系。与新主节点建⽴复制关系。删除从节点当前所有数据。从新主节点进⾏复制操作。四、主从复制的拓扑结构4.1 ⼀主⼀从结构⼀主⼀从结构是最简单的复制拓扑结构⽤于主节点出现宕机时从节点提供故障转移⽀持如图所⽰。当应⽤写命令并发量较⾼且需要持久化时可以只在从节点上开启 AOF这样既可以保证数据安全性同时也避免了持久化对主节点的性能⼲扰。但需要注意的是当主节点关闭持久化功能时如果主节点宕机要避免⾃动重启操作。4.2 ⼀主多从结构⼀主多从结构星形结构使得应⽤端可以利⽤多个从节点实现读写分离如图所⽰。对于读⽐重较⼤的场景可以把读命令负载均衡到不同的从节点上来分担压⼒。同时⼀些耗时的读命令可以指定⼀台专⻔的从节点执⾏避免破坏整体的稳定性。对于写并发量较⾼的场景多个从节点会导致主节点写命令的多次发送从⽽加重主节点的负载。4.3 树形主从结构树形主从结构分层结构使得从节点不但可以复制主节点数据同时可以作为其他从节点的主节点继续向下层复制。通过引⼊复制中间层可以有效降低住系欸按负载和需要传送给从节点的数据量如图所⽰。数据写⼊节点 A 之后会同步给 B 和 C 节点B 节点进⼀步把数据同步给 D 和 E 节点。当主节点需要挂载等多个从节点时为了避免对主节点的性能⼲扰可以采⽤这种拓扑结构。五、数据同步 psync命令Redis 使⽤ psync 命令完成主从数据同步语法PSYNC replicationid offset同步过程分为全量复制和部分复制。全量复制⼀般⽤于初次复制场景Redis早期⽀持的复制功能只有全量复制它会把主节点全部数据⼀次性发送给从节点当数据量较⼤时会对主从节点和⽹络造成很⼤的开销。部分复制⽤于处理在主从复制中因⽹络闪断等原因造成的数据丢失场景当从节点再次连上主节点后如果条件允许主节点会补发数据给从节点。因为补发的数据远⼩于全量数据可以有效避免全量复制的过⾼开销。5.1 replicationid/replid (复制id)主节点的复制 id。主节点重新启动或者从节点晋级成主节点都会⽣成⼀个 replicationid。(同⼀个节点每次重启⽣成的 replicationid 也会变化)。从节点在和主节点建⽴连接之后就会获取到主节点的 replicationid。5.2 offset (偏移量)参与复制的主从节点都会维护⾃⾝复制偏移量。主节点master在处理完写⼊命令后会把命令的字节⻓度做累加记录统计信息在 info replication 中的 master_repl_offset 指标中。从节点slave每秒钟上报⾃⾝的复制偏移量给主节点因此主节点也会保存从节点的复制偏移量从节点在接受到主节点发送的命令后也会累加记录⾃⾝的偏移量。统计信息在 info replication 中的 slave_repl_offset 指标中.5.3 psync命令 运⾏流程从节点发送 psync 命令给主节点replid 和 offset 的默认值分别是 ? 和 -1。主节点根据 psync 参数和⾃⾝数据情况决定响应结果• 如果回复 FULLRESYNC replid offset则从节点需要进⾏全量复制流程。• 如果回复 CONTINEU从节点进⾏部分复制流程。• 如果回复 -ERR说明 Redis 主节点版本过低不⽀持psync命令。从节点可以使⽤ sync 命令进⾏全量复制。5.4 全量复制流程从节点发送 psync命令给主节点进⾏数据同步由于是第⼀次进⾏复制从节点没有主节点的运⾏ ID 和复制偏移量所以发送 psync ? -1。主节点根据命令解析出要进⾏全量复制回复 FULLRESYNC 响应。从节点接收主节点的运⾏信息进⾏保存。主节点执⾏ bgsave 进⾏ RDB ⽂件的持久化。主节点发送 RDB ⽂件给从节点从节点保存 RDB 数据到本地硬盘。主节点将从⽣成 RDB 到接收完成期间执⾏的写命令写⼊缓冲区中等从节点保存完 RDB ⽂件后主节点再将缓冲区内的数据补发给从节点补发的数据仍然按照 rdb 的⼆进制格式追加写⼊到收到的 rdb ⽂件中. 保持主从⼀致性。从节点清空⾃⾝原有旧数据。从节点加载 RDB ⽂件得到与主节点⼀致的数据。如果从节点加载 RDB 完成之后并且开启了 AOF 持久化功能它会进⾏ bgrewrite 操作得到最近的 AOF ⽂件。5.5 部分复制部分复制主要是 Redis 针对全量复制的过⾼开销做出的⼀种优化措施使⽤psync replicationId offset命令实现。当从节点正在复制主节点时如果出现⽹络闪断或者命令丢失等异常情况时从节点会向主节点要求补发丢失的命令数据如果主节点的复制积压缓冲区存在数据则直接发送给从节点这样就可以保持主从节点复制的⼀致性。补发的这部分数据⼀般远远⼩于全量数据所以开销很⼩。整体流程:当主从节点之间出现⽹络中断时如果超过 repl-timeout 时间主节点会认为从节点故障并终端复制连接。主从连接中断期间主节点依然响应命令但这些复制命令都因⽹络中断⽆法及时发送给从节点所以暂时将这些命令滞留在复制积压缓冲区中。当主从节点⽹络恢复后从节点再次连上主节点。从节点将之前保存的 replicationId 和 复制偏移量作为 psync 的参数发送给主节点请求进⾏部分复制。主节点接到 psync 请求后进⾏必要的验证。随后根据 offset 去复制积压缓冲区查找合适的数据并响应 CONTINUE 给从节点。主节点将需要从节点同步的数据发送给从节点最终完成⼀致性。5.6 实时复制主从节点在建⽴复制连接后主节点会把⾃⼰收到的 修改操作通过 tcp ⻓连接的⽅式源源不断的传输给从节点从节点就会根据这些请求来同时修改⾃⾝的数据从⽽保持和主节点数据的⼀致性。另外这样的⻓连接需要通过⼼跳包的⽅式来维护连接状态。(这⾥的⼼跳是指应⽤层⾃⼰实现的⼼跳⽽不是TCP ⾃带的⼼跳)。主从节点彼此都有⼼跳检测机制各⾃模拟成对⽅的客⼾端进⾏通信。主节点默认每隔 10 秒对从节点发送 ping 命令判断从节点的存活性和连接状态。从节点默认每隔 1 秒向主节点发送replconf ack {offset}命令给主节点上报⾃⾝当前的复制偏移量。如果主节点发现从节点通信延迟超过 repl-timeout 配置的值默认 60 秒则判定从节点下线断开复制客⼾端连接。从节点恢复连接后⼼跳机制继续进⾏。
返回列表