学习了一下数据量过大的解决方案,使用 MyCAT 中间件。
MyCAT 可以解决分布式事务、读写分离、主从、分片等一系列MySQL集群和分布式问题。 整体过程可以概括为拦截 - 分发 - 响应
例如设置 MyCAT 分片规则为每500万条数据就换一个数据库存储。
分库分表的中心思想都是将数据分散存储,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。
分库分表的形式,主要是两种:垂直拆分和水平拆分。而拆分的粒度,一般分为分库和分表。
Mycat最重要的3大配置文件
server.xml
配置 MyCAT 数据库的账号和密码配置文件
schema.xml
主要记录了主从库等相关信息
writeHost 为写入节点,readHost为读取节点
schema 标签的 name 属性为 MyCAT 访问看到的数据库名(逻辑库名)
XML
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="test" dataNode="mycat1,mycat2,mycat3" rule="auto-sharding-long"/>
</schema>
dataNode 属性配置为表切分后,例如分别对应 localhost1 的三个库
XML
<dataNode name="mycat1" dataHost="localhost1" database="mycat1" />
<dataNode name="mycat2" dataHost="localhost1" database="mycat2" />
<dataNode name="mycat3" dataHost="localhost1" database="mycat3" />
table标签是逻辑表的配置,其中一共包含9个可配置的属性,参数释义如下所示:
-
.name:对应MySQL中的表名。
-
.dataNode:逻辑表所在的分片,该属性值需要和dataNode标签的name属性对应。
-
.rule:逻辑表使用的分片规则名称。规则在conf/rule.xml中配置,该属性值必须与tableRule标签中的name属性值对应。
-
.ruleRequired:是否绑定分片规则,如果为true,就一定要配置rule。
-
.primaryKey:逻辑表对应真实表的主键。
-
.type:逻辑表类型,分为全局表和普通表,后面会详细说明该属性。
-
.autoIncrement:是否启用从自增主键,对应MySQL自增主键,默认是禁用的。
-
.subTable:分表,MyCAT1.6以后开始支持该属性。
-
.needAddLimit:是否允许自动添加在schema标签中设置的limit,默认为true。
rule.xml
MyCAT通过rule.xml配置水平分表策略,通过schema.xml(使用table标签)指定表的分表策略。
常见的分片规则
-
取模算法
-
按日期分片算法
案例使用 ID 范围分片为例,使用 name 为 auto-sharding-long ,读取的分片规则文件定义在 autopartition-long.txt
XML
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
autopartition-long.txt
修改为 id 范围0-2的为第0个库,3-4为第1个库,5-6为第2个库
bash
# range start-end ,data node index
# K=1000,M=10000.
0-2=0
3-4=1
5-6=2