第108讲:Mycat实践指南:枚举分片下的水平分表详解

news2024/12/25 9:19:07

文章目录

    • 1.枚举分片的概念
    • 2.水平分表枚举分片案例
      • 2.1.准备测试的表结构
      • 2.2.配置Mycat实现枚举分片的水平分表
        • 2.2.1.配置Schema配置文件
        • 2.2.2.配置Rule分片规则配置文件
        • 2.2.3.配置Server配置文件
        • 2.2.4.重启Mycat
      • 2.3.写入数据观察水平分表效果

1.枚举分片的概念

枚举分片是根据表中的某个字段,配置可能出现的枚举值,被选中进行枚举分片的字段,该字段的值必须是可以当做分类的字段值,如果该字段的值在表中是不重复的,那么绝对不能作为枚举分片的字段,比如字段值是类型、状态、省份等等可以作为类别使用的字段,这种字段就适合作为枚举分片依据的字段。

枚举分片举例:

表中有个字段是专门存储省份的,我们要按照省份对表中的数据进行拆分,此时就需要使用到Mycat的枚举分片进行水平分表,省份全中国也才32个,我们就可以这样做:bj=0 sh=1,意思就是说如果省份字段的值为bj,那么就划分到第一个分片节点上,如果字段值为sh,就划分到第二个分片节点上。

2.水平分表枚举分片案例

需求:有一张用户信息表,该表的数据量庞大,在表中有字段记录了用户所在的省份,我们希望按照身份对这张表进行拆分,例如北京的用户写入到分片1节点的双主双从集群,上海的用户写入到分片2节点的双主双从集群。

下面我们通过枚举分片来实现这个需求。

2.1.准备测试的表结构

配置水平分表前,需要将要分的表在所有的分片节点中创建出来,

如果我们先配置了Mycat分片,就可以直接通过Mycat进行创建,无需登录到各个分片节点的集群里创建表了,会自动在分片节点中创建,但是目前我们还没有配置Mycat,所以我们直接登录到各个分片节点创建表。

这次我们直接在Mycat中创建这些表。

分片依旧是2个,还是之前垂直分库分表时使用的两套双主双从集群。

#在分片1节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11 -e "use db_2; create table table_mjfp (id int,name varchar(10),province varchar(10));"

#在分片2节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11 -e "use db_2; create table table_mjfp (id int,name varchar(10),province varchar(10));"

image-20220714165957282

2.2.配置Mycat实现枚举分片的水平分表

2.2.1.配置Schema配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">
         <!--定义逻辑库 库名叫做db_shopping 该逻辑库关联dn1这个数据节点-->
        <schema name="db_2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
            <!--枚举分片-->
            <table name="table_mjfp" dataNode="dn1,dn2" rule="sharding-by-intfile-mjfp"/>
        
        </schema>  

        <!--定义数据节点 也就是分片 一个分片会关联一个数据主机组 然后对应真实的数据库名称-->
        <dataNode name="dn1" dataHost="mysqlcluster-1" database= "db_2" />          
        <dataNode name="dn2" dataHost="mysqlcluster-2" database= "db_2" />          

        <!--定义数据主机 在这个标签下定义具体的读写操作路由的数据库实例地址 schema、table划分如何指定的是该数据主机关联的数据节点 那么对应的库、表都会被存储在数据主机定义的数据库实例中-->
        <dataHost name="mysqlcluster-1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">    
                <heartbeat>select user()</heartbeat>  
                <!--定义写操作路由的数据库实例-->
                <writeHost host="c1-1-master3306" url="192.168.20.11:3306" user="root" password="123456">
                        <!--定义读操作路由的数据库实例-->
                        <readHost host="c1-1-slave3308" url="192.168.20.11:3308" user="root" password="123456" />
                </writeHost> 
                <!--备用的主库 也是提供写操作的数据库,当主库c1-1-master3306故障后 备用库开始提供写操作-->
                <writeHost host="c1-2-master3306" url="192.168.20.12:3306" user="root" password="123456">
                        <!--备用主库的从库 从始至终 只要备用主库不故障 会一直提供读服务-->
                        <readHost host="c1-2-slave3308" url="192.168.20.12:3308" user="root" password="123456" />
                </writeHost> 
        </dataHost>  

        <dataHost name="mysqlcluster-2" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">    
                <heartbeat>select user()</heartbeat>  
                <writeHost host="c2-1-master3307" url="192.168.20.11:3307" user="root" password="123456">
                        <readHost host="c2-1-slave3309" url="192.168.20.11:3309" user="root" password="123456" />
                </writeHost> 
                <!--备用主库db3 主库db1故障后 开始提供写操作-->
                <writeHost host="c2-2-master3307" url="192.168.20.12:3307" user="root" password="123456">
                        <!--备用主库的从库 从始至终 只要备用主库不故障 会一直提供读服务-->
                        <readHost host="c2-2-slave3309" url="192.168.20.12:3309" user="root" password="123456" />
                </writeHost> 
        </dataHost>  

</mycat:schema>
2.2.2.配置Rule分片规则配置文件

在Rule分片规则配置文件中,默认情况下一种类型分片只有一组分片规则,如果一个库中有多张表都需要枚举分片,势必要声明多个规则,不同的表引用不同的规则,接下来我们自定义一个分片规则。

[root@mysql-1 ~]# vim /data/mycat/conf/rule.xml 
	<!--定义分片规则-->
    <tableRule name="sharding-by-intfile-mjfp">
        <rule>
            <!--进行枚举分片的字段-->
            <columns>province</columns>
            <!--进行枚举分片的函数-->>
            <algorithm>hash-int-mjfp</algorithm>
        </rule>
    </tableRule>



    <!--枚举分片所对应的函数名称和调用类  这个函数名称要和tableRule中的algorithm字段对应上-->
    <function name="hash-int-mjfp"
        class="io.mycat.route.function.PartitionByFileMap">
        <!--默认分片节点 当枚举字段的值不满足我们声明(值对应的关联分片节点时) 就将该条数据写入到默认的分片节点中 如果没有分片节点 当写入数据的枚举值字段值不满足分片对应关系时 数据将无法写入-->
        <property name="defaultNode">0</property>
        <!--枚举字段值的类型 0为Integer 1为String  如果我们的枚举字段值的类型是字符串需要声明type为1 如果字段值为数字则声明type为0 否则写入数据时会报错-->
        <property name="type">1</property>        
        <!--将可能出现的枚举字段值与分片节点ID进行绑定 并且这些参数传入到函数中 实现枚举分片-->
        <property name="mapFile">partition-hash-int.txt</property>
    </function>

枚举分片使用时,需要先定义一个配置文件,在配置文件中声明枚举字段的值对应的分片节点ID,需要实现规划好枚举字段值的所有可能出现的值,避免有漏掉的字段值,没有在配置文件中定义,导致无法写入数据,当然如果在枚举函数中配置了defaultNode参数,可以避免此问题,当这条数据中的枚举字段值没有在配置文件中指定对应的节点ID,这条数据就被写入到默认的分片节点中。

[root@mysql-1 conf]# vim partition-hash-int.txt
bj=0
sh=1

含义:当枚举字段的值为bj时,该数据写入到分片ID为0的的分片节点,当值为sh时,写入到分片ID为1的分片节点。

2.2.3.配置Server配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/server.xml
    <user name="root" defaultAccount="true">
        <!--登录用户的密码-->
        <property name="password">123456</property>
        <!--该用户登录后可以显示那些Schema-->
        <property name="schemas">db_2</property>
    </user>
2.2.4.重启Mycat
[root@mysql-1 ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

2.3.写入数据观察水平分表效果

1)写入人员位于北京的数据

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into table_mjfp (id,name,province) values (1,'xm','bj');
mysql> insert into table_mjfp (id,name,province) values (2,'hah','bj');
mysql> insert into table_mjfp (id,name,province) values (3,'xixi','bj');

人员的地址为北京(province=bj),枚举字段值为bj,此时会被My成他划分到分片1的节点中存储这些数据。

image-20220715112635776

2)写入人员位于上海的数据

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into table_mjfp (id,name,province) values (4,'aaa','sh');
mysql> insert into table_mjfp (id,name,province) values (5,'eee','sh');

人员的地址为北京(province=sh),枚举字段值为sh,此时会被Mycat划分到分片2的节点中存储这些数据。

image-20220715112750462

3)写入人员位于天津的数据

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into table_mjfp (id,name,province) values (6,'qqqq','tj');

前面写入的几条数据的枚举字段值都在枚举函数的配置文件中声明了,本次我们写入的(province=tj)tj并没有在配置文件中声明,由于我们配置了当枚举字段值都不满足配置文件中定义的,就写入到默认的分片1节点中,此时这条数据将被写入到分片1节点中。

image-20220715113017009

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

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

相关文章

物联网智慧大屏

随着物联网技术的飞速发展&#xff0c;物联网智慧大屏已经成为企业数字化转型的关键组件。那么&#xff0c;什么是物联网智慧大屏&#xff1f;它为企业带来了哪些价值&#xff1f;让我们一起来探索。 一、什么是物联网智慧大屏&#xff1f; 物联网智慧大屏&#xff0c;作为物联…

css flex 布局换行

默认使用display: flex;是不换行的&#xff0c;只需要加上flex-wrap: wrap;就行了&#xff0c;效果图 .app-center {display: flex;flex-wrap: wrap;justify-content:flex-start; } 通过上面我们发现虽然时间换行了&#xff0c;但是每行的边距不一样 加上这个就行了&#xff…

国创证券今日投资参考:金价持续走高 半导体迎新一轮上升周期

上周五&#xff0c;两市股指早盘止跌回升&#xff0c;午后强势上扬&#xff0c;深成指、创业板指、科创50指数盘中均涨超1%&#xff1b;截至收盘&#xff0c;沪指涨0.62%报3046.02点&#xff0c;深成指涨1.1%报9369.05点&#xff0c;创业板指涨0.97%报1807.29点&#xff0c;科创…

【牛客】VL68 同步FIFO

描述 请设计带有空满信号的同步FIFO&#xff0c;FIFO的深度和宽度可配置。双口RAM的参考代码和接口信号已给出&#xff0c;请在答案中添加并例化此部分代码。 电路的接口如下图所示。端口说明如下表。 接口电路图如下&#xff1a; 双口RAM端口说明&#xff1a; 端口名I/O描述…

使用IDEA远程Debug调试

文章目录 背景配置IDEA设置启动脚本改造 细节细节1&#xff1a;停在本地断点&#xff0c;关闭程序后会继续执行吗?细节2&#xff1a;jar包代码和本地不一致会怎么样&#xff1f;细节3&#xff1a;日志打印在哪里&#xff1f;细节4&#xff1a;调试时其他人会不会卡住&#xff…

【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别

文章目录 0. 前言1. 级联神经网络介绍2. MTCNN介绍2.1 MTCNN提出背景2.2 MTCNN结构 3. MTCNN PyTorch实战3.1 facenet_pytorch库中的MTCNN3.2 识别图像数据3.3 人脸识别3.4 关键点定位 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff…

Android将自己写的maven库上传至jitpack(2024靠谱版)

浏览了一堆陈年旧贴&#xff0c;终于实验成功了 第一步 将自建空项目同步至github并保证能正常运行第二步新增一个library类型的modul第三步 在新建的library里面写一些测试用的代码第四步在library的gradle文件增加插件和发布脚本第五步新建一个配置文件第六步 把所有更改push…

3D模型+BI分析,打造全新的交互式3D可视化大屏开发方案

背景介绍 在数字经济建设和数字化转型的浪潮中&#xff0c;数据可视化大屏已成为各行各业的必备工具。然而&#xff0c;传统的数据大屏往往以图表和指标为主&#xff0c;无法真实地反映复杂的物理世界和数据关系。为了解决这个问题&#xff0c;3D模型可视化和数字孪生技术应运…

OSI(Open Systems Interconnection)模型和TCP/IP模型

OSI模型 OSI模型是一个概念模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层&#xff0c;每一层都有其特定的功能&#xff0c;从下至上依次是&#xff1a; 物理层&#x…

专题二 -滑动窗口 - leetcode 209. 长度最小的子数组 | 中等难度

leetcode 209. 长度最小的子数组 leetcode 209. 长度最小的子数组 | 中等难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 209. 长度最小的子数组 | 中等难度 1. 题目详情 给定一个含有 n 个正整数…

WIN11环境下Git配置SSH Key拉取Gitee仓库代码

Gitee官方配置参考网址&#xff1a; https://help.gitee.com/base/account/SSH%E5%85%AC%E9%92%A5%E8%AE%BE%E7%BD%AE。https://help.gitee.com/base/account/SSH%E5%85%AC%E9%92%A5%E8%AE%BE%E7%BD%AE。 A.生成 SSH 公钥 Windows 用户建议使用 Windows PowerShell 或者 Git…

C#,数值计算,用割线法(Secant Method)求方程根的算法与源代码

1 割线法 割线法用于求方程 f(x) 0 的根。它是从根的两个不同估计 x1 和 x2 开始的。这是一个迭代过程&#xff0c;包括对根的线性插值。如果两个中间值之间的差值小于收敛因子&#xff0c;则迭代停止。 亦称弦截法&#xff0c;又称线性插值法.一种迭代法.指用割线近似曲线求…

【linux】02 :Linux基础命令

1.掌握linux系统的目录结构 linux只有一个顶级目录&#xff0c;称之为&#xff1a;根目录。 windows系统有多个顶级目录&#xff0c;即各个盘符。 2.linux路径的描述方式 /在Linux中的表示&#xff1a;出现在开头表示根目录&#xff0c;出现在后面表示层级关系。 3.什么是命…

官网在线客服系统源码 完全开源可二开 带完整的安装代码包以及搭建教程

在互联网时代&#xff0c;用户对于线上服务的便捷性和高效性要求越来越高。官网在线客服系统作为企业与用户之间实时沟通的工具&#xff0c;不仅能够提高用户满意度&#xff0c;还能够有效促进业务转化。然而&#xff0c;市面上的在线客服系统大多价格昂贵且功能单一&#xff0…

提高Python代码效率:*args与**kwargs的高级应用指南

提高Python代码效率&#xff1a;*args与**kwargs的高级应用指南 引言*args的使用和技巧基本用法示例代码&#xff1a; 结合位置参数和*args使用示例代码&#xff1a; 使用*args传递参数给另一个函数示例代码&#xff1a; 解包列表或元组为函数参数示例代码&#xff1a; 高级技巧…

不同路径 不同路径 II 整数拆分

62.不同路径 力扣题目链接(opens new window) 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。…

jupyter notebook 突然莫名奇妙的白屏

jupyter notebook 突然莫名奇妙的白屏 事件背景&#xff1a; 最近在折腾openai&#xff0c;哎&#xff0c;一言难尽&#xff0c;使用的是conda管理python版本的切换&#xff0c;使用jupyter notebook来运行python程序&#xff0c;其实PyCharm也行&#xff0c;但是&#xff0c;…

数据标注专业团队

数据标注服务 在跟一些淘宝、多多商家老板合作后&#xff0c;客户一般付款后&#xff0c;中介是有20%左右的提成&#xff0c;我们主要是希望可以实现数据标注无中介化&#xff0c;有需求可以直接联系数据标注团队直接负责人&#xff0c; 若有意愿请添加添加v&#xff1a;shu_ju…

萨科微所在的功率半导体行业在电子产业中占据重要地位,产品用于电力设备的电能转换和电路控制,是进行电能处理的核心器件

萨科微slkor&#xff08;www.slkormicro.com&#xff09;半导体宋仕强说&#xff0c;萨科微所在的功率半导体行业在电子产业中占据重要地位&#xff0c;产品用于电力设备的电能转换和电路控制&#xff0c;是进行电能处理的核心器件。功率半导体细分产品主要有MOSFET、IGBT、BJT…

恒驰上云规划实施解决方案上线华为云官网

华为云与伙伴共同打造联合解决方案 已成为更多企业的数字化转型利器 1月恒驰上云规划实施解决方案 完成上市宣讲并正式上架华为云官网 恒驰上云规划实施解决方案能力全景图&#xff1a;融合厂商云服务能力&#xff0c;一站式高效云迁移 从深入了解企业的本地IT环境、业务特点…