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的注解,导致报错