MySQL读写分离的基本概念和实现⽅式
简单的介绍了MySQL数据库读写分离的概念和实现⽅式。
mysql下载jar包⽂章⽬录
1 读写分离的概念
读写分离是指将数据库的读和写操作分不到不同的数据库节点上。主服务器负责处理写操作和实时性要求较⾼的读操作,从服务器负责处理读操作。
读写分离减缓了数据库锁的争⽤,可以⼤幅提⾼读性能,⼩幅提⾼写的性能,⾮常适合读请求⾮常多的场景。读写分离会依赖到Mysql的主从复制的功能,因此也能够顺带着解决了数据库单点故障的问题,基于主从切换可以实现数据库的⾼可⽤性。
读写分离的⽅案中,⼀主⼀从、⼀主多从、多主多从都是可以的,⽐较灵活。
2 读写分离的实现
项⽬中读写分离常见的实现⽅式有两种,⼀种是直接在客户端的实现,另⼀种是第三⽅数据库中间件代理的实现。
基于客户端的实现,也就是在应⽤程序/代码层⾯的实现。我们可以⾃⼰写⼀个AOP,然后对配置多个读、写数据源,利⽤AOP拦截技术对到达的读/写请求进⾏解析(可以通过⽅法名之类的进⾏拦截),针对性地选择不同的数据源,将请求分发到不同的数据库中,从⽽实现读写分离,,不引⼊任何jar包,也不需要引⼊任何中间组件,节省了很多运维的成本,但是需要⾃⼰编程。
基于客户端的实现推荐引⼊的中间件jar的⽅式⽽不是⼿动编程的⽅式,也称为组件式,推荐使⽤sharding-jdbc的jar包,这些jar包中已经包含了读写分离的各种逻辑,只需要开发⼈员少量的配置即可⾮常⽅便的实现读写分离,相⽐于⼿动实现,节省了很多编程的成
本,sharding-jdbc还提供了多种不同的从库负载均衡策略,以及强制路由策略。
第⼆种就是基于外部数据库中间件来帮助我们实现读写分离,⽐如MySQL Router(官⽅)、Atlas(基于 MySQL Proxy)、Maxscale、MyCat。这种⽅式类似于在应⽤层和数据库层之间添加了⼀个独⽴的代理层,应⽤程序所有的数据请求都交给代理层处理,代理层负责分离读写请求,将它们路由到对应的数据库中。这种⽅式不会侵⼊客户端代码,但是需要额外的部署第三⽅组件,会增加运维成本,让系统架构变得更加复杂。
推荐使⽤sharding-jdbc的jar包来实现读写分离。sharding-jdbc官⽹的介绍:Sharding-JDBC是ShardingSphere的第⼀个产品,也是ShardingSphere的前⾝。 它定位为轻量级Java框架,在Java的J
DBC层提供的额外服务。它虽然也是⼀个数据库中间件,但是使⽤客户端直连数据库,以jar包形式提供服务,⽆需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
注意,读写分离依赖于Mysql的主从复制,⽽sharding-jdbc等数据库中间件是不提供主从复制的功能的,这是Mysql的原⽣实现。
3 读写分离的问题
因为读写分离依赖主从复制,因此读写分离的问题实际上就是主从复制的问题,那就是主备延迟的问题。
没有特别好的解决办法,主要思路有下⾯这些:
1. 可以在数据同步⼀定时间之后再从备库读取。
2. 将那些必须获取最新数据的读请求都交给主库处理。
3. ⼀个主库分为多个主库,分担主库的写请求,减少单个库的binlog⽇志产⽣速度。
4. 打开 MySQL 从库的并⾏复制,sql_thread从⼀个变成多个,这需要Mysql
5.6及其以上的版本⽀持。
参考资料:
1. 《MySQL实战45讲 | 极客时间 | 丁奇》
如有需要交流,或者⽂章有误,请直接留⾔。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论