摘要:本文详细介绍 MyCat 的 9 种分片规则(范围、取模等,含配置与适用场景),还阐述 MyCat 原理、管理端口与常用命令,以及 MyCat-eye 的安装、访问、配置和监控功能,助力高效管理分布式数据库。
思维导图
1. 分片规则
1.1 范围分片
1). 介绍
根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。
2). 配置
rule.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>
<property name="defaultNode">0</property>
</function>
分片规则配置属性含义:
在rule.xml中配置分片规则时,关联了一个映射配置文件 autopartition-long.txt,该配置文 件的配置如下:
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
autopartition-long.txt 含义:
0-500 万之间的值,存储在 0 号数据节点 (数据节点的索引从 0 开始);500 万 - 1000 万之间的数据存储在 1 号数据节点;1000 万 - 1500 万的数据节点存储在 2 号节点;
该分片规则,主要是针对于数字类型的字段适用。
1.2 取模分片
1). 介绍
根据指定的字段值与节点数量进行求模运算,根据运算结果,来决定该数据属于哪一个分片。
2). 配置
rule.xml分片规则配置:
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">3</property>
</function>
分片规则属性说明如下:
属性 | 描述 |
---|---|
columns | 标识将要分片的表字段 |
algorithm | 指定分片函数与 function 的对应关系 |
class | 指定该分片算法对应的类 |
count | 数据节点的数量 |
该分片规则,主要是针对于数字类型的字段适用。
1.3 一致性 hash 分片
1). 介绍
所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置,有效的解决了分布式数据的拓容问题。
2). 配置
rule.xml分片规则配置:
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">3</property>
</function>
分片规则属性含义:
属性 | 描述 |
---|---|
columns | 标识将要分片的表字段 |
algorithm | 指定分片函数与 function 的对应关系 |
class | 指定该分片算法对应的类 |
seed | 创建 murmur_hash 对象的种子,默认 0 |
count | 要分片的数据库节点数量,必须指定,否则没法分片 |
virtualBucketTimes | 一个实际的数据库节点被映射为这么多虚拟节点,默认是 160 倍,也就是虚拟节点数是物理节点数的 160 倍;virtualBucketTimes*count 就是虚拟结点数量; |
weightMapFile | 节点的权重,没有指定权重的节点默认是 1。以 properties 文件的格式填写,以从 0 开始到 count-1 的整数值也就是节点索引为 key,以节点权重值为值。所有权重值必须是正整数,否则以 1 代替 |
bucketMapPath | 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的 murmur hash 值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 |
1.4 枚举分片
1). 介绍
通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务 。
2). 配置
rule.xml分片规则配置:
<tableRule name="sharding-by-intfile">
<rule>
<columns>sharding_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<!-- 自己增加 tableRule -->
<tableRule name="sharding-by-intfile-enumstatus">
<rule>
<columns>status</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="defaultNode">2</property>
<property name="mapFile">partition-hash-int.txt</property>
</function>
分片规则属性含义:
属性 | 描述 |
---|---|
columns | 标识将要分片的表字段 |
algorithm | 指定分片函数与 function 的对应关系 |
class | 指定该分片算法对应的类 |
mapFile | 对应的外部配置文件 |
type | 默认值为 0;0 表示 Integer,1 表示 String |
defaultNode | 默认节点;小于 0 标识不设置默认节点,大于等于 0 代表设置默认节点;默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点;如果没有默认值,碰到不识别的则报错 。 |
1.5 应用指定算法
1). 介绍
运行阶段由应用自主决定路由到那个分片,直接根据字符子串 (必须是数字) 计算分片号。
2). 配置
rule.xml分片规则配置:
<tableRule name="sharding-by-substring">
<rule>
<columns>id</columns>
<algorithm>sharding-by-substring</algorithm>
</rule>
</tableRule>
<function name="sharding-by-substring"
class="io.mycat.route.function.PartitionDirectBySubString">
<property name="startIndex">0</property> <!-- zero-based -->
<property name="size">2</property>
<property name="partitionCount">3</property>
<property name="defaultPartition">0</property>
</function>
分片规则属性含义:
属性 | 描述 |
---|---|
columns | 标识将要分片的表字段 |
algorithm | 指定分片函数与 function 的对应关系 |
class | 指定该分片算法对应的类 |
startIndex | 字符子串起始索引 |
size | 字符长度 |
partitionCount | 分区 (分片) 数量 |
defaultPartition | 默认分片 (在分片数量定义时,字符标示的分片编号不在分片数量内时,使用默认分片) |
示例说明:
id=05-100000002,在此配置中代表根据 id 中从 startIndex=0 开始,截取 size=2 位数字即 05,05 就是获取的分区,如果没找到对应的分片则默认分配到 defaultPartition 。
1.6 固定分片 hash 算法
1). 介绍
该算法类似于十进制的求模运算,但是为二进制的操作
分片字段必须为数字类型。
可以均匀分配,也可以非均匀分配。
如果是求模,连续的值,分别分配到各个不同的分片;但是此算法会将连续的值可能分配到相同的分片,降低事务处理的难度。
2). 配置
rule.xml分片规则配置:
<tableRule name="sharding-by-long-hash">
<rule>
<columns>id</columns>
<algorithm>sharding-by-long-hash</algorithm>
</rule>
</tableRule>
<!-- 分片总长度为1024,count与length数组长度必须一致; -->
<function name="sharding-by-long-hash"
class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">2,1</property>
<property name="partitionLength">256,512</property>
</function>
分片规则属性含义:
属性 | 描述 |
---|---|
columns | 标识将要分片的表字段名 |
algorithm | 指定分片函数与 function 的对应关系 |
class | 指定该分片算法对应的类 |
partitionCount | 分片个数列表 |
partitionLength | 分片范围列表 |
1.7 字符串 hash 解析算法
1). 介绍
截取字符串中的指定位置的子字符串,进行 hash 算法,算出分片。
2). 配置
rule.xml分片规则配置:
<tableRule name="sharding-by-stringhash">
<rule>
<columns>name</columns>
<algorithm>sharding-by-stringhash</algorithm>
</rule>
</tableRule>
<function name="sharding-by-stringhash"
class="io.mycat.route.function.PartitionByString">
<property name="partitionLength">512</property> <!-- zero-based -->
<property name="partitionCount">2</property>
<property name="hashSlice">0:2</property>
</function>
分片规则属性含义:
属性 | 描述 |
---|---|
columns | 标识将要分片的表字段 |
algorithm | 指定分片函数与 function 的对应关系 |
class | 指定该分片算法对应的类 |
partitionLength | hash 求模基数;length*count=1024 (出于性能考虑) |
partitionCount | 分区数 |
hashSlice | hash 运算位,根据子字符串的 hash 运算;0 代表 str.length (),-1 代表 str.length ()-1,大于 0 只代表数字自身;可以理解为 substring ( start , end ),start 为 0 则只表示 0 |
1.8 按天分片算法
1). 介绍
按照日期及对应的时间周期来分片。
2). 配置
rule.xml分片规则配置:
<tableRule name="sharding-by-date">
<rule>
<columns>create_time</columns>
<algorithm>sharding-by-date</algorithm>
</rule>
</tableRule>
<function name="sharding-by-date"
class="io.mycat.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2022-01-01</property>
<property name="sEndDate">2022-01-30</property>
<property name="sPartionDay">10</property>
</function>
<!--
从开始时间开始,每10天为一个分片,到达结束时间之后,会重复开始分片插入
配置表的 dataNode 的分片,必须和分片规则数量一致,例如 2022-01-01 到 2022-12-31 ,每
10天一个分片,一共需要37个分片。
-->
分片规则属性含义:
属性 | 描述 |
---|---|
columns | 标识将要分片的表字段 |
algorithm | 指定分片函数与 function 的对应关系 |
class | 指定该分片算法对应的类 |
dateFormat | 日期格式 |
sBeginDate | 开始日期 |
sEndDate | 结束日期,如果配置了结束日期,则代码数据到达了这个日期的分片后,会重复从开始分片插入 |
sPartionDay | 分区天数,默认值 10,从开始日期算起,每个 10 天一个分区 |
1.9 自然月分片
1). 介绍
使用场景为按照月份来分片, 每个自然月为一个分片。
2). 配置
rule.xml分片规则配置:
<tableRule name="sharding-by-month">
<rule>
<columns>create_time</columns>
<algorithm>partbymonth</algorithm>
</rule>
</tableRule>
<function name="partbymonth" class="io.mycat.route.function.PartitionByMonth">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2022-01-01</property>
<property name="sEndDate">2022-03-31</property>
</function>
<!--
从开始时间开始,一个月为一个分片,到达结束时间之后,会重复开始分片插入
配置表的 dataNode 的分片,必须和分片规则数量一致,例如 2022-01-01 到 2022-12-31 ,一
共需要12个分片。
-->
分片规则属性含义:
属性 | 描述 |
---|---|
columns | 标识将要分片的表字段 |
algorithm | 指定分片函数与 function 的对应关系 |
class | 指定该分片算法对应的类 |
dateFormat | 日期格式 |
sBeginDate | 开始日期 |
sEndDate | 结束日期,如果配置了结束日期,则代码数据到达了这个日期的分片后,会重复从开始分片插入 |
2 MyCat 管理及监控
2.1 MyCat 原理
在 MyCat 中,当执行一条 SQL 语句时,MyCat 需要进行 SQL 解析、分片分析、路由分析、读写分离分析等操作,最终经过一系列的分析决定将当前的 SQL 语句到底路由到那几个(或哪个)节点数据库,数据库将数据执行完毕后,如果有返回的结果,则将结果返回给 MyCat,最终还需要在 MyCat 中进行结果合并、聚合处理、排序处理、分页处理等操作,最终再将结果返回客户端。
而在 MyCat 的使用过程中,MyCat 官方也提供了一个管理监控平台 MyCat-Web(MyCat-eye)。Mycat-web 是 Mycat 可视化运维的管理和监控平台,弥补了 Mycat 在监控上的空白。帮 Mycat 分担统计任务和配置管理任务。Mycat-web 引入了 ZooKeeper 作为配置中心,可以管理多个节点。Mycat-web 主要管理和监控 Mycat 的流量、连接、活动线程和内存等,具备 IP 白名单、邮件告警等模块,还可以统计 SQL 并分析慢 SQL 和高频 SQL 等,为优化 SQL 提供依据。
2.2 MyCat 管理
Mycat 默认开通 2 个端口,可以在 server.xml 中进行修改:
8066:数据访问端口,即进行 DML 和 DDL 操作;
9066:数据库管理端口,即 mycat 服务管理控制功能,用于管理 mycat 的整个集群状态。
连接 MyCat 的管理控制台
执行如下指令连接:
mysql -h 192.168.200.210 -p 9066 -uroot -p123456
常用管理命令
命令 | 含义 |
---|---|
show @@help | 查看 Mycat 管理工具帮助文档 |
show @@version | 查看 Mycat 的版本 |
reload @@config | 重新加载 Mycat 的配置文件 |
show @@datasource | 查看 Mycat 的数据源信息 |
show @@datanode | 查看 MyCat 现有的分片节点信息 |
show @@threadpool | 查看 Mycat 的线程池信息 |
show @@sql | 查看执行的 SQL |
show @@sql.sum | 查看执行的 SQL 统计 |
2.3 MyCat-eye
2.3.1 介绍
Mycat-web(Mycat-eye)是对 mycat-server 提供监控服务,功能不局限于对 mycat-server 使用。它通过 JDBC 连接对 Mycat、Mysql 监控,监控远程服务器(目前仅限于 linux 系统)的 cpu、内存、网络、磁盘。Mycat-eye 运行过程中需要依赖 zookeeper,因此需要先安装 zookeeper。
2.3.2 安装
1. zookeeper 安装;
2. Mycat-eye 安装。
具体的安装步骤省略。
2.3.3 访问
在浏览器中输入如下地址访问 Mycat-eye 管理界面:
http://192.168.200.210:8082/mycat
3.6.3.4 配置
1. 开启MyCat的实时统计功能(server.xml):
<property name="useSqlStat">1</property> <!-- 1为开启实时统计、0为关闭 -->
在 Mycat 监控界面配置服务地址:
2.3.5 测试
配置好之后,通过 MyCat 执行一系列增删改查操作,等待一段时间后,打开 mycat-eye 的管理界面,可查看以下监控数据:
1.性能监控:包括 Mycat 流量分析、连接分析、活动线程分析、缓冲队列分析、TPS 分析等。
2.物理节点:查看 Mycat 关联的各个数据库物理节点的状态信息,包括最后活动时间等。
3.SQL 统计:统计指定时间段内Mycat 执行的 SQL 情况,包括 SQL 执行时间分布、读次数等。
4.SQL 表分析:查看不同表(如 tb_app、tb_datepart、tb_longhash 等)的 SQL 操作情况。
5.SQL 监控:展示具体 SQL 语句的执行详情,包括 SQL 内容、耗时(ms)、执行时间等。
6.高频 SQL:统计指定时间段内执行频率较高的 SQL,包括 SQL 内容、平均耗时、最大耗时等。
大功告成!