MySql都会了,确定不学习一下MyCat分片?

推荐阅读:

MyCat 介绍

什么是MyCat

官方网站::http://www.mycat.org.cn/ http://www.mycat.io/ db proxy Mycat

MyCat 架构

MyCat 核心概念

Schema

Schema:由它指定逻辑数据库(相当于MySQL的database数据库)

Table

Table:逻辑表(相当于MySQL的table表)

DataNode

DataNode:真正存储数据的物理节点

DataHost

DataHost:存储节点所在的数据库主机(指定MySQL数据库的连接信息)

User

User:MyCat的用户(类似于MySQL的用户,支持多用户)

MyCat 主要解决问题

  1. 海量数据保存 2。查询优化

MyCat 对多数据库的支持

MyCat 分片策略

MyCAT支持水平分片与垂直分片:水平分片:一个表格的数据分割到多个节点上,按照行分隔。垂直分片:一个数据库中多个表格A,B,C,A存储到节点1上,B存储到节点2上,C存储到节点3 上。

MyCAT通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分 片字段并绑定一个函数,来实现动态分片算法。

Schema

Schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table。

Table

Table:表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的 逻辑数据节点DataNode。在此可以指定表的分片规则。

DataNode

DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过 DataHost来关联到后端某个具体数据库上

DataHost

DataHost:定义某个物理库的访问地址,用于捆绑到Datanode上

MyCat 安装

下载MyCat

1wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710- 2linux.tar.gz

解压缩

tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

进入mycat/bin,启动MyCat

1- 启动命令:./mycat start 2- 停止命令:./mycat stop 3- 重启命令:./mycat restart 4- 查看状态:./mycat status

访问MyCat

1使用mysql的客户端直接连接mycat服务。默认服务端口为【80662mysql -uroot -p123456 -h127.0.0.1 -P8066

MyCat 分片

配置schema.xml

什么是schema.xml

schema.xml作为Mycat中重要的配置文件之一,管理着Mycat的逻辑库、表、分片规则、DataNode 以及DataHost之间的映射关系。弄懂这些配置,是正确使用Mycat的前提。schema 标签用于定义MyCat实例中的逻辑库 Table 标签定义了MyCat中的逻辑表 dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。dataHost标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读 写分离配置和心跳语句。

Schema.xml 配置

1<?xml version="1.0"?> 2<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 3<mycat:schema xmlns:mycat="http://io.mycat/"> 4 <!-- 5 schema : 逻辑库 name:逻辑库名称 6 sqlMaxLimit:一次取多少条数据 要超过用limit xxx 7 table:逻辑表 8 dataNode:数据节点 对应datanode标签 9 rule:分片规则,对应rule.xml 10 subTables:子表 11 primaryKey:分片主键 可缓存 12 --> 13 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> 14 <!-- auto sharding by id (long) --> 15 配置Server.xml 16 server.xml介绍 17 server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。 18 server.xml配置 19 配置rule.xml 20 rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算 21 法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标 22 签。在具体使用过程中可以按照需求添加tableRule和function23 此配置文件可以不用修改,使用默认即可。 24 <table name="item" dataNode="dn1,dn2,dn3" rule="mod-long" 25 primaryKey="ID"/> 26 </schema> 27 <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" 28 /> --> 29 <dataNode name="dn1" dataHost="localhost1" database="db1" /> 30 <dataNode name="dn2" dataHost="localhost1" database="db2" /> 31 <dataNode name="dn3" dataHost="localhost1" database="db3" /> 32 <!-- 33 dataHost : 数据主机(节点主机) 34 balance:1 :读写分离 0 :读写不分离 35 writeType:0 第一个writeHost写, 1 随机writeHost写 36 dbDriver:数据库驱动 native:MySQL JDBC:Oracle、SQLServer 37 switchType:是否主动读 38 1、主从自动切换 -1 不切换 2 当从机延时超过slaveThreshold值时切换为主读 39 --> 40 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" 41 writeType="0" dbType="mysql" dbDriver="native" switchType="1" 42 slaveThreshold="100"> 43 <heartbeat>select user()</heartbeat> 44 <writeHost host="hostM1" url="192.168.24.129:3306" user="root" 45 password="root" > 46 </writeHost> 47 </dataHost> 48</mycat:schema>

配置server.xml

server.xml 介绍

server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。

server.xml 配置

1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE mycat:server SYSTEM "server.dtd"> 3<mycat:server xmlns:mycat="http://io.mycat/"> 4 <system> 5 <property name="defaultSqlParser">druidparser</property> 6 </system> 7 <user name="mycat"> 8 <property name="password">mycat</property> 9 <property name="schemas">TESTDB</property> 10 </user> 11</mycat:server>

配置rule.xml

rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算 法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标 签。在具体使用过程中可以按照需求添加tableRule和function。此配置文件可以不用修改,使用默认即可

1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE mycat:rule SYSTEM "rule.dtd"> 3<mycat:rule xmlns:mycat=”http://io.mycat/> 4<tableRule name="sharding-by-intfile"> 5<rule> 6 <columns>sharding_id</columns> 7 <algorithm>hash-int</algorithm> 8</rule> 9</tableRule> 10<function name="hash-int" 11 class="io.mycat.route.function.PartitionByFileMap"> 12<property name="mapFile">partition-hash-int.txt</property> 13</function> 14 </mycat:rule>

tableRule 标签配置说明:

name 属性指定唯一的名字,用于标识不同的表规则 rule 标签则指定对物理表中的哪一列进行拆分和使用什么路由算法。columns 内指定要拆分的列名字。algorithm 使用 function 标签中的 name 属性。连接表规则和具体路由算法。当然,多个表规则 可以连接到同一个路由算法上。table 标签内使用。让逻辑表使用这个规则进行分片。

function 标签配置说明:

name 指定算法的名字。class 制定路由算法具体的类名字。property 为具体算法需要用到的一些属性。

几个常用的分片规则

连续分片

日期列分区法

1<!--按固定时间分片--> 2<tableRule name="sharding-by-date"> 3 <rule> 4 <columns>create_time</columns> 5 <algorithm>sharding-by-date</algorithm> 6 </rule> 7</tableRule> 8<function name="sharding-by-date" 9 class="io.mycat.route.function..PartitionByDate"> 10<property name="dateFormat">yyyy-MM-dd</property> 11<property name="sBeginDate">2014-01-01</property> 12<property name="sPartionDay">10</property> 13</function> 14 <!--按自然月分片--> 15<tableRule name="sharding-by-month"> 16<rule> 17 配置说明: 18 tableRule标签: 19 columns :标识将要分片的表字段 20 algorithm :指定分片函数 21 function标签: 22 dateFormat :日期格式 23 sBeginDate :开始日期 24 sPartionDay :分区天数,即默认从开始日期算起,分隔10天一个分区 25 二、范围约定 26 配置说明: 27 tableRule标签: 28 <columns>create_time</columns> 29 <algorithm>sharding-by-month</algorithm> 30</rule> 31</tableRule> 32<function name="sharding-by-month" 33 class="io.mycat.route.function..PartitionByMonth"> 34<property name="dateFormat">yyyy-MM-dd</property> 35<property name="sBeginDate">2014-01-01</property> 36</function> 37 <!-- 38 按单月小时分片 39 适合做日志,每月末,手工清理 40 --> 41<tableRule name="sharding-by-hour"> 42<rule> 43 <columns>create_time</columns> 44 <algorithm>sharding-by-hour</algorithm> 45</rule> 46</tableRule> 47<function name="sharding-by-hour" 48 class="io.mycat.route.function..LastestMonthPartition"> 49<property name="splitOneDay">24</property> 50</function>

配置说明 tableRule标签:columns :标识将要分片的表字段 algorithm :指定分片函数 function标签:dateFormat :日期格式 sBeginDate :开始日期 sPartionDay :分区天数,即默认从开始日期算起,分隔10天一个分区

范围约定

1<tableRule name="auto-sharding-long"> 2<rule> 3<columns>user_id</columns> 4<algorithm>rang-long</algorithm> 5</rule> 6</tableRule> 7<function name="rang-long" 8class="io.mycat.route.function.AutoPartitionByLong"> 9<property name="mapFile">autopartition-long.txt</property> 10</function>

配置说明 tableRule标签:columns :标识将要分片的表字段 algorithm :指定分片函数 function标签:mapFile :指定分片函数需要的配置文件名称

autopartition-long.txt文件内容:所有的节点配置都是从0开始,及0代表节点1,此配置非常简单,即预先制定可能的id范围对应某个分 片

1# range start-end ,data node index 2# K=1000,M=10000. 30-500M=0 0-100 0 4500M-1000M=1 101-200 1 5201-300 2 61000M-1500M=2 7default=0 8# 或以下写法 9# 0-10000000=0 10# 10000001-20000000=1

优势:扩容无需迁移数据 缺点:热点数据,并发受限

离散分片

枚举法

1<tableRule name="sharding-by-intfile"> 2 <rule> 3 <columns>user_id</columns> 4 <algorithm>hash-int</algorithm> 5 </rule> 6</tableRule> 7<function name="hash-int" 8 class="io.mycat.route.function.PartitionByFileMap"> 9<property name="mapFile">partition-hash-int.txt</property> 10<property name="type">0</property> 11<property name="defaultNode">0</property> 12</function>

配置说明 tableRule标签:columns :标识将要分片的表字段 algorithm :指定分片函数 function标签:mapFile :指定分片函数需要的配置文件名称 type :默认值为0,0表示Integer,非零表示String defaultNode :指定默认节点,小于0表示不设置默认节点,大于等于0表示设置默认节点,0代表节 点1。

默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点。如果不配置默认节点(defaultNode值小于0表示不配置默认节点),碰到不识别的枚举值 就会报错:

partition-hash-int.txt 配置:

110000=0 列等于10000 放第一个分片 210010=1 3=0 4=1 5beijing=0 6tianjin=1 7zhanghai=2

求模法

1<tableRule name="mod-long"> 2<rule> 3<columns>user_id</columns> 4<algorithm>mod-long</algorithm> 5</rule> 6</tableRule> 7<function name="mod-long" 8class="io.mycat.route.function.PartitionByMod"> 9<!-- how many data nodes --> 10<property name="count">3</property> 11</function>

tableRule标签:columns :标识将要分片的表字段 algorithm :指定分片函数 function标签:count :节点数量

一致性hash

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

等,还有一些其他分片,这里,暂时不说明

测试分片

把商品表分片存储到三个数据节点上。

创建表

配置完毕后,重新启动mycat。使用mysql客户端连接mycat,创建表。

CREATE TABLE item (id int(11) NOT NULL,name varchar(20) DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8

分片测试

分片策略指定为“auto-sharding-long” 分片规则指定为“mod-long”

本文同步分享在 博客“Java入门到入坟”(JianShu)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

MySql都会了,确定不学习一下MyCat分片? - HelloWorld