我们知道最简单的一种扩展是MySQL 主从复制,通过1主多从来实现读的性能扩展,但是这样的扩展不仅仅有局限性,而且写入的问题并没有解决。目前市场上用三类解决方案:
1.客户端分片(推荐)
程序客户端进行分库分表。也就是直接在程序里面进行数据库和表的拆分,例如用户表。根据用户的UID,例如13678789,根据最后一位,可以拆分为0-9共10个数据库,把尾号是0的存入db_user_0数据库,尾号是1的存入db_user_1数据库,select的时候也是一样。然后根据倒数第二位,可以拆分为0-9共10张表,根据倒数第二的尾号写入相应的表中。例如13678789这个UID的信息,写入db_user_9数据库的table_user_8的表中。
2.各种数据成中间件:
2.1 MySQL-Proxy(不强烈推荐)
先说MySQL自己的,MySQL Proxy: 是处在你的MySQL数据库客户和服务端之间的程序,它还支持嵌入性脚本语言Lua。这个代理可以用来分析、监控和变换(transform) 通信数据。
MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”。基本的原理是让主数据库处理事务性查询,而从数据库处理SELECT查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。
2.2 Atlas(不强烈推荐)
Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。同时,有超过50家公司在生产环境中部署了Atlas,超过800人已加入了我们的开发者交流群,并且这些数字还在不断增加。
主要功能:
- 读写分离
- 从库负载均衡
- IP过滤
- 自动分表
- DBA可平滑上下线DB
- 自动摘除宕机的DB
简单的说是在MySQL Proxy的基础上做了二次开发,并支持了自动分表的特性。但是仅支持非常有限的rang进行分表。目前有先的分支Atlas Sharding来实现更多的功能。
具体的功能清看Github,非常详细
https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
2.3 Cobar(不强烈推荐)
Cobar是阿里巴巴开源的一个,提供关系型数据库(MySQL)分布式服务的中间件,它可以让传统的数据库得到良好的线性扩展,并看上去还是一个数据库,对应用保持透明。
- 产品在阿里巴巴稳定运行3年以上。
- 接管了3000+个MySQL数据库的schema。
- 集群日处理在线SQL请求50亿次以上。
- 集群日处理在线数据流量TB级别以上。
详情:https://github.com/alibaba/cobar/wiki
2.4 MyCAT(不强烈推荐)
MyCAT基于阿里开源的Cobar产品而研发的,目前社区相对比较活跃,功能也是最多的一个MySQL中间件,
什么是MYCAT?
- 一个彻底开源的,面向企业应用开发的大数据库集群
- 支持事务、ACID、可以替代MySQL的加强版数据库
- 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
- 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品
3.MySQL 集群
3.1 MySQL Cluster(强烈不推荐)
MySQL Cluster 是 MySQL 适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器。几乎无应用案例,不推荐。
3.2 Percona XtraDB Cluster方案(推荐)
Percona XtraDB Cluster简称PXC。Percona Xtradb Cluster的实现是在原mysql代码上通过Galera包将不同的mysql实例连接起来,实现了multi-master的集群架构。
上图中有三个实例,组成了一个集群,而这三个节点与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,这种一般称为multi-master架构,当有客户端要写入或者读取数据时,随便连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构。
以上为个人生产经验,不代表产品本身的相关利益,不过还好了,都是开源的,大家可以根据自身情况选择。你会发现并没有强烈推荐的方案,主要是大家要考虑自身业务的情况进行选择,例如核心业务。连主从切换都不推荐自动,而是手动,宁愿业务不能访问,也不能出现自动主从切换导致数据丢失。