原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
原文链接地址:『互联网架构』软件架构-解密电商系统-读写分离各种实现优缺点与解决方案(83)
数据库读写分离,之前也说过这次在回顾下吧:主从复制,proxy读写分离,jar包进行读写分离。三种方式体量不同,根据自己的需求找到最合适的,一起说下。
(一)什么是读写分离
我们一般应用访问数据库无非是读取数据、修改数据、插入数据、删除数据。
而我们对数据库一般分为: master(主库也是写库) slave(从库也为读库)
而读写分离的意思就是:所有的写(insert update delete)操作走主库、其他走从库。
- 目的是什么?
我们一般应用对数据库而言都是“读多写少”,也就是说对数据库读取数据的压力比较大。读写分离的主要目的是降低主库的压力。 降低主库的读的压力。只是降低主库读的压力,并不是说不能用主库来查询(下单立刻查询订单状态)。
- 前提条件:
- 读库 slave 需要跟写库 master 的数据一致。
- 写数据必须写到证据库。
- 读取数据必须到读库,这不一定,特殊的业务需求可能需要走主库,主从同步需要时间,可以强制路由走主库。
- 行业用的多的
主多从 mysql 集群方案,至少两个库。一主一从。
- 主从复制
Master my.cnf 配置:
binlog-do-db=tlshop
binlog-ignore-db=mysql
binlog_format=mixed
log-bin=mysql-bin
server-id=1
Slave my.cnf 配置
replicate-do-db=tlshop
replicate-ignore-db=mysql
server-id=2
#以下的配置是5.6 之前版本
#master-host=192.168.0.15
#master-port=3306
#master-user=root
#master-password=123456
slave 动态配置节点信息
1.进入master数据库,输入
show master status\G
2.进入slave数据库,输入
change master to master_host='192.168.0.15', master_user='root', master_password='123456',
master_log_file='(输入1中show master status里面的 File)', master_log_pos=‘(输入1中show master status里面的 Position)’;
slave start;//启动
(二)读写分离
- 业界方案
代理层 proxy: Atlas 开源软件
应用层: Sharding-jdbc
- 代理层 Atlas
Atlas 是由 Qihoo 360 公司 Web 平台部基础架构团队开发维护的一个基于 MySQL 协议的数据中间层项目。它在 MySQL 官方推出的 MySQL-Proxy 0.8.2 版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在 360 公司内部得到了广泛应用,很多 MySQL 很多 MySQL 业务已经接入了 Atlas 平台,每天承载的读写请求数达几十亿条。同时,有超过 50 家公司在生产环境中部署了 Atlas,超过 800 人已加入了我们的开发者交流群,并且些数字还在不断增加。
主要功能
- 读写分离。
- 从库负载均衡。
- IP 过滤。
- 自动分表。
- DBA 可平滑上下线 DB。
- 自动摘除宕机的 DB。
Atlas 配置
强制路由:
注释的方式强制走主库。
Alatas:
/*master*/ select 字段 from 表名
业务需要 下单即查
Sharding-jdbc
Sharding-JDBC 是一个开源的分布式数据库中间件,它无需额外部署和依赖,完全兼容 JDBC和各种 ORM 框架。 Sharding-JDBC 作为面向开发的微服务云原生基础类库,完整的实现了分库分表、读写分离和分布式主键功能,并初步实现了柔性事务。之前有专门的文章『互联网架构』(65)
https://shardingsphere.apache.org/index_zh.html
<dependency>
<groupId>io.shardingjdbc</groupId>
<artifactId>sharding-jdbc-core-spring-namespace</artifactId>
<version>${sharding-jdbc.version}</version>
</dependency>
<dependency>
<groupId>io.shardingjdbc</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>${sharding-jdbc.version}</version>
</dependency>
<master-slave:data-source id="dataSource" master-data-source-name="dataSourceMaster"
slave-data-source-names="dataSourceSlave,dataSourceSlave,dataSourceSlave" strategytype="ROUND_ROBIN" />
PS:Alatas:
1.程序不需要管主从配置的具体细节
2.实现原理是 proxy,所以性能上会下降
3.而且需要维护其高可用
4.减少了程序员技能要求
5.只支持 mysql
Sharding-jdbc:
1.主从配置在程序中,所以增加了程序员的技术要求
2.实现原理是 jdbc 增强,所以支持任何数据库类型 性能比上面那个强
3.而且不需要维护。
4.Mysql、 Oracle、 sql server
网友评论