MYSQL官方:
Connector/J:JDBC Type 4驱动,纯java实现Mysql协议,并且不依赖Mysql客户端库(MySQL client libraries)
提供的功能:
1:Load balancing,用于读/写操作负载
如:jdbc:mysql:loadbalance://localhost:3306,localhost:3310/sakila
2:replication,用于读/写分离&读/写负载
如:jdbc:mysql:replication://master,slave1,slave2,slave3/test
缺点:
1:不支持分库分表
MySQLProxy
MySQL Proxy is not GA, and is notrecommended for Production use.
We recommend MySQL Router forproduction use. Download MySQL Router
MySQLFabric
主要功能:
1:可扩展
2:HA
3:sharding
缺点:
1:移动数据和分片时,依赖myqldump&mysql,操作不可控
2:数据分片策略不透明,文档不完善
阿里:
TDDL
公布的文档较少,只是部分开源,分表分库部分未开源,还需要依赖diamond
当当 Sharding-JDBC
开源地址:https://github.com/dangdangdotcom/sharding-jdbc/tree/master
Doc:http://dangdangdotcom.github.io/sharding-jdbc/
概述:Sharding-JDBC是JDBC的扩展封装,依jar的形式存在于工程内
特性:
1:分片(支持单库分表)
支持全局内的group by、order by、limit
支持inner
join、outer join
支分片算法"="、between&in
分片算法客制化
2:读、写分离
3:柔性事务(目前仅支持最大努力发送)
4:兼容性
ORM自适应
连接池自适应
外部依赖:
1:为了防止事务丢失,需要提供事务日志存储库
2:柔性事务采用异步尝试,需要部署独立的job和Zookeeper
核心概念
LogicTable/ActualTable/DataNode/DynamicTable/BindingTable
ShardingColumn/ShardingAlgorithm/SQLHint
缺点:
1:分片规则需要hard
code到业务代码中,未来路线规划会简化
2:由于业务工程里各自配置多数据源(主、从),不能做到统一数据库连接管理
3:不支持全局表,比如:数据字典类的表
性能:
基于Druid的高性能SQL解析
多线程处理结果归并
性能损失率约0.02%
稳定性
完善的疲劳测试,普通查询无Full GC(GROUP BY除外)
SQL限制
DDL/UNION/UNION ALL/批量insert/DISTINCT/子语句,未来路线规划会支持DISTINCT
单条数据insert必须包括分片键或者hint分片键
不支持insert into … select
不支持having,未来路线规划会支持
MyCat
完全开源
基于阿里Cobar
是应用与数据库之间的中间层(代理)
特性:
基于心跳的自动故障切换,支持读写分离
单库内任意join
支持全局表(字典类的表)
分片规则丰富
提供web、命令行监控
柔性事务:XA
支持IP黑白名单、SQL黑名单、SQL注入攻击拦拦截
SQL限制
不支持批量插入
缺点:
需要保证中间件的可用性,会增加运维成本及复杂度
优点:
有效解决了数据库链接数多的问题,因为各工程应用只连接中间件,中间件代理了真实的物 理链接,并且与后端mysql物理链接是复用型的
所有的分库分表等规则集中配置在中间件上,更可控
360 Atlas
基于Mysql Proxy改造
中间件,作为程序访问数据库的代理
主要功能:
读写分离
从库LB
IP过滤
自动分表(策略:shard key、range、hash)
DB平滑上、下线
自动摘除宕机的DB
缺点:
事务不能跨分片
扩容:
只支持以range方式的节点扩展,修改配置文件后重启生效
美团DBProxy
基于360Atlas
缺点:
暂时只支持分表,不支持分库分表
扩容:
支持平滑backend上下线
支持DBProxy平滑重启功能