006、Mycat分库分表之枚举分片
本文最后更新于 417 天前,其中的信息可能已经过时,如有错误请发送邮件到 wuxianglongblog@163.com

Mycat 分库分表之枚举分片

一、枚举分片

  通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,这种方式就是枚举分片规则,本规则适用于按照省份,性别,状态拆分数据等业务

  

img

二、枚举分片案例

  枚举分片需求:现有 tb_enum 表,其中有 id, username, status 三个字段,其中 status 值为 1,2,3 当 status=1 时表示:未启用,status=2 时表示:已启用,status=3 时表示:已注销。现在我们就需要根据这三种状态进行分片。

  数据库需求:还是用之前文章中创建的 hl_logs 数据库

  表需求:在 hl_logs 中重新创建表为 tb_enum

  

img

三、配置 rule.xml

  

img

  说明 1:系统默认的枚举分片规则为:sharding-by-intfile

  说明 2:系统默认的枚举字段是:sharding_id (可以根据需要改成自己需要的枚举字段,但是不推荐,因为有可能多个表的枚举字段会有冲突,请看说明 4)

  说明 3:系统默认的枚举分片的算法:hsah-int

  说明 4:这里我将系统的枚举算法复制一份改了名字为 "my-sharding-by-intfile1",columns 改为我需要的枚举字段 status,这样做的原因是,因为如果一个数据库中可能还会有其他的表根据其他枚举字段分片,这样就冲突了,所以为了防止多个表的枚举分片规则冲突,最好的方式就是重新复制一个新的枚举规则,改一下规则的名称,然后再改一个枚举的字段,只要保证枚举算法:hash-int 不变就行了。

  

img

  说明 5:在 function 标签中的 mapFile 属性可以看出,枚举分片的配置通过 partition-hash-int.txt 文件配置

  

img

  说明 6:修改 partition-hash-int.txt 文件,其中 1 代表 status=1, 表示未启用的用户,写入到索引为 0 的第一个数据节点中

  说明 7:修改 partition-hash-int.txt 文件,其中 2 代表 status=2, 表示已启用的用户,写入到索引为 1 的第二个数据节点中

  说明 8:修改 partition-hash-int.txt 文件,其中 3 代表 status=3, 表示已注销的用户,写入到索引为 2 的第三个数据节点中

四、配置 schema.xml

  

img

  说明 1:枚举分片的逻辑库是 hl_logs

  说明 2:枚举分片的逻辑表是 tb_enum

  说明 3:dataNode 同样是 dn4,dn5,dn6

  说明 4:枚举分片的规则是自定义的枚举规则 rule="my-sharding-by-intfile1"

  

img

  说明 5:因为 tb_logs 和 tb_enum 是在同一个数据库中,所以 dataNode 配置一样,就可以共用

  

img

  说明 6:dbhost1 数据节点为 192,168.3.90

  说明 7:dbhost2 数据节点为 192.168.3.91

  说明 8:dbhost3 数据节点为 192.168.3.92

五、配置 server.xml

  

img

  说明 1:在之前的文章中已经将 tb_logs 表添加到 root 用户的权限中了,所以这里不需要更改即可。

六、枚举分片测试

  首先重启 Mycat

  

img

  登录 Mycat

  

img

  查看逻辑库和逻辑表

  

img

  这里的 tb_enum 只是逻辑库,而在 MySQL 中还并没有 tb_enum 这个表,需要在 Mycat 中创建

create table tb_enum(id bigint(20), username varchar(20), status int(2));

  

img

  插入一下数据进行分片测试

insert into tb_enum(id, username,status) values (1, "张三", 1);
insert into tb_enum(id, username,status) values (2, "李四", 2);
insert into tb_enum(id, username,status) values (3, "王五", 3);
insert into tb_enum(id, username,status) values (4, "赵六", 1);
insert into tb_enum(id, username,status) values (5, "侯七", 2);
insert into tb_enum(id, username,status) values (6, "孙八", 3);

  

img

  

img

  说明 1:数据节点 192.168.3.90 上存的全部是 status=1 的数据

  

img

  说明 2:数据节点 192.168.3.91 上存的全部是 status=2 的数据

  

img

  说明 3:数据节点 192.168.3.92 上存的全部是 status=3 的数据

  

img

  说明 4:在 Mycat 上进行查询的数据是,所有数据节点的全集。枚举分片是水平分库分表的一种方式。

谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇