三个方向:

一、应用中自己实现,可直连数据库,自己实现因目前使用的Mybatis框架可以使用两种做法:

1、在SQL中直接分表逻辑,我查了一下代码中的sql,发现join的千姿百态,不大动这些sql这事基本不现实,优点是定制化,针对性比较高,性能方面损耗比较低,调试调优简单,但是扩展性要差一些。

2、在Mybatis的拦截器里对SQL进行截取拼装,如果能对指定表做的并对相关表的join sql调整一下的话,就是需要规划下占位符及分表jion策略,另外需要对多种情况进行大量测试,这个策略要比手改sql通用所以也复杂很多,相对于上一条,优缺点都相对模糊一点。

二、直接购买云服务DRDS,DRDS基于TDDL,但是与我们目前的RDS是不同的产品,切换时可能需要停机,TDDL的重点部分并未开源,对关键点的实现不好评估。DRDS分共享版和专享版两种,价格差别是数量级层面的,共享版比我们目前用的RDS要便宜很多,专享版要贵差不多一倍。据说已经有P2P公司在使用这个产品,推测使用的是最大送达模型,这个模型需要保证幂等,协调者(重试服务)必须高可用。

RDS迁移DRDS需要注意什么?

DRDS用的是最大努力送达?

分页如何处理的,会不会存在每次都是查询0到当前,越翻越慢的问题?

  • 暂不支持非 WHERE 条件的 Correlate Subquery。
  • 暂不支持 SQL 中带聚合条件的 Correlate Subquery。

https://help.aliyun.com/document_detail/49249.html?spm=5176.7947010.211449.2.4oyoNx

https://help.aliyun.com/document_detail/29669.html?spm=5176.7752178.6.586.xoHQwR

另外,阿里云还有全局事务服务,正在公测:https://www.aliyun.com/aliware/txc

三、通过中间件

首先排除掉收费的,之后考察了

MyCAT(https://github.com/MyCATApache):

社区爱好者在阿里cobar基础上进行二次开发,发现对我们公司不适合分库和多节点情况下使用,然而感觉单库单节点(单RDS主多从,拦截器实现读写分离)情况下,还要为它支出服务器和运维资源有些不值得,而且它本身没有提供高可用,需要另外部署haproxy,还要保证haproxy的高可用。多节点情况下,分页的sql在非第一页的情况下会被改写:

改写的原因应该是多节点数据混合排序,但是每次都是查0到当前最后对我们的应用情况来看,压力有些过,如果只用一个节点,看上去倒是不错

关于分表发现了这么一句注释:

这倒应该不是说不能join,说的应该是不能随意join,我并没花时间细致在代码里证明,它本身提供了一些说明,在join情况下有两种方式可用,一种是全局表,另外一种是join关联条件的数据要保证在同一库上,如果被jion的结果集中有部分数据没在当前SQL执行的所在库上,那么查询结果就是错的

第二个问题是分布式事务,也是多节点,无法保证强一致性:

循环执行收到的请求,如果是提交则执行CommitNodeHandler,如果是回滚则执行RollbackNodeHandler:

public void rollback() {
final int initCount = session.getTargetCount();
lock.lock();
try {
reset(initCount);
} finally {
lock.unlock();
}
if (session.closed()) {
decrementCountToZero();
return;
} // 执行
int started = 0;
for (final RouteResultsetNode node : session.getTargetKeys()) {
if (node == null) {
LOGGER.error("null is contained in RoutResultsetNodes, source = "
+ session.getSource());
continue;
}
final BackendConnection conn = session.getTarget(node); if (conn != null) {
boolean isClosed=conn.isClosedOrQuit();
if(isClosed)
{
session.getSource().writeErrMessage(ErrorCode.ER_UNKNOWN_ERROR,
"receive rollback,but find backend con is closed or quit");
LOGGER.error( conn+"receive rollback,but fond backend con is closed or quit");
}
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("rollback job run for " + conn);
}
if (clearIfSessionClosed(session)) {
return;
}
conn.setResponseHandler(RollbackNodeHandler.this); //support the XA rollback
if(session.getXaTXID()!=null && conn instanceof MySQLConnection) {
MySQLConnection mysqlCon = (MySQLConnection) conn;
String xaTxId = session.getXaTXID();
//exeBatch cmd issue : the 2nd package can not receive the response
mysqlCon.execCmd("XA END " + xaTxId + ";");
mysqlCon.execCmd("XA ROLLBACK " + xaTxId + ";");
}else {
conn.rollback();
} ++started;
}
}

但问题是已经成功的提交无法回滚,就会造成分库或多节点间数据不一致。

Vitess:

Youtube出的与我们现有架构中需要注入的接口对应不上,需要改造现有接口,不太满足要求

Atlas(https://github.com/Qihoo360/Atlas):

360开源的,但是在github上发现他们似乎不太会花精力维护了,最近一次代码的更新时两年前了,另外启了事务似乎不分读写都会走主库,关于跨库方面似乎也不是很符合我们的需求。

Oceanus(https://github.com/58code/Oceanus):已经很久没维护了,而且只有37个提交。

DBProxy (https://github.com/Meituan-Dianping/DBProxy)

美团,C语言开发的,独立部署式的,还是希望能有一个直连的,并且有问题可以自己改的

 

sharding-jdbc https://github.com/dangdangdotcom/sharding-jdbc

当当直连数据库式的,下面是2017-03-30截的图,大版本改动太大稳定性如何,感觉还是要看一段时间再入场比较好,

最大努力送达模型,其他方面目前感觉是最合适的,分片配置成一个就是不分库

==========================================================

咱最近用的github:https://github.com/saaavsaaa

微信公众号:

                      

mysql分表分库选型的更多相关文章

  1. 总结下Mysql分表分库的策略及应用

    上月前面试某公司,对于mysql分表的思路,当时简要的说了下hash算法分表,以及discuz分表的思路,但是对于新增数据自增id存放的设计思想回答的不是很好(笔试+面试整个过程算是OK过了,因与个人 ...

  2. mysql分表分库

    单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 随着用户数量的增加,user表的数据量会越来越大,当数 ...

  3. mysql分表分库 ,读写分离

    1.分表 当项目上线后,数据将会几何级的增长,当数据很多的时候,读取性能将会下降,更新表数据的时候也需要更新索引,所以我们需要分表,当数据量再大的时候就需要分库了. a.水平拆分:数据分成多个表 b. ...

  4. 重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

    一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库 ...

  5. Mysql分表和分区的区别、分库分表介绍与区别

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  6. Mysql分表和分区的区别、分库分表介绍与区别(转)

    分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...

  7. 由mysql分区想到的分表分库的方案

    在分区分库分表前一定要了解分区分库分表的动机. 对实时性要求比较高的场景,使用数据库的分区分表分库. 对实时性要求不高的场景,可以考虑使用索引库(es/solr)或者大数据hadoop平台来解决(如数 ...

  8. Mysql分表和分区的区别、分库和分表区别

    一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法. 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个 ...

  9. 一、mysql分表简单介绍

    一.Mysql分表的原因 1.当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了. 分表的目的就在于此,减小数据库的负担,缩短查询时间. 2.mysql中 ...

随机推荐

  1. Solr Dismax查询解析器-深入分析

    Solr 支持多种查询解析,给搜索引擎开发人员提供灵活的查询解析.Solr 中主要包含这几个查询解析器:标准查询解析器.DisMax 查询解析器,扩展 DisMax 查询解析器(eDisMax) Di ...

  2. jquery中的trigger()和preventDefault()方法

    trigger()方法用户模拟用户操作,比较常见的一种情况就是输入框自动获得焦点: <!doctype html> <html> <head> <meta c ...

  3. asdfadsf

    bool is_r_value(int &&) { return true; } bool is_r_value(const int &) { return false; } ...

  4. php判断一个数组是另一个数组的子集

    需求最少的时间复杂度判断$a数组是否是$b数组的子集 // 快速的判断$a数组是否是$b数组的子集$a = array(135,138);$b = array(135,138,137); 实现方法 这 ...

  5. 健康类App原型制作分享-Mindmate

    Mindmate是一款健康类App,主要是帮助人们快速入眠,放松情绪,它拥有小清新的界面,配图全是由插画组成,生动有趣.在这款原型中,为了保持App的原有特色,将插画通过图片组件导入进来:音乐播放界面 ...

  6. CSS 如何让Table的里面TD全有边框 而Table的右左边框没有

    比如这样一个CSS.td3{font-size: 14px;color: #FFFFFF;background-color: #000000;BORDER-RIGHT: #f6f6f6 1px sol ...

  7. SLAM拾萃(1):octomap

    前言 大家好,时隔多年之后,我又开始了博客旅程.经历了很多事情之后呢,我发现自己的想法真的很简单:好好读书做课题,闲下来时写写博客,服务大家.所以我会继续写SLAM相关的博客.如果你觉得它对你有帮助, ...

  8. JQuery和JS操作LocalStorage/SessionStorage的方法(转)

    出处:http://blog.csdn.net/djzhao627/article/details/50747628 首先说一下LocalStorage和SessionStorage LocalSto ...

  9. jquery中prop()和attr()的区别

    相比attr,prop是1.6.1才新出来的,两者从中文意思理解,都是获取/设置属性的方法(attributes和properties).只是,window或document中使用.attr()方法在 ...

  10. jQuery动画中stop()与 finish()区别

    stop():接受三个参数,(要停止的动画名称:是否清空队列中的动画:是否当前动画立即完成) stop()相当于stop(false,false)表示停止执行当前动画,后续动画接着进行 stop(tr ...