【经验分享】MyCAT 中间件

学习了一下数据量过大的解决方案,使用 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个可配置的属性,参数释义如下所示:

  1. .name:对应MySQL中的表名。

  2. .dataNode:逻辑表所在的分片,该属性值需要和dataNode标签的name属性对应。

  3. .rule:逻辑表使用的分片规则名称。规则在conf/rule.xml中配置,该属性值必须与tableRule标签中的name属性值对应。

  4. .ruleRequired:是否绑定分片规则,如果为true,就一定要配置rule。

  5. .primaryKey:逻辑表对应真实表的主键。

  6. .type:逻辑表类型,分为全局表和普通表,后面会详细说明该属性。

  7. .autoIncrement:是否启用从自增主键,对应MySQL自增主键,默认是禁用的。

  8. .subTable:分表,MyCAT1.6以后开始支持该属性。

  9. .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
相关推荐
ruanjiananquan996 分钟前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
chuanauc33 分钟前
Kubernets K8s 学习
java·学习·kubernetes
一头生产的驴1 小时前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao1 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
zzywxc7871 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
YuTaoShao3 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张33 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
llwszx6 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野7 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person7 小时前
Java SE--方法的使用
java·开发语言·算法