Mycat 分库分表的数据库中间件

Mycat 是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分表分库、容灾备份,而且可以用 于多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性,借助于即将发布的Mycat 智能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。

OLTP:联机事务处理

OLAP:联机分析处理

 

数据切分原则

第一原则:能不切分尽量不要切分。

第二原则:如果要切分一定要选择合适的切分规则,提前规划好。

第三原则:数据切分尽量通过数据冗余或表分组(Table Group)来降低跨库Join 的可能。

第四原则:由于数据库中间件对数据Join 实现的优劣难以把握,而且实现高性能难度极大,业务读取 尽量少使用多表Join。

后端可以支持MySQL、SQL Server、 Oracle、DB2、PostgreSQL 等主流数据库,也支持MongoDB 这种新型NoSQL 方式的存储

 

table中dataNode的数量决定了这张表是否是分片表,数据量的大小决定了这张表是否需要分片。

通过设置表分组(Table Group),使得相互关联的表数据存在同一分片上,保证数据Join 不会跨库操作。

全局表(相当于字典表或者基础数据表)会和很多业务数据表有关联,由于数据量不大,数据也很少变更,所以在所有分片上都拷贝一份。

如果有数据表不需要分片,则需要在schema上设置dataNode,作为默认节点。

 

多租户在数据存储上存在三种主要的方案:

1.独立数据库,即一个租户一个数据库,这种方案的用户数据隔离级别最高,安全性最好,但成本也高。

2.共享数据库,隔离数据架构,即多个或所有租户共享Database,但是每个租户一个Schema。

3.共享数据库,共享数据架构,即租户共享同一个Database、同一个Schema,但在表中通过TenantID 区分租户的数 据。这是共享程度最高、隔离级别最低的模式

 

Mysql主从复制原理

 

Master写入数据后,生成二进制log,Slave启动I/O线程来读取这个log,并记录到中继日志中去,Sql线程读取中继日志,并做重放工作,获取日志和数据重放工作是异步进行的。

 

Mycat目前采用的是弱XA事务机制

for( dn1,dn2,dn3){

set autocommit=0;

update person set name='xxxx' where age >18;

}

f(allOK){

for(dn1,dn2,dn3){

commit;

}

}

因为第二阶段Commit 的时候,若某个节点出错了,也无法等节点恢复以后去做 Recover 操作,重新commit,但考虑到所有的节点都执行成功,但Commit 指令失败的概率很小,因此这种 弱XA 事务也已经满足大多数应用的需求,而且性能接近普通事务。

 

MySQL的XA事务存在缺陷?

主库在第二阶段提交时,某节点宕掉后出现commit失败,当节点恢复,重新提交,不会记录bin log日志?导致从库复制不了该数据?

 

JDBC体系结构

1:JDBC API:提供应用程序到JDBC 管理器连接。

2:JDBC Driver API:支持JDBC 管理器-驱动器连接。

 

Mycat的不足之处(会在未来版本中完善)

1.还不支持自身的集群

2.当前采用的是弱XA事务机制,将来打算记录事务管理器日志,存放在zookeeper上,当第二阶段commit失败后,无法等节点恢复做 Recover 操作,重新commit

3.目前bug还比较多,某些配套项目因为人力不够,暂时还未启动

4.数据多次扩展难度跟维护量极大。

5.跨库join 性能较差。

 

Mycat的坑

1.order by 的字段必须出现在select 字典里

2.insert into 操作必须显示地指定列,除了自增的主键列

3.建议用命令行方式执行Mycat的相关命令和SQL操作,类似于WorkBeanch客户端会干掉Mycat的注解,导致报错

posted on 2017-07-28 14:34  摩羯的小石头  阅读(314)  评论(0编辑  收藏  举报