MyCat 分片

更多内容,前往IT-BLOG

如今随着互联网的发展,数据的量级也是呈指数的增长,从GBTBPB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合NoSQL是无法满足的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系型数据库。如果使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储。

一、简介

Mycat背后是阿里曾经开源的知名产品CobarCobar的核心功能和优势是MySQL数据库分片,阿里随后开源的Cobar,并维护到2013年初。Cobar的思路和实现路径的确不错。基于Java开发的,实现了MySQL公开的二进制传输协议,巧妙地将自己伪装成一个MySQL Server,目前市面上绝大多数MySQL客户端工具和应用都能兼容。比自己实现一个新的数据库协议要明智的多,因为生态环境在哪里摆着。Mycat是基于Cobar演变而来,对Cobar的代码进行了彻底的重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合,Join等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。

简单的说,MyCat就是一个新颖的数据库中间件产品,支持MySQL集群,或者mariaDB cluster(数据库管理系统集群),提供高可用的数据分片集群。你可以像使用MySQL一样使用MyCat。对于开发人员来说根本感觉不到MyCat的存在。

MyCat基本支持的所有数据库的集群,主要如下:

二、Mycat 下载及安装

前提: 安装并启动MySQL数据库,并设置远程访问:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
【1】MyCat官方网站:链接
【2】下载地址:链接
【3】将下载的MyCat(Mycat-server-1.4-release-20151019230038-linux.tar.gz)上传至服务器。
【4】解压(tar -zxvf Mycat-server-1.4-release-20151019230038-linux.tar.gz)后生成MyCat目录。
【5】进入MyCat目录下的bin目录,启动MyCat

./mycat start 

MyCat支持的命令{ console | start | stop | restart | status | dump(导出) }Mycat的默认端口号为:8066

Mycat大概的目录结构如下:

|—— bin
|    |—— mycat                 MyCat启动程序
|    |—— ...
|—— catlet
|—— conf
|    |—— log4j2.xml           日志的配置,可以根据自己的需要调整输出级别为 bebug
|    |—— rule.xml               分片规则的配置文件,分片规则的具体参数信息被单独存放为文件,也在当前目录下,对配置文件进行修改时需要重启 MyCat
|    |—— schema.xml        逻辑库和逻辑表的定义,以及分片定义的配置文件
|    |—— server.xml           MyCat 服务器参数和用户授权的配置文件
|    |—— wrapper.conf       JVM内存配置文件
|    |—— zkconf                 ZooKeeper 的配置目录
|—— lib                             MyCat自身的 Jar包或依赖的 Jar包的存放目录
|—— logs                          MyCat日志的存放目录。日志被存放在 logs/log中,每天生成一个文件
|—— version.txt                版本信息 

三、MyCat 分片(海量数据存储解决方案)

什么是分片: 就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。数据的切分Sharding根据其切分规则的类型,可以分为两种切分模式:
【1】一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切分可以称之为数据的垂直(纵向)切分

【2】另外一种则是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分

MyCat 分片策略:

【1】逻辑库schema 前面说了数据库中间件,通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。
【2】逻辑表table 既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
 ■ 分片表: 是指那些原有的很大数据的表,需要切分到多个数据库的表,这样每个分片都有一部分数据,所有分片构成了完整的数据。 总而言之就是需要进行分片的表。
 ■ 非分片表: 一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。
【3】分片节点dataNode 数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)。与实体数据库中的表是相互对应的。
【4】节点主机dataHost 数据切分后,每个分片节点dataNode不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机dataHost,为了规避单节点主机并发数限制,尽量将读写压力高的分片节点dataNode均衡的放在不同的节点主机dataHost
【5】分片规则rule 前面讲了数据切分,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。

四、MyCat 分片配置

提示:建议每次修改配置前都对其进行备份,例如:cp conf/schema.xml conf/schema.xml.bak

【1】配置schema.xml schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、逻辑表以及对应的分片规则、DataNode以及DataHost。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。

<mycat:schema xmlns:mycat="http://org.opencloudb/"><!-- schema 标签用于定义MyCat实例中的逻辑库 name 表示连接时的数据源,需要在server.xml中配置连接的用户名和密码 --><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"><!--Table标签 定义了 MyCat中的逻辑表(可以有多个)name: 逻辑表的名称dataNode:对应 dataNode 标签,配置了 节点与实体数据库表的关系rule:对应 rule.xml 配置文件中的规则 name,auto-sharding-long的分片规则是按ID值的范围进行分片 1-5000000 为第1片  5000001-10000000 为第2片....  具体设置我们会rule.xml 中说明name中的值是表的名称,创建的表需要再此定义,否则不会成功--><table name="tb_test" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /></schema><!--dataNode 标签定义了 MyCat中的数据节点,也就是我们通常说所的数据分片。dataHost:对应 dataHost标签中的 namedatabase:对应数据库中的表名(必须存在实体数据源db1,db2,db3) --><dataNode name="dn1" dataHost="localhost1" database="db1" /><dataNode name="dn2" dataHost="localhost1" database="db2" /><dataNode name="dn3" dataHost="localhost1" database="db3" /><!--dataHost标签 在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。 --><dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- 主服务hostM1信息,修改url与用户名和密码为自己的地址等 --><writeHost host="hostM1" url="192.168.88.129:3306" user="root"password="123456"></writeHost></dataHost>
</mycat:schema>

【2】配置server.xml server.xml几乎保存了所有MyCat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。在system标签中添加UTF-8字符集设置,否则存储中文会出现问号

<property name="charset">utf8</property>

修改 user标签的设置 , 我们这里为 TESTDB 设置了一个用户:

<!--schemas:对应 schema 中的逻辑库 <schema> 标签name 的值,这里=TESTDBpassword:用户登录的密码name:用户登录名称-->
<user name="test"><property name="password">test</property><property name="schemas">TESTDB</property>
</user>

【3】配置rule.xml 用于定义分片规则 ,我们这里讲解两种最常见的分片规则:

【第一种分片规则】: 按主键范围分片rang-long,在配置文件中我们找到对应配置如下:

<!--我们配置的默认规则-->
<!--tableRule 是定义具体某个表或某一类表的分片规则名称   columns用于定义分片的列  algorithm代表算法名称 我们接着找rang-long的定义-->
<tableRule name="auto-sharding-long"><rule><columns>id</columns><algorithm>rang-long</algorithm></rule>
</tableRule>
<!--Function 用于定义算法 mapFile 用于定义算法需要的数据,我们打开autopartition-long.txt-->
<function name="rang-long"class="org.opencloudb.route.function.AutoPartitionByLong"><property name="mapFile">autopartition-long.txt</property>
</function>

打开autopartition-long.txt文件,内如如下:

# range start-end ,data node index
# K=1000,M=10000.
#表示第一个db1存储id在 0-500万 之间的数据
0-500M=0
#表示第一个db2存储id在 500万-1000万 之间的数据
500M-1000M=1
#表示第一个db3存储id在 1000万-1500万 之间的数据
1000M-1500M=2

【第二种分片规则】: 一致性哈希murmur,当我们需要将数据平均分在几个分区中,需要使用一致性hash规则,我们找到rule.xml中的functionnamemurmur的定义,将count属性改为3,因为我要将数据分成3片:

<tableRule name="sharding-by-murmur"><rule><columns>id</columns><algorithm>murmur</algorithm></rule>
</tableRule>
<function name="murmur"class="org.opencloudb.route.function.PartitionByMurmurHash"><property name="seed">0</property><!-- 默认是0 --><!-- 要分片的数据库节点数量,必须指定,否则没法分片 --><property name="count">3</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 --><property name="virtualBucketTimes">160</property><!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 --><!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
</function>

五、MyCat 分片测试

【1】通过外部工具连接MyCat逻辑库TESTDB

【2】进入TESTDB(use TESTDB)执行下列语句创建一个表:创建后你会发现,MyCat会自动将你的表转换为大写,这一点与Oracle有些类似。并且在db1db2db3TESTDB数据源中都会创建tb_test表,此表名需要在schema.xml中定义。

CREATE TABLE tb_test (id BIGINT(20) NOT NULL,title VARCHAR(100) NOT NULL ,PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8

我们查看一下,我们创建的db1db2db3的状况,会发现都创建了tb_test表。接下来是插入表数据(注意:在写INSERT语句时一定要写把字段列表写出来,否则会出现下列错误提示:1064

INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'goods1');
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001');
INSERT INTO TB_TEST(ID,TITLE) VALUES(1100000,'goods10000001');

我们会发现这些数据按照我们说的第一种分片规则,将id=1的写入db1id=5000001的写入db2id=1100000写入 db3。采用的分片规则是每节点存储500万条数据。如果查出了定义的范围,则直接抛错。

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

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

相关文章

BACnet物联网关BL103:Modbus协议转BACnet/MSTP

随着物联网技术在楼宇自动化与暖通控制系统中的迅猛发展&#xff0c;构建一种既经济高效又高度可靠的协议转换物联网关成为了不可或缺的核心硬件组件。在此背景下&#xff0c;我们钡铼特别推荐一款主流的BAS&#xff08;楼宇自动化系统&#xff09;与BACnet物联网关——BL103&a…

C#实现深度优先搜索(Depth-First Search,DFS)算法

深度优先搜索&#xff08;DFS&#xff09;是一种图搜索算法&#xff0c;它尽可能深入一个分支&#xff0c;然后回溯并探索其他分支。以下是使用C#实现DFS的代码示例&#xff1a; using System; using System.Collections.Generic;class Graph {private int V; // 顶点的数量pr…

数据库表的行列转换(行转列,列转行)

目录 前言 行转列 创建测试表 score1 插入测试数据 需求与通用SQL写法 列转行 创建测试表 score2 插入测试数据 需求与通用SQL写法 前言 在工作中&#xff0c;多多少少都会遇到一些数据展示的需求&#xff0c;开发一个接口&#xff0c;从数据库中查询数据返回页面展示…

【目标检测】Yolo5基本使用

前言 默认安装好所有配置&#xff0c;只是基于Yolo5项目文件开始介绍的。基于配置好的PyCharm进行讲解配置。写下的只是些基本内容&#xff0c;方便以后回忆用。避免配置好Yolo5的环境&#xff0c;拉取好Yolo5项目后&#xff0c;不知道该如何下手。如果有时间&#xff0c;我还是…

30 列表常用方法——append()、insert()、extend()

append()、insert()、extend() 这 3 个方法都可以用于向列表对象中添加元素。 ① append() 用于向列表尾部追加一个元素。 ② insert() 用于向列表任意指定位置插入一个元素。 ③ extend() 用于将另一个列表中的所有元素追加至当前列表的尾部。 这 3 个方法都属于原地操作&…

【第二天】计算机网络 HTTP请求报文和响应报文是什么样的 HTTP请求方式有哪些 GET请求和POST请求的区别

HTTP请求报文和响应报文是什么样的&#xff1f; 我去&#xff0c;以前都没怎么研究过这个。 客户端发送一个请求给服务器&#xff0c;服务器根据请求报文中的信息进行处理&#xff0c;并将处理结果放到响应报文中返回给客户端。 URL HTTP使用URL (Uniform Resource Locator&…

从0开始搭建vue + flask 旅游景点数据分析系统(二):搭建基础框架

这一期目标是把系统的布局给搭建起来&#xff0c;采用一个非常简单的后端管理风格&#xff0c;可以参考官方的页面 https://element.eleme.cn/#/zh-CN/component/container 下面我们开始搭建&#xff0c;首先&#xff0c;安装一下vue-router&#xff0c;element-ui npm insta…

css 作业 2

文章目录 前言第四题第五题第六题第七题第八题第九题第十题&#xff08;子标签&#xff09; 前言 昨天写了前面三次作业&#xff0c;今天把剩下的七个作业写完 第四题 http://127.0.0.1:5500/index1.html&#xff0c;就用这个网址查看代码在网页的展示效果 代码评测过不了&…

650Kg大载重双旋翼无人直升机技术详解

大载重双旋翼无人直升机&#xff0c;作为现代航空技术的杰出代表&#xff0c;其设计巧妙融合了高效能、高稳定性与灵活性。该机采用经典的双旋翼布局&#xff0c;有效解决了传统单旋翼直升机尾桨产生的复杂气动力问题&#xff0c;极大提升了飞行稳定性和安全性。机体结构采用轻…

网页突然被恶意跳转或无法打开?DNS污染怎么解决?

前言 在网上冲浪时&#xff0c;我们时常会遭遇DNS污染这一区域性攻击&#xff0c;几乎无人能幸免。受影响时&#xff1a;尝试访问正规网站可能会被错误导向赌博、色情或其他恶意站点。 1.我们为什么需要DNS 当我们想要访问一个网站时&#xff0c;就像拨打朋友的电话号码一样…

Java聚合快递小程序对接云洋系统程序app源码

​一场物流效率的革命 引言&#xff1a;物流新时代的序章 在数字化浪潮席卷各行各业的今天&#xff0c;物流行业也迎来了前所未有的变革。为了进一步提升物流效率&#xff0c;优化用户体验&#xff0c;聚合快递系统与云洋系统小程序的对接成为了行业内外关注的焦点。这一创新…

教务管理平台/高校教务管理系统的设计与实现/教务网站/学生成绩管理系统/学生课程管理系统

获取源码联系方式请查看文章结尾&#x1f345; 摘 要 伴随着社会以及科学技术的发展&#xff0c;互联网已经渗透在人们的身边&#xff0c;网络慢慢的变成了人们的生活必不可少的一部分&#xff0c;紧接着网络飞速的发展&#xff0c;管理系统这一名词已不陌生&#xff0c;越来…

python_基础编程_字典、集合

字典类型&#xff1a; 一、什么是字典 字典&#xff1a;是py内置的数据结构之一&#xff0c;与列表一样是一个可变的序列&#xff0c;以键值对的方式存储数据&#xff0c;是一个无序的序列 二、字典的原理 实现原理&#xff1a;Py根据key查找value所在的位置 三、字典的创…

Win11安装Docker

下载Docker Desktop for Windows 下载 下载连接&#xff1a;Install Docker Desktop on Windows | Docker Docs 地址在国外&#xff0c;需要科学上网。也可使用我提供的&#xff0c;百度网盘&#xff1a;https://pan.baidu.com/s/1232TTkkzLsoZyFjC3bmgiQ 安装 下载完成之后…

java深浅拷贝

目录 1、浅拷贝与深拷贝的区别 浅拷贝 深拷贝 2、浅拷贝实现 3、深拷贝实现 来都来了点个赞收藏一下再走呗~~~&#x1f339;&#x1f339;&#x1f339;&#x1f339;&#x1f339; 1、浅拷贝与深拷贝的区别 浅拷贝 定义&#xff1a;浅拷贝创建了一个新的对象&#xff0…

数据容器-小结

目录 一、数据容器特点比较 二、数据容器操作小结 1、通用序列操作 2、通用的转换操作 3、案例演示 一、数据容器特点比较 二、数据容器操作小结 1、通用序列操作 2、通用的转换操作 3、案例演示 1&#xff09;list([iterable])&#xff1a;转换成列表 str_a "…

Vue.js 2 项目实战(八):小黑记事本组件版

前言 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它的设计初衷是通过采用简洁且强大的结构&#xff0c;使前端开发变得更简单和高效。以下是对 Vue.js 的详细介绍&#xff1a; 核心特性 声明式渲染 Vue.js 使用声明式语法来描述用户界面&#xff0c;通过数据绑…

Python酷库之旅-第三方库Pandas(049)

目录 一、用法精讲 176、pandas.Series.rank方法 176-1、语法 176-2、参数 176-3、功能 176-4、返回值 176-5、说明 176-6、用法 176-6-1、数据准备 176-6-2、代码示例 176-6-3、结果输出 177、pandas.Series.sem方法 177-1、语法 177-2、参数 177-3、功能 177…

深入探索Python3网络爬虫:构建数据抓取与解析的强大工具

前言 在当今这个信息爆炸的时代&#xff0c;数据成为了驱动各行各业发展的关键要素。无论是市场分析、用户行为研究&#xff0c;还是内容聚合与推荐系统&#xff0c;都需要从海量的互联网数据中提取有价值的信息。而网络爬虫&#xff0c;作为自动化获取网页数据的技术手段&…

JVM系列(二) -类的加载过程

一、背景介绍 我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件&#xff0c;然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。 那么虚拟机是什么时候加载class文件&#xff1f;如何加载class文件&#xff1f;class文件进入到虚拟机后发…