一、分片规则
1、分片表与非分片表
Mycat位于应用与数据库的中间层,可以灵活解耦应用与数据库,后端数据库可以位于不同的主机上。在Mycat中将表分为两种大的概念:对于数据量小且不需要做数据切分的表,称之为非分片表;对于数据量大到单库性能、容量不足以支撑,数据需要通过水平切分均匀分布到不同的数据库中的表,称之为分片表。而中间件最终需要处理的事情是对数据切分、聚合。
2、ER关系分片表
ER模型是实体关系模型,广泛采用概念模型设计方法,基本元素是实体、关系和属性。Mycat 创新性地将它引入数据切分规则中,使得有互相依赖的表能够按照某一规则切分到相同的节点上,避免跨库Join关联查询。
例子:
我们一般会把订单表和订单明细表中的数据分开来存储。订单表为order,订单详情表为order_detail。我们在配置分片的时候就可以配置成:
<table name="order" primaryKey="id" dataNode="dn$1-10" rule="mod-long" autoIncrement="true" fetchStoreNodeByJdbc="true">
<childTable name="order_detail" primaryKey="id" joinKey="order_id" parentKey="order_id"> </childTable>
</table>
3、分片规则rule.xml文件详解
3.1、function标签
<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 默认是0 -->
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
<!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
</function>
· name属性指定算法的名称,在该文件中唯一。
· class属性对应具体的分片算法,需要指定算法的具体类。
· property属性根据算法的要求指定,
3.2、tableRule标签
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
· name属性指定分片唯一算法的名称。
· rule属性指定分片算法的具体内容,包含columns和algorithm两个属性。
· columns属性指定对应的表中用于分片的列名。
· algorithm属性对应function中指定的算法的名称
4、取模分片
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
配置说明如下。
· columns用来标识将要分片的表字段
· algorithm指定分片函数与function对应
5 、枚举分片
<tableRule name="sharding-by-intfile">
<rule>
<columns>sharding_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>
</function>
配置说明如下:
· columns指定分片的表列名。
· algorithm指定分片函数的名称,与function中mapFile配置文件标识的名称一致。
· type的默认值为0,0表示Integer,非零表示String。
6 、范围分片
适用于想明确知道分片字段的某个范围属于哪个分片时,配置如下:
<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>
配置说明如下:
· columns指定分片的表列名。
· algorithm指定分片函数与function对应。
· rang-long函数中的mapFile代表配置文件的路径。
· defaultNode为超过范围后的默认节点。
所有的节点配置都是从0开始的,0代表节点1,此配置非常简单,即预先设计好某个分片的id范围。
7、 范围求模算法
该算法为先进行范围分片,计算出分片组,组内再求模,综合了范围分片和求模分片的优点。分片组内使用求模可以保证组内的数据分布比较均匀,分片组之间采用范围分片可以兼顾范围分片的特点。事先规定好分片的数量,数据扩容时按分片组扩容,则原有分片组的数据不需要迁移。由于分片组内的数据分布比较均匀,所以分片组内可以避免热点数据问题。
<tableRule name="auto-sharding-rang-mod">
<rule>
<columns>id</columns>
<algorithm>rang-mod</algorithm>
</rule>
</tableRule>
<function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
<property name="mapFile">partition-range-mod.txt</property>
</function>
配置说明如下:
· columns指定分片的表列名。
· algorithm指定分片函数与function对应。
· mapFile指定分片的配置文件。
· 未包含以上规则的数据存储在defaultNode节点中,节点从0开始。
8 、固定分片hash算法
类似于十进制的求模运算,但是为二进制的操作,取 id 的二进制低 10 位,即 id 二进制&1111111111。
此算法的优点在于如果按照十进制取模运算,则在连续插入1~10时,1~10会被分到1~10个分片,增大了插入事务的控制难度。而此算法根据二进制则可能会分到连续的分片,降低了插入事务的控制难度。
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">8</property>
<property name="partitionLength">128</property>
</function>
配置说明如下:
· columns标识将要分片的表字段。
· algorithm为分片函数。
· partitionCount为分片个数列表。
· partitionLength为分片范围列表,分区长度默认最大为2n=1024,即最大支持1024个分区。
9 、取模范围算法
10、字符串hash求模范围算法
11、字符串hash解析算法
12、一致性hash算法
13、按日期(天)分片算法
14、按单月小时算法
15、自然月分片算法
16、日期范围hash算法
二、Mycat管理命令
Mycat提供类似数据库的管理监控方式,可以通过MySQL命令行登录管理端口(9066)执行相应的SQL语句进行管理,也可以通过JDBC方式进行远程连接管理,本节主要讲解命令行的操作。
目前Mycat有两个端口:8066数据端口和9066管理端口,登录方式类似于MySQL的服务端登录。
通过show@@help;可以查看所有命令:
1、Reload命令
1.1、reload@@config
该命令用于更新配置文件,例如更新schema.xml文件后在命令行窗口中输入该命令,不用重启即可进行配置文件更新,运行结果参考如下:
开启SQL监控分析功能:
reload @@sqlstat = open Open real-time sql stat analyzer
关闭SQL监控分析功能:
reload @@sqlstat = close Close real-time sql stat analyzer
设置慢SQL时间阈值:
reload @@sqlstat = Set Slow SQL Time(ms)
重置SQL监控分析的数据:
reload @@user_stat Reset show @@sql @@sql.sum @@sql.slow
2、Show命令
2.1、show@@database
该命令用于显示Mycat数据库列表,运行结果对应schema.xml配置文件的schema子节点。
2.2、show@@datanode
该命令用于显示 Mycat 数据节点列表,运行结果对应 schema.xml 配置文件的 dataNode节点。
· NAME表示dataNode的名称。
· DATAHOST表示对应的dataHost属性的值,即数据主机。
· ACTIVE表示活跃连接数,IDLE表示闲置连接数,SIZE对应总连接数量
运行如下命令,可查找对应的schema的dataNode列表:
2.3、show@@heartbeat
该命令用于报告心跳状态。
RS_CODE状态如下:
· OK_STATUS=1代表正常状态。
· ERROR_STATUS=-1代表连接出错。
· TIMEOUT_STATUS=-2代表连接超时。
· INIT_STATUS=0代表初始化状态。
若节点发生故障,则会连续进行默认的 5 个周期检测,心跳连续失败后就会变成-1,节点故障确认,然后可能发生切换,运行结果参考如下:
2.4、show@@version
该命令用于获取Mycat的版本
2.5、show@@connection
该命令用于获取Mycat的前端连接状态,即应用于Mycat的连接。
2.6、show@@backend
用于查看后端的连接状态
2.7、show@@cache
用于查看Mycat缓存。
· SQLRouteCache:SQL语句路由缓存。
· TableID2DataNodeCache:缓存表主键与分片的对应关系。
· ER_SQL2PARENTID:缓存ER分片中子表与父表的关系。
2.8、show@@datasource
查看数据源的状态,如果配置了主从或者多主,则可以切换。
2.9、show@@syslog limit
用于显示系统日志。
· 端口号:该命令工作在9066端口,用来在客户端命令窗口中显示系统的日志信息,通常用于远程查看Mycat Server的日志信息。
· 参数:limit=后接正整数,该数值用来限定每次显示的日志条数的最大数量。
2.10、reload@@user_stat
用于清除缓存。该命令工作在9066端口,用来将客户端执行show@@sql;show@@sql.sum;show@@slow.success;命令之后所缓存的信息清空。
2.11、SQL统计命令
· show@@sql:显示在Mycat中执行过的SQL语句。
· show@@sql.slow:显示慢SQL语句。
· show@@sql.sum:显示SQL语句的整体执行情况、读写比例等。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_44432032/article/details/121182572
内容来源于网络,如有侵权,请联系作者删除!