主从复制
主从复制工作原理
- 指定一个副本是主节点,写请求必须发送给主节点,主节点将新数据保存到本地存储。
- 主节点保存新数据后,将数据更新作为复制的日志发送给所有从节点(即其他副本),有异步和同步两种复制方式。从节点严格保持与主节点相同的写入顺序。
- 客户端可以在主、从副本上读取数据。
同步复制与异步复制
同步复制:主节点需要等待从节点写入成功后,才向用户反馈写入成功。
优点是保证副本数据处于最新版本,当主节点故障时,至少能在从节点获得最新的数据;缺点是现实中当从节点过多或从节点发生网络故障,无法向主节点发送写入成功响应时,会阻塞主节点处理后续的写请求。
实践中可以折中采用半异步的方式,所有的从节点中只有一个是同步复制,其他采用异步复制。这样可以保证至少两个节点(主节点和同步复制的从节点)拥有最新的数据。
主从复制还经常配置为全异步复制的方式。缺点是:当主节点故障时,所有尚未复制到从节点的请求将会丢失。优点是无论从节点的数据副本多么滞后,主节点总是可以响应请求,系统吞吐量高。
配置新的从节点
配置新的从节点意味着要从主节点复制数据到从节点。简单的节点间复制数据文件是不够的,因为在主节点复制过程中,新的数据不断写入,存在主从节点呈现不同时间点数据的差异。
不停机、数据服务不中断完成从节点数据初始化:
- 某个时间点对主节点数据副本进行一次快照,避免复制过程中长时间锁定数据库。mysqldump
- 拷贝此快照到从节点
- 复制快照后,从节点向主节点请求快照点后发生的数据更改日志。应用更改日志,追赶主节点。
处理节点失效
从节点失效:追赶式恢复
从节点的本地磁盘上保存了副本收到的数据变更日志。从节点能知道发生故障前处理的最后一笔事务,然后向主节点请求那笔事务之后所有的数据更改,并应用追赶主节点。
主节点失效:节点切换
主节点失效相对从节点失效稍微复杂,涉及主节点降级,从节点升级成新主节点,即切换的过程。自动切换步骤:
- **确认主节点失效。**多数分布式系统采用心跳💓机制探测主节点是否失效。节点间频繁互相发送心跳💓请求,如果主节点较长时间内没有相应就认为已失效下线。
- **选举新的节点。**多数从节点达成共识选举出新的主节点,新的主节点最好和原主节点数据差异最小,尽量降低数据丢失风险。
- 重新配置系统使新主节点生效。 客户端需要更新新主节点地址信息,发送写请求到新主节点。当原主节点重新上线后,可能仍认为自己是主节点,此时两个节点都认为自己是主节点,这种现象称为脑裂。系统要确保原主节点降级成从节点,并认可新主节点。