第112讲:Mycat实践指南:字符串Hash算法分片下的水平分表详解

文章目录

    • 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运算,得到一个二进制数字,然后再拿这个二进制数字与1023也就是1111111111进行位运算,最后计算出该条数据应该落在哪个分片上。

字符串Hash算法与固定Hash算法类似,只不过固定Hash算法不能针对字符串处理,而字符串Hash算法可以将字符串转换成二进制数,然后再通过固定Hash算法计算出数据要落在哪个分片上。

如下图所示,依据字段列的值为tomcat,我们截取长度为0:1,截取两位,也就是to,此时字符串Hash会计算对to进行计算,得出一个二进制数字,然后再将这个二进制数据与1111111111进行位运算,根据得出的结果找到对应的分片ID,最终将数据写入到指定的分片上。

image-20220715215403297

1.2.字符串Hash算法是如何将数据路由到分片节点的

字符串Hash算法其实就是将字段值为字符串的内容,转换成二进制数,然后通过固定Hash计算出应该落在哪个节点上。

我们会在定义分片策略时,一共有2个分片节点,例如定义第一个节点存储位运算结果0-511之间的数据,第二个节点处理512-1023之间的数据,此时每个分片节点都处理512个数组,是均匀分配的现象。

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

当字段值为word时,首先根据截取的子字符串长度(0:2)截取3位,截取后子字符串为wor,然后通过Hash运算得到一个二进制数,再通过固定Hash,将二进制数与1111111111进行位运算,得到一个十进制数5,拿着这个十进制数5在数组集合中查找,最后查找到5位于0-511之内,0-511属于分片1,此时这条数据就会路由到分片1中存储。

image-20220715215552763

2.使用字符串Hash算法分片对某张表进行水平拆分

需求:目前有一张tb_strhash表,表中的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_strhash (name varchar(20),content varchar(100));#在分片2节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11
mysql> use db_2;
mysql> create table tb_strhash (name varchar(20),content varchar(100));

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_strhash" dataNode="dn1,dn2" rule="sharding-by-stringhash" /></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-stringhash"> <rule><columns>name</columns><algorithm>sharding-by-stringhash</algorithm> </rule></tableRule><function name="sharding-by-stringhash" class="io.mycat.route.function.PartitionByString"><!--每个分片所承载的数组数量--><property name="partitionLength">512</property> <!--分片节点的数量--><property name="partitionCount">2</property><!--字符串的截取长度,0:2表示截取第0/1/2位,一共3位长度的子字符串--><property name="hashSlice">0: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.写入数据观察分片效果

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
mysql> insert into tb_strhash (name,content) values ('T1001', UUID());
mysql> insert into tb_strhash (name,content) values ('ROSE', UUID());
mysql> insert into tb_strhash (name,content) values ('JERRY', UUID());
mysql> insert into tb_strhash (name,content) values ('CRISTINA', UUID());
mysql> insert into tb_strhash (name,content) values ('TOMCAT', UUID());

可以看到一部分数据写入到了分片1中,一部分数据写入到了分片2中。

image-20220715222049337

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

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

相关文章

Redis Pub/Sub: 实时消息传递的完美解决方案

Redis发布订阅&#xff08;Pub/Sub&#xff09;是一种消息传递模式&#xff0c;允许消息的发送者&#xff08;发布者&#xff09;将消息发送给多个接收者&#xff08;订阅者&#xff09;。在Redis中&#xff0c;发布者和订阅者之间通过频道&#xff08;Channel&#xff09;进行…

算法刷题day33

目录 引言一、动态网格二、画图三、扫雷 引言 这几天一直再写关于搜索的问题&#xff0c;我发现搜索不仅仅局限于网格中的那种搜索&#xff0c;还有状态的变换&#xff0c;也可以抽象成一个点&#xff0c;去找最小变换次数&#xff0c;这也是一种搜索&#xff0c;所以说还是得…

SpringData JPA 快速入门案例详解

SpringData JPA JPA 简介&#xff1a; JPA&#xff08;Java Persistence API&#xff09;是 Java 持久层规范&#xff0c;定义了一些列 ORM 接口&#xff0c;它本身是不能直接使用的&#xff0c;因为接口需要实现才能使用&#xff0c;Hibernate 框架就是实现 JPA 规范的框架。…

colab中数据集保存到drive与取出的方法

from google.colab import drive drive.mount(/content/drive) 一、下载数据集 from datasets import load_dataset max_length 32 # Maximum length of the captions in tokens coco_dataset_ratio 50 # 50% of the COCO2014 dataset# Load the COCO2014 dataset for tr…

浅谈MVVM、MVC、MVP的区别

MVC、MVP 和 MVVM 是三种常见的软件架构设计模式&#xff0c;主要通过分离关注点的方式来组织代码结构&#xff0c;优化开发效率。 在开发单页面应用时&#xff0c;往往一个路由页面对应了一个脚本文件&#xff0c;所有的页面逻辑都在一个脚本文件里。页面的渲染、数据的获取&…

计算机毕业设计-基于python的旅游信息爬取以及数据分析

概要 随着计算机网络技术的发展&#xff0c;近年来&#xff0c;新的编程语言层出不穷&#xff0c;python语言就是近些年来最为火爆的一门语言&#xff0c;python语言&#xff0c;相对于其他高级语言而言&#xff0c;python有着更加便捷实用的模块以及库&#xff0c;具有语法简单…

使用原生nodejs搭建一个简易的web服务器demo

简易demo var http require(http); var url require("url"); const app http.createServer(function (request, response) {var urlObj url.parse(request.url,true);console.log(request.url);// 内容类型: text/plain。并用charsetUTF-8解决输出中文乱码respon…

S2-066漏洞分析与复现(CVE-2023-50164)

Foreword 自struts2官方纰漏S2-066漏洞已经有一段时间&#xff0c;期间断断续续地写&#xff0c;直到最近才完成&#xff0c;o(╥﹏╥)o。羞愧地回顾一下官方通告&#xff1a; 2023.12.9发布&#xff0c;编号CVE-2023-50164&#xff0c;主要影响版本是 2.5.0-2.5.32 以及 6.0…

QT6实现创建与操作sqlite数据库三种方式方式对比(二)

一.概述 Qt访问Sqlite数据库的三种方式(即使用三种类库去访问)&#xff0c;QSqlQuery、QSqlQueryModel、QSqlTableModel&#xff0c;对于这三种类库&#xff0c;可看为一个比一个上层&#xff0c;也就是封装的更厉害&#xff0c;甚至第三种QSqlTableModel&#xff0c;根本就不…

Spring Security AuthenticatedVoter 错误访问控制漏洞复现(CVE-2024-22257)

免责声明 由于传播、利用本CSDN所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担! 一、产品介绍 Spring Security 是基于Spring应用程序的认证和访问控制框架。 二、漏洞描述 Spring Security在处理…

JJJ:改善ubuntu网速慢的方法

Ubuntu 系统默认的软件下载源由于服务器的原因&#xff0c; 在国内的下载速度往往比较慢&#xff0c;这时我 们可以将 Ubuntu 系统的软件下载源更改为国内软件源&#xff0c;譬如阿里源、中科大源、清华源等等&#xff0c; 下载速度相比 Ubuntu 官方软件源会快很多&#xff01;…

[AIGC] 在Spring Boot中指定请求体格式

在使用Spring Boot开发Web应用的时候&#xff0c;我们经常会遇到需要接收并处理HTTP请求的情况。一个HTTP请求通常包括一个请求行、若干请求头和一个请求体。请求体在POST和PUT请求中特别重要&#xff0c;因为它通常用于向服务器传递数据。 文章目录 创建并使用一个Java Bean指…

【技术栈】Redis 企业级解决方案

​ SueWakeup 个人主页&#xff1a;SueWakeup ​​​​​​​ 系列专栏&#xff1a;学习技术栈 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 个性签名&…

突发需求下的IT部门挑战与解决:沟通协作关键不可或缺

摘要&#xff1a; 在当今信息化时代&#xff0c;IT部门作为企业技术支持的核心&#xff0c;经常面临各种突发需求挑战。本文深入探讨突发需求对IT部门的影响&#xff0c;分析工作计划打乱、快速响应压力和协作困难等问题。重点阐述了在应对突发需求时的核心应对策略&#xff0c…

​备案是否是《标准合同》的生效要件?​

备案是否是《标准合同》的生效要件&#xff1f; 备案并非是标准合同条款的生效要件。 《个人信息出境标准合同办法》第三条明确个人信息出境标准合同的使用规则是以“自主缔约与备案管理”相结合&#xff0c;企业不进行备案并不影响合同的效力&#xff0c;但是如果企业不完成备…

在工业物联网应用中保护数据隐私和安全的最佳实践

在工业物联网&#xff08;IIoT&#xff09;应用中&#xff0c;保护数据隐私和安全是一项至关重要的工作&#xff0c;因为这些设备常常连接到关键基础设施&#xff0c;并处理敏感数据。以下是一些保护数据隐私和安全的最佳实践&#xff1a; 实施严格的访问控制&#xff1a; 使用…

QT 驾校系统界面布局编写

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(ui->label_img->width(),ui->label_img->height());//图片自适应窗口大小ui->label_img->setScaledContents(true);//图片置…

信息发布系统

特色功能 画布功能---可任意拖动各控件的播放位置及大小&#xff0c;可任意选择屏幕背景色或添加背景图 同步联屏---毫秒级同步功能 视频切换无黑屏 触摸查询系统 会议预定系统 终端显示-会议综合屏 终端显示-会议预定屏 终端显示-移动端 广告发布系统 硬件产品-智能终端 硬件…

HTML_CSS学习:超链接、列表、表格、表格常用属性

一、超链接_唤起指定应用 1.相关代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>超链接_唤起指定应用</title> </head> <body><a href"tel:10010">电话联…

C# 数组(Array)

C# 数组&#xff08;Array&#xff09; 初始化数组 声明一个数组不会在内存中初始化数组。当初始化数组变量时&#xff0c;您可以赋值给数组。 数组是一个引用类型&#xff0c;所以您需要使用 new 关键字来创建数组的实例。 例如&#xff1a; double[] b new double[10];…