集群中数据库主从同步

数据库集群,读写分离现在可以说是项目必备的了,但是我们如何保证其每个数据库的数据一致性?

 1 半同步复制

  简单的说就是: 主库发生增删改操作的时候,会等从库及时复制了并且通知了主库, 才会把这个操作叫做成功.

  优点:保证数据一致性

  缺点:就是会慢

专业的讲:

  半同步复制,是等待其中一个从库也接收到Binlog事务并成功写入Relay Log之后,才返回Commit操作成功给客户端;如此半同步就保证了事务成功提交后至少有两份日志记录,一份在主库Binlog上,另一份在从库的Relay Log上,从而进一步保证数据完整性;半同步复制很大程度取决于主从网络RTT(往返时延),以插件 semisync_master/semisync_slave 形式存在。 

数据库中间件

如果有了数据库中间件,所有的数据库请求都走中间件,这个主从不一致的问题可以这么解决:

所有的读写请求都走中间件,然后写的请求路由到主库,读的请求路由到从库

但是我们中间件会记录写库的一个key,在设置一个允许同步时间,假设是1s

当有一个写请求过来时候,生成一个key A ,马上路由写到主库,然后立马有一个读请求过来。 从库可能是旧数据,或者没有来得及同步。 如果时间是在1s内的,就对应的key继续路由到主库。如果在1s以后的,就路由到从库。

说白了,中间件就是给个同步时间,给你同步,在同步时间内,所有的请求都落在主库

缓存记录写key法

 

1 将某个库上的某个key要发生写操作,记录在cache里,并设置“经验主从同步时间”的cache超时时间,例如1s

2 修改数据库

(1)先到cache里查看,对应库的对应key有没有相关数据
(2)如果cache hit,有相关数据,说明这个key上刚发生过写操作,此时需要将请求路由到主库读最新的数据
(3)如果cache miss,说明这个key上近期没有发生过写操作,此时将请求路由到从库,继续读写分离
方案优点:相对数据库中间件,成本较低
方案缺点:为了保证“一致性”,引入了一个cache组件,并且读写数据库时都多了一步cache操作

 

总结:

就是两个思路

1  半同步复制 , 等从库复制成功才返回写成功

2  设一个key记录着一次写的数据,然后设置一个同步时间,如果在这个时间内,有一个读请求,看看对应的key有没有相关数据,有的话,说明数据近期发生过写事件,这样key的数据就继续读主库,否则就读从库

转载:

https://blog.youkuaiyun.com/xmh594603296/article/details/82461222

<think> 嗯,用户想了解数据库主从同步延迟的原因和解决方案,这个问题在分布式数据库架构中确实很常见。用户引用了四篇站内资料,看起来已经做过初步调研,但需要更系统化的整理。 从用户历史交互看,ta应该具备一定数据库基础,可能是个运维工程师或DBA。引用[2]提到的主库高并发导致SQL积压这个点特别关键,这在实际生产环境经常出现。用户没有明确说业务场景,但这类问题通常发生在电商大促或金融交易时段。 主从延迟的核心矛盾其实在于:主库支持多线程写入,而从库的SQL Thread却是单线程回放。引用[3]提到的半同步复制是个不错的补充方案,不过要注意它可能导致主库卡顿。用户提供的引用[4]里那个“秒级延迟消除”的宣传语有点夸张,实际需要综合施策。 硬件方面很多人忽略RAID卡的WriteBack缓存设置,这个对机械硬盘阵列特别重要。软件配置方面sync_binlog和innodb_flush_log_at_trx_commit的组合策略值得展开,但考虑到用户可能不熟悉参数调优,回复里用表格呈现更直观。 网络问题在云环境尤其突出,之前遇到过客户跨可用区部署时MTU不匹配导致的诡异延迟。解决方案里特意加入了TCP参数优化,虽然有点底层但确实有效。 用户没问但可能想知道的是监控手段,所以补充了Seconds_Behind_Master的局限性。开源的Percona Toolkit里有pt-heartbeat更精准,不过这个进阶内容放在相关问题里比较合适。 最后架构演进部分放了MGR,虽然它解决延迟效果有限,但考虑到金融类用户可能需要强一致性参考。突然想到如果用户业务读多写少,或许可以追问是否要考虑读写分离中间件? </think> 数据库主从同步延迟是分布式架构中的常见问题,以下是综合引用内容的**核心原因与多层次解决方案**: --- ### **一、主从延迟的根本原因** 1. **复制机制瓶颈** - 主库支持并行写入,但从库的SQL Thread通常**单线程回放**Binlog(尤其MySQL 5.6前)[^2] - 大事务(如批量删除/ALTER TABLE)或长查询阻塞后续SQL执行 2. **硬件与性能差异** - 从库硬件配置(CPU/磁盘IOPS)低于主库 - 主库高并发写入超出从库处理能力(TPS差距过大) 3. **网络瓶颈** - 跨机房/跨地域部署时,网络延迟高或丢包率高[^2][^3] 4. **配置不合理** - 主库`sync_binlog=1`+`innodb_flush_log_at_trx_commit=1`确保安全但性能低,从库沿用相同配置导致回放慢[^2] --- ### **二、系统级解决方案** #### **1. 复制架构优化** | **方案** | **原理** | **适用场景** | |-----------------------|--------------------------------------------------------------------------|--------------------------| | **并行复制** | MySQL 5.7+启用`slave_parallel_type=LOGICAL_CLOCK`,多线程回放事务 | 高并发写入场景 | | **半同步复制** | 主库提交事务后需至少一个从库确认(`rpl_semi_sync_master_wait_point=AFTER_SYNC`)[^3] | 数据强一致性要求 | | **MGR架构** | 基于Paxos协议实现多主写入,规避单点复制延迟[^4] | 金融级高可用场景 | #### **2. 硬件与配置调优** - **从库硬件升级**:SSD替换机械盘、CPU核心数≥主库 - **读写分离**: - 双从库架构:一从库专供备份,另一低负载从库处理查询[^2] - 中间件分流量:ProxySQL/ShardingSphere实现读负载均衡[^4] - **关键参数调整**: ```ini # 从库配置(牺牲部分安全性换性能) sync_binlog = 0 # 禁用binlog刷盘 innodb_flush_log_at_trx_commit = 0 # 每秒刷日志 relay_log_recovery = 1 # 保障Crash安全 ``` #### **3. SQL与事务治理** - **避免大事务**:单次更新超过10万行拆分为批次操作 - **索引优化**:对从库慢查询建立缺失索引(主库更新压力传递到从库查询) - **读操作分离**:将统计类OLAP查询迁移至数仓,减轻从库压力 #### **4. 网络优化** - **同机房部署**:主从节点延迟<1ms(跨机房需专线) - **TCP参数调优**: ```ini net.core.somaxconn = 4096 net.ipv4.tcp_tw_reuse = 1 ``` --- ### **三、监控与故障排查** 1. **延迟指标**: ```sql SHOW SLAVE STATUS\G -- 关注 Seconds_Behind_Master(非精确值) -- 若为NULL:I/O或SQL线程故障[^2] ``` 2. **精准检测**: - 主库植入时间戳心跳表(`pt-heartbeat`工具) - 监控Binlog位点差距(`Master_Log_File` vs `Relay_Master_Log_File`) --- ### **四、典型场景方案选择** | **场景** | **推荐方案** | |--------------------------|------------------------------------------------| | 延迟<5秒 | 并行复制+从库参数优化 | | 高并发订单系统 | MGR集群+ProxySQL读写分离[^4] | | 跨地域部署 | 半同步复制+专线网络优化 | > **注意**:完全消除延迟不现实,目标是**控制延迟在业务容忍阈值内**(如<500ms)。架构设计时需权衡一致性要求与性能[^1][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值