第107讲:Mycat实践指南:取模分片下的水平分表详解

文章目录

    • 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.使用取模分片水平分表

平台库下有一张表的数据量非常多,目前已经达到了600w行数据,查询效率很低,数据量越大,索引的结构就越高,性能会有所下降。

基于这种情况,我们决定针对这张业务表进行水平分表,分表后,原表的数据量就会被分到多张表中,缓解单表的压力,将该表的数据拆分到多个数据库实例中存放。

本次我们通过取模分片的方式来对达标进行水平分表。

取模分片指的是根据特定的字段值与分片节点数量进行求模运算,也就是除法运算取余数,根据运算结果中的余数,决定数据写入到哪一个分片中。指定取模分片的字段一定要是数字类型的字段,否则是无法进行运算的。

取模分片例子:

根据id列进行取模分片,写入数据的id为15,分片节点数为2个,运算过程:15/2=7余1,余数为1,取模分片此时就会将这个数据写入到分片2中,因为在Mycat分片中,分片的ID都是从0开始的,余数的值就是要写入对应分片节点的ID号,余数为1就对应分片2这个节点。

2.水平分表取模分片案例

在db_1数据库下有一张table1表,其数据量已经达到500w行,查询效率较低,现需要对这张表进行水平分表,采用取模分片的方法对该表进行水平分表。

2.1.准备测试的表结构

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

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

1.在两个分片上创建数据库
[root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11 -e "create database db_2;"
[root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11 -e "create database db_2;"2.在两个分片上创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11 -e "use db_2; create table table2 (id int,name varchar(10));"
[root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11 -e "use db_2; create table table2 (id int,name varchar(10));"

2.2.配置Mycat实现范围分片的水平分表

2.2.1.配置Schema配置文件

我们针对table1这张表进行水平分表时,要为其同时指定上两个分片,然后再为其指定分片规则,同时指定两个分片后,Mycat根据分片规则路由到不同的分片上。

[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"><!--定义逻辑表 将table2这张大表水平拆分到dn1、dn2这两个分片上 并且分片规则使用mod-long--><table name="table2" dataNode="dn1,dn2" rule="mod-long"/></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分片规则配置文件中,我们要配置主要是根据表中的那个字段进行范围分片,如果做取模分片的字段也是id字段,就不需要调整这个配置文件,只需要调整取模分片中传入的参数。

注意:做取模分片的字段必须是数字类型的字段。

[root@mysql-1 ~]# vim /data/mycat/conf/rule.xml <!--分片规则的名称-->><tableRule name="mod-long"><rule><!--基于表中那个字段进行分片--><columns>id</columns>	<algorithm>mod-long</algorithm></rule></tableRule><!--特定类型所对应的函数名称-->><function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!-- 分片节点数量 这个值就是取模的分母 id字段会除与这个值 得到的余数就是划分的节点ID --><property name="count">2</property></function>
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)插入ID为10和15的两条数据

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into table2 (id,name) values (10,'abc');
mysql> insert into table2 (id,name) values (15,'xbz');

ID10除与分片节点数2,余数为0,那么该条数据会分配至分片1的数据库实例中。

image-20220714235852175

ID15除与分片节点数1,余数为1,那么该条数据会分配至分片2的数据库实例中。

image-20220714235659299

3)在Mycat中通过查询table1表就能看到所有的数据

image-20220714235913684

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element---tree树形结构(返回的数据与官方的不一样)

项目中要用到属性结构数据&#xff0c;后端返回的数据不是官方默认的数据结构&#xff1a; <el-tree:data"treeData":filter-node-method"filterNode":props"defaultProps"node-click"handleNodeClick"></el-tree>这是文档…

品牌要把控质量也要管控价格

在品牌发展的道路上&#xff0c;产品质量的把控非常重要&#xff0c;关系到品牌的竞争力&#xff0c;但品牌要长期发展&#xff0c;产品要获得市场足够份额&#xff0c;还需要有稳定的价格体系做支撑&#xff0c;这个价格不是仅凭品牌单方面的定价而定&#xff0c;而是整个渠道…

运维知识点-Tomcat

Tomcat tomcat日志告警tomcat文件包含读取漏洞Tomcat ### 远程代码执行(7.0.0-7.0.81) 开启PUT,访问127.0.0.1:8080改PUT,创建x.jsp,写入shellwar后文件部署,登入特定后台,上传包含jsp写的war文件。文件解析tomcat日志告警 cat catalina.sh /usr/local/tomcat/confTo…

NextJs教程系列(四):路由loading

loading加载 loading.js 可以帮助你使用React Suspense创建一个组件, 当你在加载路由内容时&#xff0c;它会显示该加载状态组件&#xff0c;渲染完成后&#xff0c;新的内容将会自动替换。 传统ssr渲染流程 传统的ssr渲染流程&#xff0c;当用户请求一个页面时&#xff0c;服…

高中数学:初等函数之幂函数

1、定义 注意&#xff1a;x项系数&#xff0c;只能是1&#xff01; 例题&#xff1a; 2、常见幂函数图像 3、分数指数幂 x定义域&#xff1a;分母为偶数时&#xff0c;如&#xff1a;2、4、6等&#xff0c;则x≥0 x≥0时 4、画草图 步骤&#xff1a; 1、利用结论画出第…

蓝桥-求和

目录 法一&#xff1a;暴力 法二&#xff1a;利用前缀和 法一&#xff1a;暴力 通过率60% #include <bits/stdc.h> using namespace std; long long a[200010]; long long s;int main() {int n;cin>>n;for(int i0;i<n;i){cin>>a[i];}for(int i0;i<…

2024年第二届教育发展、哲学、社会科学国际会议(ICEDPSS2024)

2024年第二届教育发展、哲学、社会科学国际会议&#xff08;ICEDPSS2024&#xff09; 一、【会议简介】 2024第二届教育发展、哲学和社会科学国际会议&#xff08;ICEDPSS2024&#xff09;将在中国成都举行。本次会议将讨论教育发展、哲学和社会科学等问题。ICEDPSS2024旨在为…

HUAWEI Pocket 2说的防晒检测,能做到什么程度?

防晒是必须&#xff0c;还是噱头&#xff1f;我们来看一下经典案例&#xff1a; 《新英格兰医学杂志》调查一名69岁的卡车司机发现&#xff0c;他位于车窗侧、遭受更多阳光直晒的左半边脸&#xff0c;无论是皱纹还是皮肤厚度&#xff0c;都要比远离阳光的右半边脸要严重得多&am…

testvue-新增图表功能(教师那边-后续放到管理员那边)-src/main.js ,router/index.js

1.安装--然后在src/main.js中 导入 和 使用2修改&#xff1a;common/sidebar.vue ,page/ echarts.vue , router/index.js , src/main.js 3sidebar.vue <template><div class"sidebar"><el-menuclass"sidebar-el-menu":default-active&quo…

【Java EE初阶三十】JVM的简单学习

1. JVM 内存区域划分 一个运行起来的 Java 进程&#xff0c;就是一个 JVM 虚拟机&#xff0c;需要从操作系统申请一大块内存&#xff0c;就会把这个内存&#xff0c;划分成不同的区域&#xff0c;每个区域都有不同的作用. JVM 申请了一大块内存之后,也会划分成不同的内…

Docker容器的操作

目录 运行容器 查看容器 查看容器详细信息 删除容器 启动容器 停止容器 重启容器 暂停容器 激活容器 杀死容器 进入容器 常用 查看容器的日志 拷贝容器的文件到本地 容器改名 查看容器资源 查看容器内部的进程 监测容器发生的事件 检测容器停止以后的反回值…

hexo butterfly博客搭建美化集合+问题记录

文章目录 一、美化1. cs 和js引入2. 图标使用 三、问题总结1. vscode终端输入hexo命令报错 一、美化 1. cs 和js引入 hexo博客添加自定义css和js文件 如果想魔改和美化&#xff0c;添加自定义文件是不可避免的。下面来详细说一下css和js文件的创建和引入&#xff0c;其他文件同…