MyCat - 分片 - 分片规则 - 枚举分片 | 学习笔记

简介: 快速学习 MyCat - 分片 - 分片规则 - 枚举分片

开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 分片 - 分片规则 - 枚举分片】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/756/detail/13267


MyCat - 分片 - 分片规则 - 枚举分片

内容介绍:

一、概念

二、演示

 

一、概念

枚举分片,指的是可以通过配置文件当中配置可能枚举的值。这个可能枚举的值指的是某一个字段可能枚举的值,指定数据分布到不同的数据节点上。枚举分片比较常用或者典型的应用场景是按照一些状态:性别、省份这些方面进行业务拆分。拆分的业务就可以使用枚举。

枚举分片规则的配置如下:

<tableRule name=“sharding-by-intfile”>

<rule>

<columns>status</columns>

<algorithm>hash-int</ algorithm>

</rule>

</tableRule>

枚举分片默认的名称做 sharding-by-intfile, 可以指定按照哪个字段进行枚举分片,也可以自己定义。比如按照状态是 status,然后分片算法叫 hash-int。class是枚举分片的处理的类。

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

以上配置了三个属性。第一个映射的文件 mapFile。在 mapFile 对应的文件当中,它所需要配置的是枚举值与分片节点的一个对应关系。type 表示的是该字段的类型。接下来还有一个是否有默认的 defaultNode 节点。

partition-hash-int.txt 内容如下:

1=0

2=1

3=2

partition-hash-int.txt 映射文件当中配置的格式是一个 key 和 value。注意 key 的123 可能就是上面 status 的枚举值。对应的节点相当于是 0、1、2,分别对应了三个节点。即如果 status 值为 1,会坐落在第一个节点上。如果 status 值为 2,将坐落在第二个节点。如果 status 值为 3,将坐落在第三个节点。

 

二、演示

首先需要定义逻辑表,拷贝<table name=”tb_log”dataNode=”dn1,dn2,dn3” rule=”auto-sharding-long”/>

<tablename=”tb_user”dataNode=”dn1,dn2,dn3” rule=”auto-sharding-long”/>

接着关注分片规则 rule.xml 。可以直接把下面的分片规则放置在 rule 中。

<tableRule name=“sharding-by-intfile”>

<rule>

<columns>status</columns>

<algorithm>hash-int</ algorithm>

</tableRule>

当然更改 sharrding_id 也可以,但是假如在业务系统当中有另一张表,它的分片规则想要按照枚举分片的规则进行,但是分片的字段名不一样。所以同一个分片规则是可以定义多个的。

再次定义 TableRule, 重新命名为 “sharding-by-enum-status”,修改为<columns>status</columns>

<algorithm>hash-int</ algorithm>

hash-int 所关联的就是分片函数 hash-int:

<function name=”hash-int”

class=”io.mycat.route.function. PartitionByFileMap”>

<property name =”mapFile‘’>partition-hash-int.txt</property

当然 function 也允许定义多个。

分片规则已经定义出来,接下来需要在 scheme.xml 中的逻辑表来引用分片规则,然后还需要去修改 partition-hash-int.txt 文件。

举例如下:用户表里面有 id、username、status。status 的取值只可能为三个值:1 是未启用,2 代表已启用,3 代表已关闭。即 status 的取值为 123,那么它的枚举也是三个:1=0、2=1、3=2。当 status 值是 1 时,它坐落在第一个节点上;status 值为 2 的时候,它坐落在第二个节点上;status 值为 3 时,将会坐落在第三个节点上。后面从 0 开始的数,是分片节点的索引值。

以上操作下已经配置完毕。那么一旦文件变化,就需要重启 mycat。mycat 启动完成之后,重新输入密码 123456,接下来在 mysql 后分别输入 show databases 和 PARTITION_DB 切换数据库。发现里面有两张逻辑表,一个是 tb_log,一个是tb_user。tb_user 的表结构还没有定义,接下来需要创建有 tb_user 的表结构。执行以下代码:

CREATE TABLE “tb_user”(

id bigint(20)  NOT NULL COMMENT ‘ID’,

username varchar(200) DEFAULT NULL COMMENT‘姓名’,

status int (2) DEFAULT ‘1‘COMMENT’1:未启用,2:已启用,3:已关闭,

PRIMARY KEY (’id‘)

)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

user 的表结构已经创建出来,接下来再往 user 中插入数据。注意 status 的取值在123 之间。

再插入以下代码:

insert into tb_log(id,operateuser,operation)values(1,‘Tom’,1);insert into tb_log(id,operateuser,operation)values(2,‘Cat’,2);insert into tb_log(id,operateuser,operation)values(3,‘Rose’,3);insert into tb_log(id,operateuser,operation)values(4,‘Coco’,2);insert into tb_log(id,operateuser,operation)values(5,‘Lily’,1);

再次浏览可以看到 1、2、3、4、5 节点的数据已经插入。接着关注 1、2、3、4、5 数据到坐落在哪一个节点,是否是 status 为 1,就在第一个节点上呢,如果status为2,就在第二个节点上的结果。

在 mysql 后输入 select*from tb_user,可以看到 status 为 1。接下来再到第二个节点当中看 status 为 2,到第三个节点中来看 status 为 3,

是按照指定的规则 status 的枚举值进行分片。

那么假如进行数据插入时,插入了一个值 4,4 没有在配置文件当中配置,会出现报错的现象,不能找到有效的一个数据节点。

image.png

如果不想出现报错的情况,可以配置  defaultNode,

<property name=”defaultNode”>0</property>

它是默认的节点,配置 defaultNode 属性就可以避免报错的发生。

相关文章
|
JSON 数据格式
layui富文本编辑器文档layedit组件的调用和图片上传接口的使用
layui富文本编辑器文档layedit组件的调用和图片上传接口的使用
829 0
|
存储 Java 关系型数据库
高效连接之道:Java连接池原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。频繁创建和关闭连接会消耗大量资源,导致性能瓶颈。为此,Java连接池技术通过复用连接,实现高效、稳定的数据库连接管理。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接池的基本操作、配置和使用方法,以及在电商应用中的具体应用示例。
328 5
|
网络安全 PHP
cURL error 60: SSL certificate problem: self signed certificate in certificate
一、问题 cURL error 60: SSL certificate problem: self signed certificate in certificate chain - 服务器http302 出现这个一般是自签名证书的问题
3801 0
|
人工智能 算法 数据挖掘
StoryTeller:字节、上海交大、北大共同推出的全自动长视频描述生成一致系统
StoryTeller是由字节跳动、上海交通大学和北京大学共同推出的全自动长视频描述生成系统。该系统通过音频视觉角色识别技术,结合低级视觉概念和高级剧情信息,生成详细且连贯的视频描述。StoryTeller在MovieQA任务中展现出比现有模型更高的准确率,适用于电影制作、视频内容分析、辅助视障人士等多个应用场景。
598 0
StoryTeller:字节、上海交大、北大共同推出的全自动长视频描述生成一致系统
|
6月前
|
敏捷开发 人工智能 双11
240小时,中国东航从“出海”到“入海”,连接世界的精彩
在全球化3.0时代,中国“单方面免签”、“240小时过境免签”等政策正为航空业注入新动能。作为国家战略的重要航空实施主体,中国东方航空集团有限公司(以下简称东航)深度融入“一带一路”建设,持续将政策优势转化为航线网络优势,切实推动“让世界看中国”的国家战略落地实施,加速中国企业全球化布局进程。 近日,在阿里云主办的「2025中企出海大会」主论坛上,中国东方航空股份有限公司市场营销部副总经理徐喆发表题为《中国东航:连接世界的精彩》的主题演讲,与业界共话政策开放下航空业的出海实践,探索AI时代民航全球化发展的新路径。
337 3
|
消息中间件 Linux Docker
RabbitMQ: /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only
RabbitMQ: /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only
RabbitMQ: /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only
|
9月前
|
存储 Java 文件存储
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
2057 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
消息中间件 存储 缓存
Python之RabbitMQ操作
Python之RabbitMQ操作
|
存储 JavaScript 前端开发
webSocket+Node+Js实现在线聊天(包含所有代码)
文章介绍了如何使用WebSocket、Node.js和JavaScript实现在线聊天功能,包括完整的前端和后端代码示例。
785 0
|
12月前
|
XML JSON 算法
【JavaEE】——自定义协议方案、UDP协议
自定义协议,序列化,xml方案,json方案,protobuffer方案,UDP协议,校验和,比特翻转,CRC算法,md5算法