Mycat进阶(3-2)

x33g5p2x  于2021-11-09 转载在 其他  
字(6.4k)|赞(0)|评价(0)|浏览(458)

一、分片规则

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语句的整体执行情况、读写比例等。

相关文章