浅谈读写分离和几种常见的开源数据库中间件
Posted 零壹技术栈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈读写分离和几种常见的开源数据库中间件相关的知识,希望对你有一定的参考价值。
最近学习了阿里资深技术专家李运华的架构设计关于读写分离的教程,颇有收获,总结一下。
1 读写分离概述
基本架构图:
2 适用场景
读写分离不是银弹,并不是一有性能问题就上读写分离,而是应该先优化,例如优化慢查询,调整不合理的业务逻辑,引入缓存查询等只有确定系统没有优化空间后才考虑读写分离集群。
3 引入的系统复杂度问题
问题一 主从复制延迟
问题二 分配机制
如何将读写操作区分开来,然后访问不同的数据库服务器?
解决方案1 客户端程序代码封装实现
基本架构图
业界开源实现
Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
淘宝TDDL淘宝根据自身业务需求研发了 TDDL ( Taobao Distributed Data Layer )框架,主要用于解决 分库分表场景下的访问路由(持久层与数据访问层的配合)以及异构数据库之间的数据同步 ,它是一个基于集中式配置的 JDBC DataSource 实现,具有分库分表、 Master/Salve 、动态数据源配置等功能。
解决方案2 服务端中间件封装
基本架构图
业界开源实现
mysql官方推荐的MySQL Router
MySQL Router是轻量级的中间件,可在应用程序和任何后端MySQL服务器之间提供透明路由。它可以用于各种各样的用例,例如通过有效地将数据库流量路由到适当的后端MySQL服务器来提供高可用性和可伸缩性。可插拔架构还使开发人员能够扩展MySQL Router以用于自定义用例。
基于MySQL Router可以实现读写分离,故障自动切换,负载均衡,连接池等功能。
MySQL官方提供的MySQL Proxy
360开源的Atlas
Atlas是由平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy的基础上,对其进行了优化,增加了一些新的功能特性。
常见的开源数据库中间件对比:
功能 | Sharding-JDBC | TDDL | Amoeba | Cobar | MyCat |
---|---|---|---|---|---|
基于客户端还是服务端 | 客户端 | 客户端 | 服务端 | 服务端 | 服务端 |
分库分表 | 有 | 有 | 有 | 有 | 有 |
MySQL交互协议 | JDBC Driver | JDBC Driver | 前端用NIO,后端用JDBC Driver | 前端用NIO,后端用BIO | 前后端均用NIO |
支持的数据库 | 任意 | 任意 | 任意 | MySQL | 任意 |
TDDL 不同于其它几款产品,并非独立的中间件,只能算作中间层,是以 Jar 包方式提供给应用调用。属于JDBC Shard 的思想,网上也有很多其它类似产品。
Amoeba 是作为一个真正的独立中间件提供服务,即应用去连接 Amoeba 操作 MySQL 集群,就像操作单个 MySQL 一样。从架构中可以看来,Amoeba 算中间件中的早期产品,后端还在使用 JDBC Driver。
Cobar 是在 Amoeba 基础上进化的版本,一个显著变化是把后端 JDBC Driver 改为原生的 MySQL 通信协议层。后端去掉 JDBC Driver 后,意味着不再支持 JDBC 规范,不能支持 Oracle、PostgreSQL 等数据。但使
用原生通信协议代替 JDBC Driver,后端的功能增加了很多想象力,比如主备切换、读写分离、异步操作等。
MyCat 又是在 Cobar 基础上发展的版本,两个显著点是:
(1)后端由 BIO 改为 NIO,并发量有大幅提高;
(2)增加了对Order By、Group By、limit 等聚合功能的支持(虽然 Cobar 也可以支持 Order By、Group By、Limit 语法,但是结果没有进行聚合,只是简单返回给前端,聚合功能还是需要业务系统自己完成)。
本帐号将持续分享后端技术干货,包括虚拟机基础,多线程编程,高性能框架,异步、缓存和消息中间件,分布式和微服务,架构学习和进阶等学习资料和文章。
以上是关于浅谈读写分离和几种常见的开源数据库中间件的主要内容,如果未能解决你的问题,请参考以下文章