【MySQL】MyCat分库分表分片规则配置详解与实战(MySQL专栏启动)

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。
📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。
🏆 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人
🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~
🍅 文末获取联系 🍅 👇🏻 精彩专栏推荐订阅收藏 👇🏻
专栏系列(点击解锁)
学习路线(点击解锁)
知识定位
🔥Redis从入门到精通与实战🔥
Redis从入门到精通与实战
围绕原理源码讲解Redis面试知识点与实战
🔥MySQL从入门到精通🔥
MySQL从入门到精通
全面讲解MySQL知识与企业级MySQL实战 🔥计算机底层原理🔥
深入理解计算机系统CSAPP
以深入理解计算机系统为基石,构件计算机体系和计算机思维
Linux内核源码解析
围绕Linux内核讲解计算机底层原理与并发
🔥数据结构与企业题库精讲🔥
数据结构与企业题库精讲
结合工作经验深入浅出,适合各层次,笔试面试算法题精讲
🔥互联网架构分析与实战🔥
企业系统架构分析实践与落地
行业最前沿视角,专注于技术架构升级路线、架构实践
互联网企业防资损实践
互联网金融公司的防资损方法论、代码与实践
🔥Java全栈白宝书🔥
精通Java8与函数式编程
本专栏以实战为基础,逐步深入Java8以及未来的编程模式
深入理解JVM
详细介绍内存区域、字节码、方法底层,类加载和GC等知识
深入理解高并发编程
深入Liunx内核、汇编、C++全方位理解并发编程
Spring源码分析
Spring核心七IOC/AOP等源码分析
MyBatis源码分析
MyBatis核心源码分析
Java核心技术
只讲Java核心技术
本文目录
本文目录
本文导读
一、MyCat分库分表拆分策略——垂直分库
二、MyCat分库分表拆分策略——水平分表分片规则
1、水平分表的分片规则
2、分片规则详细说明及配置
2.1、按照范围分片
2.2、取模分片
2.3、一致性hash分片
2.4、枚举分片
总结
本文导读
MyCat 的分片规则配置在conf目录下的 rule.xml 文件中定义,学习本文,首先需要复习上一篇:MyCAT三大配置文件详解 的重点知识。
MyCat 拆分策略包含垂直拆分和水平拆分,作垂直拆分时,一般做垂直分库;水平拆分,一般情况下只会进行水平拆分表。垂直分表和水平分库很复杂一般也不会在生产环境中使用,本文仅做了解和基于面试做配置和原理解析。
一、MyCat分库分表拆分策略——垂直分库
垂直分库就是,在数据库中每个表对应于不同的业务,根据业务垂直切分对表进行分类,并将其分发到不同的数据库,从而分担不同数据库的压力。此时需要在多个MySQL服务器中创建数据库,要实现以上功能就需要在 MyCat 的 schema.xml 文件中进行配置。
简单来说,一个电商部门有很多业务场景,例如秒杀、营销、商品、库存、B端管理、订单、交易、配送、售后、结算等等,垂直分库就是不同的业务模块小组单独使用一个库。
仅针对 schema.xml配置文件的核心配置,有关dataHost中的配置和mycat环境的部署,请参阅上一篇
<!-- 逻辑库 --><schema name="DB01" checkSQLschema="true" sqlMaxLimit="100"><!-- 逻辑表的名字, 逻辑表下的节点,逻辑表数据存入节点的规则 --><table name="TB_ORDER" dataNode="dn1" rule="auto-sharding-long"/><table name="TB_GOODS" dataNode="dn2" rule="auto-sharding-long"/><table name="TB_delivery" dataNode="dn3" rule="auto-sharding-long"/></schema><!-- 节点名称,节点关联的物理主机位置,关联数据库名称 --><dataNode name="dn1" dataHost="dhost1" database="db01"/><dataNode name="dn2" dataHost="dhost2" database="db01"/><dataNode name="dn3" dataHost="dhost3" database="db01"/>
二、MyCat分库分表拆分策略——水平分表分片规则
如果一个表有多条数据,此时单表具有性能上线,水平拆分的目的是根据一定的路由规则将数据分配给不同的数据库和表,提高数据库性能。
1、水平分表的分片规则
在mycat中,主要提供了9中不同的分片规则,他们分别是:按照范围分片、取模分片、一致性hash分片、枚举分片、应用指定算法分片、固定hash算法分片、字符hash解析分片、按天分片、按自然月份分片。
2、分片规则详细说明及配置
2.1、按照范围分片
mycat的默认分片规则:根据指定的字段及其配置的范围与数据节点的对应情况,来决定该数据属于哪一个分片。
<!-- schema.xml文件 rule="auto-sharding-long" 可以看出分片规则是auto-sharding-long --><schema name="DB01" checkSQLschema="true" sqlMaxLimit="100"><table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /></schema><!-- rule.xml文件,可以看出是 根据 id 的值进行分片,具体的分片算法是 rang-long --><tableRule name="auto-sharding-long"><rule><columns>id</columns><algorithm>rang-long</algorithm></rule></tableRule><function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong"><property name="mapFile">autopartition-long.txt</property></function>
2.2、取模分片
根据指定的字段及其配置范围以及数据节点的相应情况,确定数据属于哪个分区。
<!-- schema.xml文件 -->
<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100"><table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<!-- rule.xml文件,可以看出是 id为指定的字段,具体的分片算法是 mod-long -->
<tableRule name="mod-long"><rule><columns>id</columns><algorithm>mod-long</algorithm></rule>
</tableRule>
<!-- 有多少个主机节点,count的值就应该为多少 count = "3" 就是根据指定的字段对 3 进行取模 -->
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"><property name="count">3</property>
</function>
2.3、一致性hash分片
假如表的id值是一个uuid,这样就不能够范围查询或者取模运算了,这样子就可以使用一致性hash分片效果会比较好,根据id的一致性hash值来确定将数据分配到哪一个数据节点。
所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置。
<!-- schema.xml文件 -->
<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100"><table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="sharding-by-murmur"/>
</schema><!-- rule.xml文件,可以看出是 id为指定的字段,分片算法为 murmur -->
<tableRule name="sharding-by-murmur"><rule><columns>id</columns><algorithm>murmur</algorithm></rule>
</tableRule><!-- function中一般一需要修改一个配置 count 的值,有多少个数据节点就设置成多少,其他的使用默认值即可 -->
<function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash"><property name="seed">0</property><!-- 默认是0 --><property name="count">3</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 --><property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
</function>
2.4、枚举分片
通过在配置文件中配置可能的枚举值,指定数据分布到不同数据节点上,本规则适用于按照省份、性别、状态拆分数据等业务。
<table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="sharding-by-enumstatus" /><rule><columns>status</columns><algorithm>hash-int</algorithm></rule>
总结
MyCat 的分片规则配置在conf目录下的 rule.xml 文件中定义,学习本文,首先需要复习上一篇:MyCAT三大配置文件详解 的重点知识。
MyCat 拆分策略包含垂直拆分和水平拆分,作垂直拆分时,一般做垂直分库;水平拆分,一般情况下只会进行水平拆分表。垂直分表和水平分库很复杂一般也不会在生产环境中使用,本文仅做了解和基于面试做配置和原理解析。
相关文章:
【MySQL】MyCat分库分表分片规则配置详解与实战(MySQL专栏启动)
📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公…...
OpenWrt路由器设置域名动态解析手把手教程
文章目录0、前言1、准备工作2、详细步骤2.1、OpenWrt路由器软件包安装2.2、防火墙放行入站数据(修改为“接受”并保存应用)2.3、域名解析服务商对域名的解析设置2.4、路由器中动态域名插件的设置0、前言 因为一直用着内网穿透(zerotier或者是…...
java流浪动物救助系统(毕业设计)
项目类型:Java web项目/Java EE项目(非开源) 项目名称:基于JSPServlet的流浪动物救助网站[dwjz_web] 进行源码获取 用户类型:双角色(爱心人士、管理员) 项目架构:B/S架构 设计思…...
阿里代码规范插件中,Apache Beanutils为什么被禁止使用?
在实际的项目开发中,对象间赋值普遍存在,随着双十一、秒杀等电商过程愈加复杂,数据量也在不断攀升,效率问题,浮出水面。 问:如果是你来写对象间赋值的代码,你会怎么做? 答…...
NFC enable NFC使能流程
同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 NFC enable NFC使能流程 认识nfc系统如何工作,最好的方法就是了解nfc的各个流程,…...
Redis实例绑定CPU物理核优化Redis性能
进入本次Redis性能调优之前,首先要知道CPU结构也会影响Redis的性能。接下来,具体了解一下!为什么CPU结构也会影响Redis的性能?主流的 CPU 架构一个 CPU 处理器中一般有多个物理核,每个物理核都可以运行应用程序。每个物…...
STC15中断系统介绍
STC15中断系统介绍✨本篇参考来源于STC官方stc15系列手册:538页- 589页。(文末提供该摘取部分的文档资料) 🎉在官方提供的手册资料中,一个系列一份手册,手册内容涵盖了数据手册和参考手册以及例程案例。对于学习着来说…...
力扣HOT100 11-15
11.盛水最多的容器 思路:最大水量 底边 * 高度。较短的一边控制最大水量,因此,采用双指针的方式,左、右指针指向开始和末尾,逐个向中间移动,判断左右指针所指向的高度哪个更低,它就向中间移动一…...
深入浅出单调栈与单调队列
目录一、单调栈情形一:寻找一个数左边第一个小于它的数情形二:寻找一个数左边第一个小于它的数的下标情形三:寻找一个数右边第一个大于它的数情形四:寻找一个数右边第一个大于它的数的下标二、单调栈的应用2.1 单调栈模板题I2.2 单…...
深入C语言——实现可变参数函数
文章目录初步示例函数解析最大值函数初步示例 stdarg.h提供了C语言对可变参数的支持,先举一个简短的例子 //testStdArg.c #include <stdarg.h> #include <stdio.h>void printIntList(int N, ...){va_list args; //存放...所代表的参数va_start(…...
41-Dockerfile-Dockerfile简介
Dockerfile简介前言Dockerfile 简介基础知识使用Dockerfile 构建镜像步骤Dockerfile 构建过程Dockerfile基本结构Dockerfile示例总结前言 本篇开始来学习下Dockerfile相关的用法 Dockerfile 简介 Dockerfile : 是用来构建 Docker 镜像的文本文件,是有一条条构建镜…...
【408】操作系统 - 刻骨铭心自测题1(上)
文章目录OS练习题第一部分:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17&am…...
【老卫拆书】009期:Vue+Node肩挑全栈!《Node.js+Express+MongoDB+Vue.js全栈开发实战》开箱
今天刚拿到一本新书,叫做《Node.jsExpressMongoDBVue.js全栈开发实战》,做个开箱。 外观 先从外观上讲,这本是全新的未开封的,膜还在。 这本书介绍从技术原理到整合开发实战,以丰富的项目展现全栈开发的一个技巧。 …...
【LeetCode】动态规划总结
动态规划解决的问题 动态规划和贪心的区别: 动态规划是由前一个状态推导出来的; 贪心是局部直接选最优的。 动态规划解题步骤 状态定义:确定dp数组以及下标的含义状态转移方程:确定递推公式初始条件:dp如何初始化遍历…...
CAS详解.
CAS这个机制就给实现线程安全版本的代码,提供了一个新的思路,之前通过加锁,把多个指令打包成整体,来实现线程安全。现在就可以考虑直接基与CAS来实现一些修改操作,也能保证线程安全(不需要加锁)…...
Mock.js初步使用(浏览器端)
Mock.js:生成随机数据,拦截 Ajax 请求。官方地址:http://mockjs.com/第一个demodemo.html<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>mockjs demo</title> </head> <…...
opencv保存图片
大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…...
【c++】数据类型
文章目录整型实型科学计数法sizeof关键字字符型字符串类型转义字符bool布尔类型c规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存。 整型 作用:整型变量表示的是整数类型的数据。 实型 float f3.14; //默…...
Elasticsearch的写的底层原理
前面有一篇文章讲解了Elasticsearch的读写搜索过程,有的人感觉不太理解,今天我们再来看看这些过程的原理 写数据底层原理 首先是将数据写入到内存buffer中,在这里的时候,数据是搜索不到。他同时会将数据写入到translog日志文件中…...
【网络编程】Java中的Socket
文章目录前言socket是什么?Java中的SocketJava实现网络上传文件前言 所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
