前言
本章主要整理 MyCat核心配置说明
图片来源:https://coding.imooc.com/class/208.html
核心配置文件说明
文件名 | 说明 | 功能 |
---|---|---|
server.xml | 虚拟MySQL | 配置系统相关参数 配置用户访问权限 配置SQL防火墙及SQL拦截功能 |
schema.xml | 数据库配置 | 配置逻辑库及逻辑表 配置逻辑表所存储的数据节点 配置数据节点所对应的物理数据库服务信息 |
rule.xml | 切片规则 | 配置水平分片的分片规则 配置分片规则所对应的分片函数 |
log4j2.xml | 日志文件 | 配置输出日志的格式 配置输出日志的级别 |
核心文件 - rule.xml
完整配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="order_master">
<rule>
<columns>customer_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">4</property>
</function>
</mycat:rule>
<tableRule>
标签配置表的分片规则
- name 属性指定分片表规则的名字,这个命名要唯一
<columns>
标签指定表的分片列<algorithm>
指定表的分片算法,取<function>
的name属性
<function>
配置表的分片算法
- name 属性定义分片算法的名字
- class 指定分片算法java类
- property 参数名,参数值
常见分片算法
分片算法 | 说明 | 适合场景 |
---|---|---|
PartitionByMod | 简单取模 | 数据增长速度慢,难于增加分片 |
PartitionByHashMod | 哈希取模 | 数字无法分片时 |
PartitionByFileMap | 分片枚举(枚举值切分) | 归类存储数据,适合大多数业务 |
PartitionByPrefixPattern | 字符串访问取模分片 | 可以根据指定字符串的前N个字符确认存储位置 |
AutoPartitionByLong | 范围分片 | 数据快速增长,容易增加分片 |
PartitionByDate | 日期(天)分片 | 数据快速增长,容易增加分片 |
简单取模 - PartitionByMod
介绍
- 可以用于分片列为整数类型的表
- 分片列 mod 分片基数
- 类全名:io.mycat.route.function.PartitionByMod
适合场景
- 求模切分适合用于初始化数据很大,但是数据增长不快的场景
- 场景:地图产品、行政数据、企业数据
弊端
- 如后期要扩展多个MySQL时,我们需进行数据迁移(万不得已是, 建议使用x2)
实现原理
代码实例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="customer_login">
<rule>
<columns>customer_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property>
</function>
</mycat:rule>
哈希取模 - PartitionByHashMod
- 可以用于多种类型数据如字符串,日期等
- hash(分片列) mod 分片基数
- 类全名:io.mycat.route.function.PartitionByHashMod
实现原理
代码实例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="customer_login">
<rule>
<columns>login_name</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByHashMod">
<property name="count">2</property>
</function>
</mycat:rule>
分片枚举 - PartitionByFileMap
介绍
-
按照某个字段的值(数字)来切分数据
-
可以根据可能得枚举值指定数据存储的位置
-
$MYCAT/conf 目录下增加MapFile配置枚举值同节点的对应关系
-
类全名:io.mycat.route.function.PartitionByFileMap
适合场景
- 按照城市切分业务,某个城市出问题了,也只影响某城市的数据读取
弊端
- 分布不均匀
实现原理
代码实例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="sharding-by-intfile">
<rule>
<columns>user_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="type">0</property>
<property name="defaultNode">0</property>
</function>
</mycat:rule>
partition-hash-int.txt 配置:
10000=0
10001=1
DEFAULT_NODE=0
补充属性说明
属性 | 说明 |
---|---|
type | 0:integer,非0:string |
defaultNode | >=0 :启动默认节点,<0 不启动默认节点 |
字符串访问取模分片 - PartitionByPrefixPattern
- 可以根据指定字符串的前N个字符确认存储位置
- $MYCAT/conf 增加MapFile配置取模范围同节点的对应关系
- 类全名:io.mycat.route.function.PartitionByPrefixPattern
代码实例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="sharding-by-prefixpattern">
<rule>
<columns>user_id</columns>
<algorithm>sharding-by-prefixpattern</algorithm>
</rule>
</tableRule>
<function name="sharding-by-pattern"
class="io.mycat.route.function.PartitionByPrefixPattern">
<property name="patternValue">256</property>
<property name="prefixLength">5</property>
<property name="mapFile">partition-pattern.txt</property>
</function>
</mycat:rule>
partition-pattern.txt
0-63=0
64-127=1