数据库常见面试题:如何实现数据库的读写分离

Java面试 潘老师 1天前 5 ℃ (0) 扫码查看

在提升数据库性能方面,除了前几期聊到的分库分表,还有一个重要的性能优化策略,那就是数据库的读写分离。

读是一个库,写是另一个库,这样能轻松分摊数据库的访问压力,进而提升整体性能。其原理基于主从复制的架构,简单来说,就是一个主库挂多个从库。我们只在主库进行写操作,像删除、新增等,主库会自动把数据同步到从库。

从实现层面来讲,有两个重要点。其一,是数据的同步问题。以 MySQL 为例,核心是它的一个日志文件叫 binlog,主库每次的增删改操作都会把日志扔到 binlog 中,从库会订阅主库的 binlog,连接主库后实时同步 binlog 内容,解析成 SQL 语句,在本地执行,从而完成主库到从库的数据同步。但如果操作并发量大,binlog 的同步执行会相应变慢,甚至可能出现几百毫秒乃至几秒的延迟,一定程度上牺牲了数据的一致性,保证了可用性,这就是前面提到的 CAP 定律。

其二,是访问的策略问题。增删改选择主库,查询选择从库。如果从库有多个,还涉及到负载均衡策略。可以在代码里实现,配置多个数据源,根据 SQL 语句判断应访问哪个数据库,写好路由协议。但这样会使代码与数据库紧密结合,比较麻烦,很少有人这么做。一般会选择中间件,有实力的大厂会自建,中小厂通常选择开源的,比如可以用开源的中间件 MyCat,让它去选择相关路由和策略,代码里就不需要做路由配置了,这是比较常规的做法。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/javainterview/13069.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】