分库分表篇-2.2 Mycat-分片规则

news2024/9/24 17:18:16

文章目录

  • 前言
  • 一、Mycat table的分片:
  • 二、常用分片规则:
    • 2.1 id 范围分片:
    • 2.2 id 取模分片:
    • 2.3 按照枚举值 分片:
    • 2.4 一致性hash hash 环:
    • 2.5 ER 分片:
    • 2.6 库内分表:
    • 2.7 全局表:
    • 2.8 分片表和非分片表混合使用:
  • 三、连续和离散分片对比:
    • 3.1 连续分片:
    • 3.2 离散分片:
  • 四、分片键值策略参考:
  • 总结


前言

对Mycat 的数据节点进行配置后,想要将数据路由到不同的库,不同的表,需要对tale 配置自己的分片规则。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Mycat table的分片:

Mycat是一款开源的分布式数据库中间件,支持分库分表,读写分离,高可用等功能。在Mycat中进行数据分片的基本路径是在schema.xml中定义数据节点,然后在rule.xml中定义分片规则,最后在schema.xml中的table标签中应用分片规则。

二、常用分片规则:

2.1 id 范围分片:

实现:id 在哪个区间,然后将改条数据路由到具体的库的表;
注意:超出定义的范围则报错:

使用规则为:

<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.tx 配置id的范围:
在这里插入图片描述
说明: 0-10000 数据被路由到第一个节点;10001-20000 数据被路由到第二个节点;20001-30000 数据被路由到第三个节点;

2.2 id 取模分片:

实现: id%节点数量 然后 从0,到节点数量-1 进行数据分布;

使用规则为:

<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>  -->
	<property name="count">2</property>
</function>

注意节点的数量要进行定义,如果配置的 节点的数量和定义的不一致则启动报错;

2.3 按照枚举值 分片:

实现:按照枚举的值进行分片:
使用规则:
schema.xml

<!--枚举 -->
<table name="meiju"  primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="sharding-by-intfile"  />

在rule.xml:

<tableRule name="sharding-by-intfile">
	<rule>
	<!-- 
		<columns>sharding_id</columns>
	-->
                     <!--对应枚举的列 -->
		<columns>name</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>

partition-hash-int.txt 配置枚举的值:

10010=0
10011=1

说明:当name为10010时路由到第一个数据节点,当name为10011 时路由的第二个节点;

2.4 一致性hash hash 环:

实现:当key 的hash 码在hash 环中离哪个数据节点近就 路由到哪个节点:
1) 说明:
MyCat是一个开源的分布式数据库中间件,它允许将多个数据库实例组合成一个逻辑数据库集群,提供了数据分片、读写分离、故障容错等功能。在MyCat中,一致性哈希算法用于实现数据的分片和负载均衡。
一致性哈希算法是一种将数据均匀分布到不同节点的算法,同时保持了节点的动态扩展和收缩的能力。在MyCat中,使用一致性哈希算法来确定数据应该被路由到哪个节点。
具体实现上,MyCat中使用了一致性哈希环来表示节点,每个节点在环上都有一个唯一的标识。当有数据需要路由到指定节点时,MyCat会通过计算数据的哈希值,并将哈希值映射到离它最近的一个节点上。
当节点加入或移除时,只需要重新计算受影响的数据的哈希值,并将其映射到新的节点上,而不会对整个数据集进行重新分片。这使得节点的扩展和收缩变得简单高效。
总结来说,MyCat使用一致性哈希算法来实现数据的分片和负载均衡;

2)使用:

<!--枚举 -->
<table name="murmur"  primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="sharding-by-murmur"  />

在rule.xml:

<tableRule name="sharding-by-murmur">
	<rule>
		<columns>id</columns>
		<algorithm>murmur</algorithm>
	</rule>
</tableRule>

<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>

说明:

  • seed : seed 参数在 MyCAT 中的作用是控制一致性哈希算法 Murmur 的哈希值生成过程;
  • count: 数据节点;
  • virtualBucketTimes :每个节点 虚拟的 虚拟节点,当数据落入到虚拟节点,则可以路由到某个数据节点;

2.5 ER 分片:

实现:有父子级关联的数据可以被路由到同一个数据节点中;

在 MyCAT 中,ER(Entity-Relation)分片是一种根据实体关系进行数据分片的方式。它将相关的表按照它们之间的关联关系进行分片,使得相关数据存储在同一分片节点上,以提高查询效率。主表和子表的关系,如果按照普通的范围或者取模分片则可能造成主表的数据和子表的数据出现在不同的节点上,从而出现夸库的情况;

<table name="customer" primaryKey="id" dataNode="dn1,dn2" rule="smod-long">
	<childTable name="customer_addr" primaryKey="id" joinKey="customer_id" parentKey="id"> </childTable>
</table>

在 MyCAT 中,childTable(子表)的joinKey和parentKey是用来关联子表和主表的列。
joinKey指定了子表和主表之间关联的列,在查询时会根据这个列进行连接操作。它通常是子表中用来与主表的关联列进行匹配的列。这个列将被用于在JOIN查询中确定子表中的哪些行与主表中的行关联。
parentKey指定了主表与子表之间关联的列,在查询时也会根据这个列进行连接操作。这个列通常是子表所属主表的关联列。
例如,以下是一个示例,展示了如何在 MyCAT 中配置子表的joinKey和parentKey:

  <!-- 定义子表 -->
   <childTable name="child_table" parentColumn="parent_id" parentTables="parent_table" joinKey="child_id" parentKey="id" />

在上述示例中,joinKey属性被设置为"child_id",这意味着在查询时,MyCAT将使用子表中的"child_id"列与主表的"id"列进行连接。
而parentKey属性被设置为"id",表示主表与子表之间的关联是通过主表的"id"列与子表的"parent_id"列进行匹配。
请注意,joinKey和parentKey应该是具有相同类型的列,以允许它们进行连接操作。在配置MyCAT的时候,您可以根据实际的数据模型和业务需求来设置joinKey和parentKey,以确保正确的关联和连接操作。

2.6 库内分表:

实现:同一个数据中,按照时间进行月度分表;
使用规则为:

<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">2015-01-01</property>
</function>

在使用按照月份分表时。需要注意一下几点:

  • 规则中,指定日期格式和开始时间:
  • 需要去手动创建不带年月的物理表:

2.7 全局表:

实现: 执行的sql 被发送到定义的所有数据节点中;
使用规则:type是global 不需要设置rule ;

<table name="student1"  primaryKey="id"  dataNode="dn2" autoIncrement="true" type="global "/>

注意:查询全局表时,会随机访问一个节点获取数据

2.8 分片表和非分片表混合使用:

实现: 数据库中,表中既有需要分片的又有不需要分片的;

  • 对分片的表进行分片规则的设置;
  • 对所有非分片的表,单独设置自己单独的数据节点;
<table name="student1"  primaryKey="id"  dataNode="dn2" autoIncrement="true" />

三、连续和离散分片对比:

3.1 连续分片:

优点:

  • 范围条件查询消耗资源少 (不需要汇总数据)
  • 扩容无需迁移数据 (分片固定)

缺点:

  • 存在数据热点的可能性
  • 并发访问能力受限于单一或少量DataNode (访问集中)

3.2 离散分片:

优点:

  • 并发访问能力增强 (负载到不同的节点)
  • 范围条件查询性能提升 (并行计算)

缺点:

  • 数据扩容比较困难,涉及到数据迁移问题
  • 数据库连接消耗比较多

四、分片键值策略参考:

选取分片键应当遵循以下几个原则:

  • 分片键应该是经常用于Where、Join操作的字段,以确保查询尽量在单个分片内执行。

  • 分片键的取值范围应当均匀,以确保数据可以平均分布到各个分片上,避免数据倾斜导致的某些分片压力过大。

  • 不要选择可能会更新的字段作为分片键。一旦分片键需要更新,那么可能会引起数据迁移,带来非常大的开销。

  • 尽量选择稳定、不易变化的字段作为分片键。如自增ID、日期等。

  • 如果有多个候选的分片键,可以考虑使用联合分片键。在查询条件中,只要包含了联合分片键中的任何一个字段,都可以定位到具体的分片。

如何选择分片键并没有定论,需要根据业务场景和数据特点进行综合考虑。如果选择不当,可能会导致数据分布不均、查询性能低下、扩展性差等问题,因此选择分片键是一个非常重要的环节。


总结

本文对mycat 的常用分片规则做了介绍,在使用时需要按照实际的业务配置不同的规则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/958300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

七天内连续登陆天数

一、需求描述 业务理解1&#xff1a;七天内最大连续登陆天数 业务理解2&#xff1a;七天内最近连续登陆天数&#xff08;最近一天如果未登陆则连续登陆天数为0&#xff09; 示例说明&#xff1a; 二、数据结构 流量表 tracking 字段名字段中文名userid用户iddt分区 口径描…

如果你觉得自己很失败,请观看此内容 视频学习

目录 什么是成功&#xff1f;​​​​​​​ How can we succeed in such an unfair world? 我们如何在这个不公平的地球上获得成功&#xff1f; 如何去找到自己的不公平优势呢&#xff1f; 最开始也有常有人跟她说你做视频是赚不到钱的 你做了&#xff0c;并不代表你做…

河道漂浮物检测:安防监控/视频智能分析/AI算法智能分析技术如何助力河道整治工作?

随着社会的发展和人们生活水平的进步&#xff0c;水污染问题也越来越严重&#xff0c;水资源监管和治理成为城市发展的一大困扰&#xff0c;水面上的漂浮垃圾不仅会影响河道生态安全并阻碍船舶航行&#xff0c;还会影响人们的身体健康。 TSINGSEEE青犀AI智能分析平台在环保场景…

当连锁零售超市遇上温湿度监控,简直是王炸!

在食品行业中&#xff0c;温湿度监控是确保食品质量和安全性的至关重要的环节之一。温度和湿度是影响食品保存期限、品质、口感以及微生物滋生的关键因素。通过有效的监测和管理&#xff0c;可以降低食品受损和变质的风险&#xff0c;保障消费者的健康和权益。 客户案例 福建某…

设计模式之建造者模式与原型模式

目录 建造者模式 简介 使用场景 优缺点 模式结构 实现 原型模式 简介 应用场景 优缺点 模式结构 实现 建造者模式 简介 将复杂对象的构建与表示进行分离&#xff0c;使得同样的构建过程可以创建不同的表示。是一个将复杂的对象分解为多个简单的对象&#xff0c;然…

Elasticsearch分布式搜索结果处理

1.排序 elasticsearch默认是根据相关度算分&#xff08;_score&#xff09;来排序&#xff0c;但是也支持自定义方式对搜索结果排序。可以排序字段类型有&#xff1a;keyword类型、数值类型、地理坐标类型、日期类型等。 1.1.普通字段排序 keyword、数值、日期类型排序的语法…

四季同行·雷锋家乡学雷锋“青柚课堂“讲师培训

为了给益阳市“青柚课堂”性教育志愿者讲师团队增加新鲜血液&#xff0c;8月27日&#xff0c;我机构在益阳市红十字救护培训基地开展了湖南省第二期"四季同行雷锋家乡学雷锋"孵化项目"青柚课堂"乡村女童性教育推广计划2023年师资培训。本次活动由我机构“蚂…

虹科方案 | 车辆零部件温度采集解决方案

虹科提供的车辆零部件温度监控与采集解决方案&#xff0c;通过热电偶模块来采集、监控、处理温度数据&#xff0c;可以通过CAN / CAN FD进行传输&#xff0c;确保车辆系统的正常运行和安全性。 文章目录 一、热电偶在汽车领域的应用什么是热电偶模块&#xff1f;热电偶模块如何…

PSP - 蛋白质结构预测 OpenFold Multimer 训练模型的数据加载

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132597659 OpenFold Multimer 是基于深度学习的方法&#xff0c;预测蛋白质的多聚体结构和相互作用。利用大规模的蛋白质序列和结构数据&#xff…

Unity 顶点vertices,uv,与图片贴图,与mesh

mesh就是组成3d物体的三角形们。 mesh由顶点组成的三角形组成&#xff0c;三角形的大小 并不 需要一样&#xff0c;由顶点之间的位置决定。 mesh可以是一个或者多个面。 贴图的原点在左下角&#xff0c;uv是贴图的坐标&#xff0c;数量和顶点数一样&#xff08;不是100%确定…

Unity MonoBehaviour事件函数的生命周期

Unity运行时候的默认的几个函数的执行顺序&#xff1a; 首先是Awake&#xff0c;OnEnable&#xff0c;Start等&#xff0c;后面是FixUpdate Update 最后是OnDisable、OnDestroy

《CTFshow-Web入门》09. Web 81~90

Web 入门 索引web81题解 web82题解原理 web83题解 web84题解 web85题解 web86题解 web87题解原理 web88题解 web89题解 web90题解 ctf - web入门 索引 web81&#xff1a;include() 利用&#xff0c;一句话木马之 Nginx 日志利用。web82~86&#xff1a;include() 利用&#xff…

pyqt5的 Qprogressbar 如何设计得好看一些?

参考官网内容 style 自定义&#xff1a; https://doc.qt.io/qtforpython-5/overviews/stylesheet-examples.html#customizing-qprogressbar 1.圆角&#xff0c;浅蓝色 QProgressBar {border: 2px solid grey;border-radius: 5px; }QProgressBar::chunk {background-color: #0…

Halo2、Caulk+、Baloo、Cq Lookup argument细览

1. 引言 本文主要参考2023年2月以太坊基金会Mary Maller在第13届 BIU Winter School on Cryptography上的视频分享 A Close Look at a Lookup Argument - Mary Maller。 以证明 0 ≤ x < 4 0\leq x <4 0≤x<4为例&#xff0c;相比于使用算术化电路中如何使用定制gat…

免费s5爬虫ip:真正靠谱还是泡沫?

在网络世界中&#xff0c;许多人寻找免费的s5爬虫ip以实现匿名上网和绕过地域限制。然而&#xff0c;关于这些免费服务的可信度一直存在争议。本文将探讨免费s5爬虫ip背后的真相&#xff0c;并帮助您判断它们到底是值得依赖还是只不过虚幻泡沫。 1、充斥着风险 大部分提供免费…

不平衡的数据集将如何影响模型的性能?示例说明

一、说明 朋友们&#xff0c;您可能听说过&#xff0c;在不平衡数据集上训练的模型可能会受到泛化不佳和少数类检测减少的影响。在接下来的几篇文章中&#xff0c;我将给你一个例子来展示不平衡的数据集如何影响模型的性能&#xff0c;以及我们如何处理这个问题。在这篇文章中&…

【pdf密码】忘记了密码该如何编辑PDF文件?

PDF文件设置了密码&#xff0c;无法编辑PDF文件&#xff0c;如果忘记了PDF密码&#xff0c;无法取消限制编辑&#xff0c;那么这种情况&#xff0c;我们该如何解决&#xff1f;分享两个方法。 方法一&#xff1a; 将PDF文件转换为其他格式&#xff0c;这里&#xff0c;我们可…

Navicat:解决导入csv文件中文乱码的问题

文章目录 1 问题描述2 解决方案 1 问题描述 导入时编码格式默认选择UTF-8 后面发现源字段中文显示乱码 2 解决方案 用记事本txt格式打开csv文件&#xff0c;查看右下角编码格式是否为UTF-8 一般通过xls另存的csv&#xff0c;编码格式为ANSI&#xff0c;需要转换为UTF-8 转…

解决小程序中textarea ios端样式不兼容的方法

问题描述 &#xff0c;今天在调试小程序的时候有个需求需要textarea与标题对其&#xff0c;微信开发工具和安卓系统都没有问题 但是ios系统textarea存在内边距。出现不兼容的情况 解决方法&#xff1a;我们看官网的textarea的属性 textarea | uni-app官网 disable-default-p…

插座上亚马逊美国站UL1449测试报告标准

美规插座有UL498&#xff1b;UL1363&#xff1b;UL1449等标准。不同结构&#xff1b;不同形式使用的标准不同。UL498插座部分主要是对结构和常规性测试的要求&#xff1b;此类插座称为Receptacle&#xff1b;UL1363主要是对室内用的延长线插座的要求&#xff1b;此类插座常简写…