加载中...
读写分离是将数据库的读请求和写请求路由到不同实例的架构模式。通常配合主从复制实现:主库负责写入,多个从库承接读取,从而将读压力分散,是互联网应用应对读多写少场景的常见水平扩展手段。

| 适用场景 | 读多写少的 Web 应用 |
| 依赖机制 | 主从复制(Replication) |
| 核心问题 | 复制延迟导致的读写不一致 |
绝大多数 Web 应用的读写比在10:1以上,数据库的瓶颈往往先出现在读请求上。读写分离的核心是:所有写操作(INSERT/UPDATE/DELETE)发到主库,主库通过 binlog 异步复制到从库;读操作(SELECT)路由到从库,多个从库可以继续水平扩展读能力。
应用层实现方式有三种:直接在代码里维护两个数据源、使用 ORM 框架的读写分离插件(如 Laravel 的 sticky 选项)、或通过数据库代理(ProxySQL、MaxScale)透明地拦截并路由 SQL,对应用完全透明。[1]
读写分离最核心的挑战是复制延迟:写入主库后,从库的复制是异步的,可能落后几毫秒到几秒。如果用户刚下单(写入主库),立刻查询自己的订单列表(路由到从库),可能看不到刚下的那笔订单。
常见应对策略:写操作后的关联读强制走主库(如 ProxySQL 可以检测同一连接内刚执行了写操作);用 Session 标记「本次会话已有写操作」,后续读也走主库;或接受这种短暂的不一致并在 UI 上做处理(如显示「数据处理中,稍后刷新」)。MySQL 5.7+ 的 GTID 复制模式可以检测从库是否已追上某个事务,实现更精确的一致读。

| 适用场景 | 读多写少的 Web 应用 |
| 依赖机制 | 主从复制(Replication) |
| 核心问题 | 复制延迟导致的读写不一致 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧