mycat
原理
主要根据对sql的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。
子主题 2
分片
拆分
- 水平拆分
- 要把一个表按照某种规则把数据划分到不同表或数据库里
- 常用规则
- *ID
- *日期
- *特定字段取模
- 优点
- *拆分规则抽象好,join操作基本可以数据库内完成
- *不存在单库大数据,高并发的性能瓶颈
- *应用端改造少
- *提高了系统稳定性和负载能力
- 缺点
- *拆分规则难以抽象
- *分片事务一致性难以解决
- *数据多次扩展难度跟维护量极大
- *跨库join性能较差
- 垂直拆分
- 表按模块划分到不同数据库表中
- 一般按照业务表进行分类,划分为不同的业务、模块库,耦合度越低,越容易做垂直拆分,
- 跨库Join,采用共享数据源或分库接口调用,根据资源和数据规模、负载而定
- 优点
- *拆分后业务清晰,拆分规则明确
- *系统之间整合或扩展容易
- *数据库维护简单
- 缺点
- *部分业务表无法Join,只能通过接口方式解决,提高了系统复杂度
- *受每种业务不同的限制存在单库性能瓶颈,不容易扩展跟性能提高
- *事务处理复杂
总结
- c.水平拆分和垂直拆分共同缺点
- *分布式事务处理困难
- *跨节点join困难
- *扩数据源管理复杂
- d.切分总则
- *能不切分的尽量不切分
- *如果要切分,选择合适的切分规则,提前规划好
- *数据库切分尽量通过数据冗余或表分组来降低跨库join
- *业务尽量使用少的多表join
使用场景
(1)单纯读写分离,此时配置最为简单,支持读写分离、主从切换
(2)分库分表,对记录超过1000万的表进行水平拆分,最大支持1000亿单表水平拆分
(3)多租户应用,每个应用一个数据库,但程序只需连接MyCAT,程序不改变,实现多租户化
(4)报表系统,借住MyCAT分表能力,处理大规模的报表统计
(5)替代Hbase,分析大数据
(6)海量实时数据查询
概念
逻辑库(schema)
- 逻辑库是mycat中间件层配置的对应实际一个或多个业务数据库集群构成
- 子主题 1
逻辑表(table)
- a.逻辑表是mycat切分到多个数据库或者不切分对应用程序显示的统一的表。
- b.分片表是原有的大表,经过分片,分布在不同数据库、相同数据库的保留相同表结构,但数据不同的表。
- c.非分片表是未做切分的表。
- d.ER表基于E-R关系分片策略,子表记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组保证数据join不会跨库操作。
- e.全局表,业务系统中变化不大、数据量不大(十万以下),但又需要经常关联的表,mycat采用冗余在各个节点一个份来完成。
分片节点(dataNode)
- 数据库分片后,一个大表被切分到不同的分片数据库上,每个表分片所在的数据库就是分片节点。
分片主机(dataHost)
- 分片节点所在的服务器,数据切分后,每个分片节点不一定都会独占一台服务器,同一个分片服务器可能存储多个分片节点,尽量使读写压力高的分片节点均衡的放在不同的节点主机上。
分片规则(rule)
- 按照某种业务规则把数据分到某个分片节点上的规则,就是分片规则。(分片规则非常重要,直接决定后续数据处理复杂度)
全局序列号(sequence)
- 当数据库分片后,原有的主键约束在分布式条件下无法使用,因此需要引入外部机制保证数据唯一表示,这种保证全局的数据唯一表示机制就是全局序列号(sequence)。
多租户
- 多用户的环境共用相同的系统、程序组件,并且确保各用户间数据的隔离性。
- a.一个用户一个数据库,隔离级别最高、安全性最好,费用最高
- b.共享数据库,隔离数据架构,每个用户一个schema
- c.共享数据库,共享数据架构,共享database、schema,通过表tenantID区分租户数据
schema
- table1
- dataNode
- datanode
- datanode1
- datahost
- writehost
- readhost
- database
- datahost
- tablename
- tableprimarykey
- teblerule
- dataNode
- table2
- schema.xml
-
<mycat:schema xmlns:mycat=“http://io.mycat/”>
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="h" primaryKey="ID" dataNode="ddn1,ddn2,ddn3,ddn4,ddn5,ddn6,ddn7,ddn8" rule="mod-long" />
<table name="h1" primaryKey="ID" dataNode="ddn1,ddn2,ddn3,ddn4,ddn5,ddn6,ddn7,ddn8" rule="mod-long" />
</schema>
<dataNode name="ddn1" dataHost="localhost1" database="db1" />
<dataNode name="ddn2" dataHost="localhost1" database="db2" />
<dataNode name="ddn3" dataHost="localhost1" database="db3" />
<dataNode name="ddn4" dataHost="localhost1" database="db4" />
<dataNode name="ddn5" dataHost="localhost2" database="db1" />
<dataNode name="ddn6" dataHost="localhost2" database="db2" />
<dataNode name="ddn7" dataHost="localhost2" database="db3" />
<dataNode name="ddn8" dataHost="localhost2" database="db4" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root"
password="19941101">
<readHost host="hostS2" url="localhost:3306" user="root" password="19941101" />
</writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM2" url="localhost:3306" user="root"
password="19941101">
<readHost host="hostS2" url="localhost:3306" user="root" password="19941101" />
</writeHost>
</dataHost>
</mycat:schema>
*
*XMind: ZEN - Trial Version*