【mysql数据库】mycat中间件
MyCat
简介
Mycat 是数据库 中间件 。
1、 数据库中间件
中间件 是一类连接软件组件和应用的计算机软件, 以便于软件各部件之间的沟通 。
例子 Tomcat web 中间件 。
数据库 中间件 连接 java 应用程序和数据库
2、 为什么要用 Mycat
① Java 与数据库紧耦合 。
② 高访问量高并发对数据库的压力 。
③ 读 写请求数据不一致。
作用
1、读写分离
基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT 查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

2、数据分片
垂直拆分 (分库) 、 水平拆分 (分表) 、 垂直 水平拆分 (分库分表)

3、多数据源整合
当一个项目需要用到多种数据源如Oracle、MySQL、SQL Server、 PostgreSQL时,可以利用Mycat进行整合,只需访问Mycat 这一个 数据源就行。

4、数据库路由器
Mycat基于MySQL 实例的连接池复用机制,可以让每个应用最大程度地共享一个MySQL实例的所有连接池,让数据库的并发访问能力大大提升。
原理
Mycat的原理中最重要的一个动 词是“拦截”,它拦截 了用户发送过来的 SQL 语句,首先对 SQL
语句做了 一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库 并将返回的结果做适当的处理,最终再返回给用户 。
逻辑库schema
业务开发人员通常在实际应用中并不需要知道中间件的存在,只需 要关注数据库,所以数据库中间件可以被当作一个或多个数据库集 群构成的逻辑库。
-
name:对应Server.xml中配置的逻辑库名TESTDB
-
checkSQLschema:在SQL语句操作时指定了数据库名称,执行时是否自动去除;true:自动去
除,false:不自动去除。当该值设置为true时,如果我们执行语句select * from TESTDB.travelrecord;则MyCat会把语句修改为select * from travelrecord;即把表示schema的字
符去掉,避免发送到后端数据库执行时报(ERROR 1146 (42S02): Table ‘testdb.travelrecord’
doesn’t exist)。 -
sqlMaxLimit:当该值设置为某个数值时。每条执行的SQL语句,如果没有加上limit语句,MyCat
也会自动的加上所对应的值。例如设置值为100,执行select * from TESTDB.travelrecord;的效果
为和执行select * from TESTDB.travelrecord limit 100;相同设置该值的话,MyCat默认会把查询
到的信息全部都展示出来,造成过多的输出。所以,在正常使用中,还是建议加上一个值,用于减
少过多的数据返回。当然SQL语句中也显式的指定limit的大小,不受该属性的约束。需要注意的
是,如果运行的schema为非拆分库的,那么该属性不会生效。需要手动添加limit语句。 -
dataNode:同时存在,指定默认存储节点,比如建表默认会创建到该节点下,对应dataNode下的
name属性
注意:
逻辑库,与MySQL中的Database(数据库)对应,⼀个逻辑库中定义了所包括的Table。
逻辑表table
既然有逻辑库,就会有逻辑表。在分布式数据库中,对于应用来说,读写数据的表就是逻辑表。逻辑表可以分布在一个或多个分片库中,也可以不分片。
节点主机DataNode
将数据切分后,每个分片节点不一定会独占一台机器,同一台机器上可以有多个分片数据库,这样一个或多个分片节点所在的机器就是节点主机。为了规避单节点主机并发数量的限制,尽量将读写压力高的分片节点均匀地放在不同的节点主机上。
- name:节点名称,可随意填写
- dataHost:对应dataHost标签中name属性值
- database:真实Mysql服务中创建的数据库名称
数据库主机DataHost
数据切分后,每个分片节点(dataNode)不一定都会独占一台机器, 同一机器上面可以有多个分片数据库,这样一个或多个分片节点 (dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主 机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放 在不同的节点主机(dataHost)。
1、mysql读写分离集群搭建,要求主从复制至少三台,mycat独立一台
MySQL主从复制:
架构规划192.168.99.116 master 主节点192.168.99.117 slave1 从节点 192.168.99.118 slave2 从节点
mycat配置 192.168.99.119
server.xml
<user name="root"><property name="password">123456</property><property name="schemas">XCZDB</property></user>
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="XCZDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="testNode"></schema><dataNode name="testNode" dataHost="dtHost" database="t4" /><dataHost name="dtHost" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"><!-- 心跳检测,检测服务器是否宕机 --><heartbeat>select user()</heartbeat><!--写节点--><writeHost host="hostM1" url="192.168.99.116:3306" user="namida" password="Namida@123"><!--从节点--><readHost host="hostS1" url="192.168.99.117:3306" user="namida" password="Namida@123" /><readHost host="hostS2" url="192.168.99.118:3306" user="namida" password="Namida@123" /></writeHost></dataHost>
</mycat:schema>
cd /usr/local/mycat/bin
mycat console
测试
mycat添加数据

master数据库(连接名sql)

slave1:

slave2

2、mycat分片规则实现,要求有两个主从集群,一台mycat
a、范围分片练习
b、取模分片练习
c、一致性hash分片练习
架构规划
192.168.99.116 master1 主节点
192.168.99.117 slave1 从节点
192.168.99.118 master1 主节点
192.168.99.121 slave2 从节点
a、范围分片练习
规则配置
autopartition-long.txt
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
#1000M-1500M=2
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="XCZDB" checkSQLschema="true" sqlMaxLimit="100" ><table name="test4" dataNode="dn1,dn2" rule="auto-sharding-long" /></schema><dataNode name="dn1" dataHost="dtHost1" database="t4" /><dataNode name="dn2" dataHost="dtHost2" database="t4" /><dataHost name="dtHost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"><!-- 心跳检测,检测服务器是否宕机 --><heartbeat>select user()</heartbeat><!--写节点--><writeHost host="hostM1" url="192.168.99.116:3306" user="namida" password="Namida@123"><!--从节点--><readHost host="hostS1" url="192.168.99.117:3306" user="namida" password="Namida@123" /></writeHost></dataHost><dataHost name="dtHost2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"><!-- 心跳检测,检测服务器是否宕机 --><heartbeat>select user()</heartbeat><!--写节点--><writeHost host="hostM2" url="192.168.99.118:3306" user="namida" password="Namida@123"><!--从节点--><readHost host="hostS2" url="192.168.99.121:3306" user="namida" password="Namida@123" /></writeHost></dataHost>
</mycat:schema>
测试
mycat写入数据
(5000011,test5)

查看master2

b、取模分片练习
修改rule.xml
count 2 代表有2个datanode
<tableRule name="mod-long"><rule><columns>id</columns><algorithm>mod-long</algorithm></rule></tableRule>
……
<function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!-- how many data nodes --><property name="count">2</property></function>
修改配置 文件 schema.xml
<schema name="XCZDB" checkSQLschema="true" sqlMaxLimit="100" ><table name="test4" dataNode="dn1,dn2" rule="mod-long" /></schema>
mycat添加数据
11,master1
12,master0

master1中出现12

master2中出现11

c、一致性hash分片练习
rule.xml
<tableRule name="sharding-by-murmur"><rule><columns>id</columns><algorithm>murmur</algorithm></rule></tableRule>……
<function name="murmur"class="io.mycat.route.function.PartitionByMurmurHash"><property name="seed">0</property><!-- 默认是0 --><property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 --><property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 --><!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 --><!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 --></function>
schema.xml
<schema name="XCZDB" checkSQLschema="true" sqlMaxLimit="100" ><table name="test4" dataNode="dn1,dn2" rule="sharding-by-murmur" /></schema>
启动
./mycat console
mycat表test4添加数据
20,test3
21,test33
master1

master2


相关文章:
【mysql数据库】mycat中间件
MyCat 简介 Mycat 是数据库 中间件 。 1、 数据库中间件 中间件 是一类连接软件组件和应用的计算机软件, 以便于软件各部件之间的沟通 。 例子 Tomcat web 中间件 。 数据库 中间件 连接 java 应用程序和数据库 2、 为什么要用 Mycat ① Java 与数据库紧耦合 …...
满帮集团 Eureka 和 ZooKeeper 的上云实践
作者:胡安祥 满帮集团,作为“互联网物流”的平台型企业,一端承接托运人运货需求,另一端对接货车司机,提升货运物流效率。2021 年美股上市,成为数字货运平台上市第一股。根据公司年报,2021 年&a…...
ubuntu中彻底删除mysql (配置文件删除可选)
ubuntu中彻底删除mysql (配置文件删除可选) 对于此类即搜即用的分享文章,也不过多赘述,直接依次按照下面的操作执行即可: 一、删除 mysql 数据文件 sudo rm /var/lib/mysql/ -R二、删除 mysql 配置文件 sudo rm /etc/mysql/ -R三、查看 m…...
根据模板和git commit自动生成日·周·月·季报
GitHub - qiaotaizi/dailyreport: 日报生成器 GitHub - yurencloud/daily: 程序员专用的日报、周报、月报、季报自动生成器! config.json: { "Author": "gitname", "Exclude": ["update:", "add:", "…...
matlab GUI界面设计
【实验内容】 用MATLAB的GUI程序设计一个具备图像边缘检测功能的用户界面,该设计程序有以下基本功能: (1)图像的读取和保存。 (2)设计图形用户界面,让用户对图像进行彩色图像到灰度图像的转换…...
MyBatis 面试题
一、什么是 Mybatis? 1、Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性 能,灵活度高。 …...
C#根据数据量自动排版标签的样例
这是一个C#根据数据量自动排版标签的样例 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using HslCommuni…...
【网络安全】Web安全基础 - 第一节:使用软件及环境介绍
VMware VMware,是全球云基础架构和移动商务解决方案的佼佼者。 VMware可是一个总部位于美国加州帕洛阿尔托的计算机虚拟化软件研发与销售企业呢。简单来说,它就是通过提供虚拟化解决方案,让企业在数据中心改造和公有云整合业务上更加得心应…...
Mac下载docker
先安装homebrew Mac下载Homebrew-CSDN博客 然后输入以下命令安装docker brew install --cask --appdir/Applications docker 期间需要输入密码。输入完等待即可...
k8s_设置dns
配置k8s dns 在 Kubernetes 集群中,CoreDNS 是默认的 DNS 服务器,它负责处理集群内所有的 DNS 请求。 kubectl edit cm coredns -n kube-system (此命令修改coredns 配置) kubectl describe cm coredns -n kube-system(此命令查看coredns 配…...
翻译《The Old New Thing》- What a drag: Dragging a virtual file (HGLOBAL edition)
What a drag: Dragging a virtual file (HGLOBAL edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080318-00/?p23083 Raymond Chen 2008年03月18日 拖拽虚拟文件(HGLOBAL 版本) 现在我们已经对简单的数据…...
SA316系列音频传输模块-传输距离升级音质不打折
SA316是思为无线研发的一款远距离音频传输模块,音频采样率为48K,传输距离可达200M。为了满足更多用户需求,思为无线在SA316基础上进一步增加传输距离推出SA316F30。相比SA316性能,同样其采用48K采样,-96dBm灵敏度&…...
【机器学习】智能选择的艺术:决策树在机器学习中的深度剖析
在机器学习的分类和回归问题中,决策树是一种广泛使用的算法。决策树模型因其直观性、易于理解和实现,以及处理分类和数值特征的能力而备受欢迎。本文将解释决策树算法的概念、原理、应用、优化方法以及未来的发展方向。 🚀时空传送门 &#x…...
电脑缺少运行库,无法启动程序
在我们使用一些软件的时候,由于电脑缺少一些运行库,导致无法启动应用软件,此时需要我们安装缺少的运行库。 比如当电脑提示: Cannot load library Qt5Xlsx.dll 我们就需要下载C得运行库,以满足软件运行需要。 下载链…...
【计算机软考_初级篇】每日十题2
各位老师大家好,软考对于日常的知识储备和企业中的考试,或者说在校大学生来说,那用处是非常大的!!那么下面我们进入正题,软考呢是分两种语言,java和C,对于其他语言目前还没ÿ…...
HR人才测评,如何做营销人员岗位素质测评?
营销人员是企业中的重要角色,他们直接负责企业产品或服务的销售和推广,是企业中最直接影响销售业绩的人才之一。因此,营销人员的基本素质测评非常重要,能够有效评估营销人员的能力和潜力,为企业招聘和培养优秀的营销人…...
LabVIEW调用第三方硬件DLL常见问题及开发流程
在LabVIEW中调用第三方硬件DLL时,除了技术问题,还涉及开发流程、资料获取及与厂家的沟通协调。常见问题包括函数接口不兼容、数据类型转换错误、内存管理问题、线程安全性等。解决这些问题需确保函数声明准确、数据类型匹配、正确的内存管理及线程保护。…...
datax实现MySQL数据库迁移shell自动化脚本
datax实现MySQL数据库迁移 (1)生成python脚本 # codingutf-8 import json import getopt import os import sys import MySQLdb#MySQL相关配置,需根据实际情况作出修改 mysql_host "xxxx" mysql_port "3306" mysql_u…...
PostgreSQL的学习心得和知识总结(一百四十四)|深入理解PostgreSQL数据库之sendTuples的实现原理及功能修改
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…...
C++数据结构之:链List
摘要: it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合&am…...
Altium Designer 实战指南:高效创建与优化PCB封装库
1. Altium Designer封装库基础入门 刚接触PCB设计时,我最头疼的就是封装库的创建。记得第一次画板子,因为电阻封装画错导致整批板子返工,那种挫败感至今难忘。现在用Altium Designer做封装就像搭积木一样简单,关键是要掌握正确的方…...
BACnet4j实战:从模拟设备到点位数据采集的完整流程解析
1. BACnet4j与工业物联网数据采集入门 第一次接触BACnet协议时,我被各种专业术语搞得晕头转向。直到用BACnet4j成功读取到第一个温度传感器的数据,才真正理解这个协议的价值。BACnet/IP就像工业设备间的普通话,而BACnet4j就是让Java程序能说这…...
忍者像素绘卷入门必看:Z-Image-Turbo模型结构精简与推理速度提升原理
忍者像素绘卷入门必看:Z-Image-Turbo模型结构精简与推理速度提升原理 1. 项目概述 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站,专为16-Bit复古游戏美学风格设计。它采用明亮的"云端"视觉设计,为用户提供清爽且…...
如何将 iQOO 手机备份到Mac
iQOO是vivo旗下的智能手机品牌,以其强劲的性能、出色的游戏体验和极具竞争力的价格而闻名。它深受那些希望以合理价格购买高性能Android手机的用户欢迎。然而,由于缺乏官方的 macOS 管理工具,许多用户发现将 iQOO 手机备份到Mac并非易事。幸运…...
MedGemma-X智能助手实测:像住院总医师一样分析X光片
MedGemma-X智能助手实测:像住院总医师一样分析X光片 1. 重新定义影像诊断:从工具到助手 在放射科的日常工作中,我们习惯了与各种CAD(计算机辅助诊断)系统打交道。它们像精确但沉默的尺子,能在图像上标出可…...
DanKoe 视频笔记:人生经验课:给18岁自己的信
在本节课中,我们将学习一位28岁人士回顾过去,总结出的核心人生经验。这些经验旨在帮助年轻人,特别是那些感到迷茫、渴望超越平凡生活的人,建立自主性、明确目标并采取有效行动。我们将把这些经验整理成一套清晰的教程,…...
算法模拟类题目解析
前言:最近开始偏系统的从简单到难一步步刷算法题,先从模拟题开始,下边附带题目与连接,感兴趣可刷刷也可看看我的思路。 一.字符串展开 链接:https://ac.nowcoder.com/acm/problem/16644 来源:牛客网 题意…...
从黑客攻防角度看网络命令:如何用ping/tracert/nslookup发现网络安全隐患
网络命令的攻防实战:用基础工具发现隐藏的安全威胁 当大多数人还在把ping、tracert这些基础网络命令当作简单的连通性测试工具时,安全工程师已经将它们变成了发现网络威胁的"显微镜"。这些看似简单的命令行工具,在专业的安全分析场…...
Pixel Couplet Gen 生成效果对比分析:不同参数下的对联质量评估
Pixel Couplet Gen 生成效果对比分析:不同参数下的对联质量评估 1. 引言:当AI遇上传统对联 春节贴对联是中国延续千年的文化传统,但创作一副既工整又有新意的对联并非易事。Pixel Couplet Gen作为一款AI对联生成工具,通过调整Te…...
Kettle转换里‘阻塞数据’控件为啥不灵?我用这个真实ETL案例给你讲透
Kettle转换中‘阻塞数据’控件的实战解析:从失效到精准控制 在ETL工具Kettle的实际应用中,数据流的精确控制往往是决定任务成败的关键。许多中高级用户在使用"阻塞数据直到步骤都完成"控件时,都曾遇到过看似配置正确却无法生效的困…...
