第111讲:Mycat实践指南:固定Hash算法分片下的水平分表详解

news2024/12/23 0:31:58

文章目录

    • 1.固定Hash算法分片的概念
      • 1.1.固定Hash算法的概念
      • 1.2.固定Hash算法是如何将数据路由到分片节点的
    • 2.使用固定Hash算法分片对某张表进行水平拆分
      • 2.1.在所有的分片节点中创建表结构
      • 2.2.配置Mycat实现固定Hash算法分片的水平分表
        • 2.2.1.配置Schema配置文件
        • 2.2.2.配置Rule分片规则配置文件
        • 2.2.3.配置Server配置文件
        • 2.2.4.重启Mycat
      • 2.3.写入数据观察分片效果

1.固定Hash算法分片的概念

1.1.固定Hash算法的概念

固定Hash算法类似于十进制的求模运算,但是固定Hash算法是为二进制进行运算的,固定Hash运算会将依据的字段转换成耳机10位的二进制数字,然后与二进制1111111111进行位&运算。

位于运算时这个样子的:例如8的二进制是1000,7的二进制是0111,求1000和0111的位&运算,计算方式就是按照第一个二进制的每一位与第二个二进制的每一位进行相乘,如1*0=0 0*1=0 0*1=0 0*1=0 ,最后得出1000和0111的位&运算是0000。

固定Hash算法会将依据的字段内容转换成二进制数,然后与1111111111进行位运算,任何二进制数与1111111111进行位运算最终的结果都会在0000000000和1111111111之间,转换成十进制数也就是0-1023。

我们可以将分片策略设置0-255之间划分到分片1,256-512之间划分到分片2,512-1023划分到分片3,当依据字段被固定Hash转换成2进制数并且位运算完后,得到一个十进制数时,根据十进制数所在的分片,将数据写入到对应的分片节点中。

如下图所示,当字段值为1时,转换成二进制数与10个1进行位运算,最后在转换成十进制数,刚好也是1,0~255之间划分到分片1上,此时这条数据就会被划分到分片1节点上。

image-20220715205222179

固定Hash算法的特点:

  • 如果是取模分片,连续的值可能会分配到不同的分片中,而固定Hash算法会将连续的值可能分配到同一个分片中,降低事务处理的难度。
  • 可以均匀的分配,也可以非均匀分配。
  • 分片字段必须是数字类型。

1.2.固定Hash算法是如何将数据路由到分片节点的

我们会在定义分片策略时,一共有3个分片节点,例如定义第一个节点存储位运算结果0-255之间的数据,第二个节点处理256-511之间的数据,第三个节点处理512到1023之间的数据,此时前两个节点分别处理256个数组。,第三个节点则处理512个数组。

在0-255之间数组的结构中,会记录上第一个分片节点的ID0,255-511之间的数组的结构中,记录第二个分片节点的ID1,512-1023之间的数组结构中,记录第三个分片节点的ID2。

例如当字段值为515,经过固定Hash算法运算,将515转换成二进制数,与1023的二进制数进行位运算,最后的出来位运算的结果是十进制数515,515位于512-1023数组之间,此时就会拿导512-1023数组对应的分片ID号,然后将这条数据写入到对应的分片节点中。

image-20220715205802785

2.使用固定Hash算法分片对某张表进行水平拆分

需求:目前有一张tb_longhash 表,表中的id一列的值是数字类型,我们按照这个字段进行固定Hash算法分片。

2.1.在所有的分片节点中创建表结构

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

#在分片1节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11
mysql> use db_2;
mysql> create table tb_longhash (id int,name varchar(200),firstchar char(1));


#在分片2节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11
mysql> use db_2;
mysql> create table tb_longhash (id int,name varchar(200),firstchar char(1));

2.2.配置Mycat实现固定Hash算法分片的水平分表

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">
            <!--固定Hash算法分片-->
            <table name="tb_longhash" dataNode="dn1,dn2" rule="sharding-by-long-hash"/>
        </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分片规则配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/rule.xml
    <tableRule name="sharding-by-long-hash">
        <rule>
            <columns>id</columns>
            <!--关联固定hash的函数-->
            <algorithm>sharding-by-long-hash</algorithm>
        </rule> 
    </tableRule> 

   
    <function name="sharding-by-long-hash" class="io.mycat.route.function.PartitionByLong">
        <!--定义分片节点个数 书写方式和下面的partitionLength有对应关系 例如partitionCount为1,1 partitionLength为512,512 就表示前1个分片节点承载512个数组 后1个分片节点承载512个数组-->
        <property name="partitionCount">2,1</property>         <!--常见的有分片数量为,书写是这么写的:2,1 表示前两个节点分别承载多少个数组,具体承载多少个数组由partitionLength定义:256,512 连起来的意思就是说前两个分片分别承载256个数组,后一个分片承载512个数组-->
         <!-- 数组的总长度为1024 指定每个节点的数组数之后 多个数组相加起来必须等于1024--> 
        <property name="partitionLength">256,512</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.写入数据观察分片效果

先插入5条连续的数据。

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into tb_longhash (id,name,firstChar) values(1,'aa','Q');
mysql> insert into tb_longhash (id,name,firstChar) values(2,'nn','B'); 
mysql> insert into tb_longhash (id,name,firstChar) values(3,'ss','J'); 
mysql> insert into tb_longhash (id,name,firstChar) values(4,'ee','S'); 
mysql> insert into tb_longhash (id,name,firstChar) values(5,'hh','L'); 

可以看到数据全写入到了分片1中,这是因为1-5这个数字位运算后,还是1-5,当然会落在第一个分片中,0-511会写入到第一个分片,511-1023会写入到第二个分片。

image-20220715212012071

下面我们写入的数据id值给大一些,511-1023之间,观察效果。

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into tb_longhash (id,name,firstChar) values(777,'uuu','L');
mysql> insert into tb_longhash (id,name,firstChar) values(1000,'uuu','L');

777和1000位运算后,属于512-1023之间的数据,此时会被路由到分片2中,水平分表成功。

image-20220715212324090

我们再观察一种现象,如果数大于1023呢,会写入到哪里?答案是写入到第一个分片,相当于第二轮了。

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into tb_longhash (id,name,firstChar) values(1118,'uuu','L');
mysql> insert into tb_longhash (id,name,firstChar) values(1999,'uuu','L');

我们又分表插入了1118和1999这两台数据,1118属于第二轮的0-511之间的数据,路由到分片1,1999属于第二轮的512-1023的数据,路由到分片2。

image-20220715212443024

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

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

相关文章

VMware虚拟机和主机之间无法复制粘贴,移动文件,重新安装vmware-tools变灰,VMware Tools继续运行脚本未能在虚拟机中成功运行。

起初&#xff0c;虚拟机只是无法和主机之间进行复制粘贴&#xff0c;移动文件。查询了很多资料,反反复复地安装卸载vmware-tools&#xff0c;但是都没有成功。通过这篇文章&#xff1a;虚拟机安装VMware Tools的两种方法_vmware tools有3种安装方式-CSDN博客 安装了vmware_too…

PCIE收发时序了解

文章目录 一、Pcie的发送时序1.1 不带数据的TLP包1.2 带数据的TLP包1.3 连续发送数据的TLP包 二、Pcie的接收时序2.1 不带数据的TLP包2.2 带数据的TLP包2.3 连续接收数据的TLP包 三、riffa框架和用户channel的接口3.1 RX接口波形&#xff1a;3.2 TX接口波形&#xff1a; 一、Pc…

用python写网络爬虫:3.urllib库进一步的使用方法

文章目录 异常处理URLErrorHTTPError设置超时时间 链接的解析、构造、合并urlparse方法urlsplit方法urljoin方法urlencode方法parse_qs方法quote方法 Robots 协议Robots 协议的结构解析协议 参考书籍 在上一篇文章&#xff1a;用python写网络爬虫&#xff1a;2.urllib库的基本用…

SpringBoot3整合Knife4j4.x版本(Swagger3、OpenApi3)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; SpringBoot3整合Knife4j4.x版本(Swagger3、OpenApi3) ⏱️ 创作时间&a…

【每日力扣】131.分割回文串与450.删除二叉搜索树中的节点

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 131.分割回文串 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的…

C#使用MiniExcel读取excel表格文件

使用MiniExcel读取excel表格文件 MiniExecl提供了几种读取方法。 准备测试数据 测试类&#xff1a; public class Person{public int Id { get; set; }public string Name { get; set; }public string Description { get; set; }public double Value { get; set; }}测试数据…

伦敦数据科学与Scikit-learn:一次探索与实践的旅程

1.题目 Data Science London正在举办一场关于Scikit-learn的聚会。 这个比赛是尝试、分享和创建 sklearn 分类能力示例的练习场&#xff08;如果这变成了有用的东西&#xff0c;我们可以跟进回归或更复杂的分类问题&#xff09;。Scikit-learn&#xff08;sklearn&#xff09;…

Django项目不显示图片,路径找不到

1.问题 创建Django项目简单写一个网页&#xff0c;文字能显示&#xff0c;图片却无法加载&#xff0c;路径错误&#xff0c;找不到图片。 2.背景 我的项目结构 C:. ├─.idea │ └─inspectionProfiles ├─app01 │ ├─migrations │ ├─templates │ │ ├─app0…

postgres让别人连接自己本地的库

本地安装了postgres&#xff0c;一般只能自己连接&#xff0c;如果别人想要连接我们自己的库&#xff0c;需要修改postgres的配置。 找到pg.gba.conf&#xff0c;路径是&#xff1a;postgres安装路径/PostgreSQL/data 使用记事本打开这个文件&#xff0c;将别人的ip填入其中即…

Python数学建模-2.5Pandas库介绍

2.5.1Pandas基本操作 Pandas是一个强大的Python数据分析库&#xff0c;它提供了快速、灵活且富有表现力的数据结构&#xff0c;设计初衷是为了处理关系型或标记型数据。Pandas的基本操作涵盖了数据的读取、处理、筛选、排序、分组、合并以及可视化等多个方面。 以下是一些Pan…

CentOS7环境——yum安装nginx

目录 1.修改yum源为阿里云 2.下载wget 3.下载阿里云的 CentOS-Base.repo 到/etc/yum.repos.d/ 4.清空原本yum缓存 5.生成新的阿里云的yum缓存&#xff0c;加速下载预热数据 6.下载epel-release 7.下载nginx 8.启动并检查nginx状态 1.修改yum源为阿里云 cp /etc/yum.re…

QQ 截图工具独立版安装使用

前言 之前截图一直使用的QQ截图&#xff0c;相比于微信截图&#xff0c;QQ截图还支持长截图&#xff0c;总体来说&#xff0c;QQ截图是我使用过的最好的截图工具 。但是现在公司不让用微信、QQ、钉钉等通讯软件&#xff0c;要求使用公司自研的通讯软件&#xff0c;这样就不能使…

EMQX 实践

MQTT 核心概念 发布订阅 MQTT 基于发布订阅模式&#xff0c;它解耦了消息的发送方&#xff08;发布者&#xff09;和接收方&#xff08;订阅者&#xff09;&#xff0c;引入了一个中间代理的角色来完成消息的路由和分发。发布者和订阅者不需要知道彼此的存在&#xff0c;他们…

IIS上部署.netcore WebApi项目及swagger

.netcore项目一般是直接双击exe文件&#xff0c;运行服务&#xff0c;今天有个需求&#xff0c;需要把.netcore项目运行在IIS上&#xff0c;遇到了一个小坑&#xff0c;在这里记录一下。 安装IIS&#xff0c;怎么部署站点&#xff0c;这些过于简单就不细说了&#xff0c;不知道…

java学习之路-方法讲解

目录 1.方法概念及使用 1.1什么是方法 1.2方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系(重要) 1.5 没有返回值的方法 2.方法重载 3.方法递归 3.1递归概念 3.2递归执行过程分析 3.3递归练习 代码示例1 代码示例2 1.方法概念及使用 1.1什么是方法 方法就是…

ipad电容笔有必要买吗?怎么选?四大缺陷弊端要严防!

电容笔有没有必要买还是得看我们个人的使用需求&#xff0c;如果平时做笔记、画画比较多的话&#xff0c;还是值得入手的&#xff0c;原装笔是好&#xff0c;但对于一些预算不多的朋友来说&#xff0c;价格还是过于高了&#xff0c;不是很划算。而且我们国内市场的平替电容笔也…

【Linux】基础 IO(文件系统 inode 软硬链接)-- 详解

一、理解文件系统 1、前言 我们一直都在说打开的文件&#xff0c;磁盘中包含了上百万个文件&#xff0c;肯定不可能都是以打开的方式存在。其实文件包含打开的文件和普通的未打开的文件&#xff0c;下面重点谈谈未打开的文件。 我们知道打开的文件是通过操作系统被进程打开&am…

在线BLOG网|基于springboot框架+ Mysql+Java+JSP技术的在线BLOG网设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

【Oracle篇】一文搞清exp/imp逻辑迁移工具的用法(第一篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

{“message“:“Expecting value (near 1:1)“,“status“:400}

按照网页请求数据的方式无法获取数据 {“message”:“Expecting value (near 1:1)”,“status”:400} 将content-type改为以下请求数据方式 content-type: application-json,参考:https://stackoverflow.com/questions/72333040/why-400-response-status-code-when-send-post…