mycat 分表规则
Mycat水平分表

Mycat⽔平分表环境说明主机名IP⾓⾊数据库node1192.168.114.129Mycat node_seqnode2192.168.114.133Mysql student_db01 student_db02node3192.168.114.136Mysql student_db03 student_db04实验假设我们数据库中有⼀张学⽣表(stduent),和⼀张学⽣详情表(student_detail)。
因为数据量太⼤要分表,把原来⼀张表能够存储的数据,⽔平扩展到4个数据库中。
寻找分⽚字段⽔平切分整张表,需要找⼀个分⽚键,作为分⽚的依据分⽚后各个节点上的数据尽可能存储均匀分⽚键最好是⾼频查询⽤到的查询条件如果要分⽚的表还有⼦表,那么⼦表也应该使⽤ER表形式,把相关联数据分配到同⼀个分⽚节点上创建表#node2create database student_db01 default charset utf8;create database student_db02 default charset utf8;#node3create database student_db03 default charset utf8;create database student_db04 default charset utf8;#stduent01,student02,student03,student04 节点CREATE TABLE `student` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(32) NOT NULL COMMENT '学⽣姓名',`class_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '班级id',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学⽣表';CREATE TABLE `student_detail` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`student_id` varchar(32) NOT NULL COMMENT '学⽣表id',`address` varchar(50) DEFAULT '' COMMENT '学⽣地址',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='学⽣详情表';分⽚配置⽤到的⽂件使⽤schema.xml 配置逻辑库和逻辑表使⽤rule.xml 配置分⽚表的分⽚规则使⽤server.xml 配置访问⽤户及权限配置 rule.xml进⾏⽔平分⽚是才⽤到这个xml<tableRule name="student_sharding"><rule><columns>class_id</columns><algorithm>mod-long</algorithm></rule></tableRule>配置全局唯⼀id全局唯⼀id的⽤处是,即使主键是⾃增的情况下,保证各个节点不会出现重复主键允许创建函数vim my.conflog_bin_trust_function_creators=1msql创建⾃增规则表mysql> mysql -uroot -pmysql> create database node_seq default charset utf8;导⼊mysql -uroot -p node_seq < /usr/local/mycat/conf/dbseq.sqlmysql > insert into MYCAT_SEQUENCE values('STUDENT',1,1);mysql > insert into MYCAT_SEQUENCE values('STUDENT_DETAIL',1,1);mysql > grant all on *.* to 'mycat_connect'@'192.168.114.%';mysql > flush privileges;修改配置指定相关表和数据库之间的关系vim /usr/local/mycat/conf/sequence_db_conf.propertiesSTUDENT=node_seqSTUDENT_DETAIL=node_seqserver id⽣成⽅式vim /usr/local/mycat/conf/server.xml<property name="sequnceHandlerType">1</property><!-- sequnceHandlerType = 1 --- 表⽰采⽤数据库对象-->配置vim /usr/local/mycat/conf/schema.xml<schema name="school_db" checkSQLschema="false" sqlMaxLimit="100"><table name="student" primaryKey="id" dataNode="student_db01,student_db02,student_db03,student_db04" rule="student_sharding" autoIncrement="true"> <childTable name="student_detail" primaryKey="id" joinKey="student_id" parentKey="student_id" autoIncrement="true"></childTable></table></schema><dataNode name="student_db01" dataHost="mysql133" database="student_db01" /><dataNode name="student_db02" dataHost="mysql133" database="student_db02" /><dataNode name="student_db03" dataHost="mysql136" database="student_db03" /><dataNode name="student_db04" dataHost="mysql136" database="student_db04" /><!--使⽤全⾓⾃增id--><dataNode name="node_seq" dataHost="mysql129" database="node_seq" /><dataHost name="mysql133" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"><heartbeat>select user()</heartbeat><writeHost host="192.168.114.133" url="192.168.114.133:3306" user="mycat_connect" password="123456" /></dataHost><dataHost name="mysql136" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"><heartbeat>select user()</heartbeat><writeHost host="192.168.114.136" url="192.168.114.136:3306" user="mycat_connect" password="123456" /></dataHost><dataHost name="mysql129" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1"><heartbeat>select user()</heartbeat><writeHost host="192.168.114.129" url="192.168.114.129:3306" user="mycat_connect" password="123456" /></dataHost><!--autoIncrement = true 表⽰表开启全局⾃增id -->配置 server.xml<system><property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户--><property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 --><property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班⼀致性检测、0为关闭 --><property name="sequnceHandlerType">1</property><property name="serverPort">8066</property><property name="managerPort">9066</property><property name="idleTimeout">300000</property><property name="bindIp">0.0.0.0</property><property name="frontWriteQueueSize">4096</property><property name="processors">4</property><property name="charset">utf8</property><property name="txIsolation">2</property><property name="sqlExecuteTimeout">300</property><property name="defaultMaxLimit">100</property><property name="maxPacketSize">104857600</property><property name="sqlInterceptor">io.mycat.server.interceptor.impl.StatisticsSqlInterceptor</property> <property name="sqlInterceptorType">UPDATE,DELETE,INSERT</property><property name="sqlInterceptorFile">/tmp/sql.txt</property></system><user name="mycat_connect" defaultAccount="true"><property name="password">123456</property><property name="schemas">school_db</property></user>重新启动mycatmycat restart验证先清除以往订单mysql -umycat_connect -p -h 192.168.114.129 -P 8066插⼊数据#student表中插⼊数据insert into student(`name`,`class_id`) values('tom',1);insert into student(`name`,`class_id`) values('lily',2);insert into student(`name`,`class_id`) values('jack',4);insert into student(`name`,`class_id`) values('json',3);insert into student(`name`,`class_id`) values('hok',3);insert into student(`name`,`class_id`) values('haolly',3);insert into student(`name`,`class_id`) values('jerry',3);insert into student(`name`,`class_id`) values('wrrol',3);insert into student(`name`,`class_id`) values('brant',2);insert into student(`name`,`class_id`) values('james',4);#stduent_detail 中插⼊数据填写真实的student_idinsert into student_detail(student_id,address) values('','北京');#分别进⼊各个分⽚数据库中查看数据和分⽚对应情况 stduent_db01, stduent_db02, stduent_db03, stduent_db04 select id,mod(class_id,4) from student;select student_id from student_detail;#mycat 关联查询select * from student as a join student_detail b on a.id = b.student_id;。
mycat的分库分表

mycat的分库分表1、什么是分库分表2、分库分表的⼤致分配3、Linux下配置mycat服务器1、什么是分库分表? 在同⼀个系统(项⽬)中,把⼀张数据⽐较多的表拆分到不同的集群节点上, 这种模式叫做分库分表2、分库分表的实现: 使⽤mycat实现分库分表(HDFS:namenode datanode secondarynamdenode) 在整个mycat中也会⽤到namenode和datanode (1)先配置⼀台mycat服务器(192.168.23.164) (2)然后配置两台mysql服务器:mysql01(192.168.23.129)和mysql02(192.168.23.130) 在mysql01服务器下有⼀个teach数据库,在teach下有⼀个student表 在mysql02服务器下有⼀个teach数据库,在teach下有⼀个student表 当使⽤mycat把进⾏存储是,数据会⾃动往mysql01或mysql02中存储.3、配置mycat 3.1 规定Linux的⽤户名和全名不能叫mycat,否则mycat不会⽣效(原因是影响了Linux系统的环境变量) 3.2 vim /etc/sysconfig/network也不能叫mycat 3.3 mycat使⽤的是Java语⾔编写-->所以必须要在Linux上配置jdk (要求jdk是64位,因为mycat是在64位的jdk8 上进⾏编译的) 3.4 配置jdk 3.5 使⽤xftp把mycat的压缩包上传到Linux服务器上(/home/apps/) 3.6 解压mycat压缩包 tar -zxvf xxxx 3.7 配置mycat的环境变量(与jdk的环境变量配置⼀样) 3.8 启动mycat(两种⽅式) (1)进⼊mycat的bin⽬录: ./mycat console(推荐使⽤) 或者在其他的地⽅的⽬录:mycat console (2)./mycat start ⼀旦启动mycat就关不掉,kill -9 进程号也关不掉,除⾮重启或者关机, 据说可以使⽤Ctrl+C 3.9 下⾯就是三个核⼼配置⽂件了(最重要的地⽅): 所有的读写分离/分库分表都必须要在这三个配置⽂件完成 在mycat的conf⽬录下: server.xml:配置了mycat的⽤户 rule.xml:mycat的规则 schema.xml:实现了读写分离和分库分表的具体配置server:<?xml version="1.0" encoding="UTF-8"?><!-- - - Licensed under the Apache License, Version 2.0 (the "License");- you may not use this file except in compliance with the License. - Youmay obtain a copy of the License at - - /licenses/LICENSE-2.0- - Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, - WITHOUTWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See theLicense for the specific language governing permissions and - limitationsunder the License. --><!DOCTYPE mycat:server SYSTEM "server.dtd"><mycat:server xmlns:mycat="http://io.mycat/"><system><property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户--><property name="useHandshakeV10">1</property><property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 --><property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班⼀致性检测、0为关闭 --><property name="sequnceHandlerType">2</property><!--<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>--><!--必须带有MYCATSEQ_或者 mycatseq_进⼊序列匹配流程注意MYCATSEQ_有空格的情况--><property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property><property name="subqueryRelationshipCheck">false</property> <!-- ⼦查询中存在关联查询的情况下,检查关联字段中是否有分⽚字段 .默认 false --><!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议--><!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号--><!-- <property name="processorBufferChunk">40960</property> --><!--<property name="processors">1</property><property name="processorExecutor">32</property>--><!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool --><property name="processorBufferPoolType">0</property><!--默认是65535 64K ⽤于sql解析时最⼤⽂本长度 --><!--<property name="maxStringLiteralLength">65535</property>--><!--<property name="sequnceHandlerType">0</property>--><!--<property name="backSocketNoDelay">1</property>--><!--<property name="frontSocketNoDelay">1</property>--><!--<property name="processorExecutor">16</property>--><!--<property name="serverPort">8066</property> <property name="managerPort">9066</property><property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property><property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> --><!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务⽇志--> <property name="handleDistributedTransactions">0</property><!--off heap for merge/order/group/limit 1开启 0关闭--><property name="useOffHeapForMerge">0</property><!--单位为m--><property name="memoryPageSize">64k</property><!--单位为k--><property name="spillsFileBufferSize">1k</property><property name="useStreamOutput">0</property><!--单位为m--><property name="systemReserveMemorySize">384m</property><!--是否采⽤zookeeper协调切换 --><property name="useZKSwitch">false</property><!-- XA Recovery Log⽇志路径 --><!--<property name="XARecoveryLogBaseDir">./</property>--><!-- XA Recovery Log⽇志名称 --><!--<property name="XARecoveryLogBaseName">tmlog</property>--><!--如果为 true的话严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接--><property name="strictTxIsolation">false</property><property name="useZKSwitch">true</property></system><!--从system标签开始到结束中的内容配置了连接最⼤连接数最⼩连接数连接超时时间隔离机制事务切换....相当于在mybatis中配置数据库的最⼤最⼩连接数连接超时时间--><!-- 全局SQL防⽕墙设置 --><!--⽩名单可以使⽤通配符%或着*--><!--例如<host host="127.0.0.*" user="root"/>--><!--例如<host host="127.0.*" user="root"/>--><!--例如<host host="127.*" user="root"/>--><!--例如<host host="1*7.*" user="root"/>--><!--这些配置情况下对于127.0.0.1都能以root账户登录--><!--<firewall><whitehost><host host="1*7.0.0.*" user="root"/></whitehost><blacklist check="false"></blacklist></firewall>--><!--整个user标签中就是配置了mycat的账号和密码name===》就是mycat的账号defaultAccount====》表⽰该账号为管理员账号,⽽且只能出现⼀次property:属性标签password===》就是name的密码⽆论是账号还是密码都可以随意定制,开⼼就好readOnly:只读(该账号只能查询数据,不能写⼊数据)schemas:指向的是mycat的数据库(mycat的虚拟库这个库并不是真实存在的,是需要通过mysql的数据库进⾏映射的),⼀个mycat中可以有多个schema 隐藏mysql的真实库的名字连接mysql:jdbc:mysql:localhost:3306/数据库名连接mycat:jdbc:mysql:ip地址:端⼝号/mycat的虚拟库名schemas中的配置和mysql的数据库可以⼀样,也可以不⼀样--><user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">TEACH</property></user></mycat:server>rule.xml:<?xml version="1.0" encoding="UTF-8"?><!-- - - Licensed under the Apache License, Version 2.0 (the "License");- you may not use this file except in compliance with the License. - Youmay obtain a copy of the License at - - /licenses/LICENSE-2.0- - Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, - WITHOUTWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See theLicense for the specific language governing permissions and - limitationsunder the License. --><!DOCTYPE mycat:rule SYSTEM "rule.dtd"><mycat:rule xmlns:mycat="http://io.mycat/"><!--所有的规则配置⼀个tableRule对应⼀个function,如果需要进⾏配置必须要配置⼀对,不能单独配置⼀个(如果单独配置了⼀个的情况下,mycat启动的时候会直接报错)⼀共有⼗种规则:homework1:百度把这10种规则全部弄明⽩,然后整理⼀份⽤⾃⼰语⾔描述的电⼦⽂档mod-long:(轮询)mysql01mysql数据库teachstudentmysql02mysql数据库teachstudent当客户端发送请求===插⼊数据===》mycat===请求mysql===》会把第⼀条数据插⼊进mysql01,会把第⼆条数据插⼊进mysql02依次循环--><tableRule name="mod-long"><rule><columns>id</columns><algorithm>mod-long</algorithm></rule></tableRule><function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!--代表了datanode的节点数量如果只有两台datanode就必须要写2--><property name="count">2</property></function></mycat:rule>schema.xml<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"><!--schema标签的name属性值必须要和server.xml中的schames保持⼀致schema就类似于mysql的数据库checkSQLschema:检查SQL语句是否错误(select * from user wher id = 1)默认值为false,不需要改为true,把对SQL语句的检查交给mysql处理sqlMaxLimit:最⼤执⾏SQL语句的数量⼀次性可以执⾏多少条SQL语句在schame标签中有table标签,这个标签就是定义了mycat中的表类似于mysql数据库中的表和mysql中的表名可以重复也可以不⼀致dataNode:数据节点在HDFS中存放数据在mycat中映射的就是真实mysql数据库(可以有多个,也可以只有⼀个),名字可以随意起今天的⽬标是实现分库分表,需要⽤到两台mysql数据库,所以只需要配置dn1和dn2rule:配置规则配置⼀定要和rule.xml中保持⼀致--><schema name="TEACH" checkSQLschema="false" sqlMaxLimit="100"><!-- auto sharding by id (long) --><table name="mycat_student" dataNode="dn1,dn2" rule="mod-long" /></schema><!--datanode标签对应的是table标签中的datanode属性也就是说datanode属性值必须要和dataNode的标签name属性值保值⼀致dn1:代表了mysql01服务器==》mysql数据库dn2:代表了mysql02服务器==》mysql数据库dataHost:才是真正的配置了分库分表和读写分离的核⼼配置database:映射的是真实mysql的数据库名--><dataNode name="dn1" dataHost="localhost1" database="mysql01" /><dataNode name="dn2" dataHost="localhost2" database="mysql02" /><!--dataHost标签必须要和dataNode标签中的dataHost属性保持⼀致如果dataHost属性名重复了,映射的是同⼀个dataHost每⼀个dataHost标签就是⼀个真实的mysql数据库maxCon:最⼤连接数minCon:最⼩连接数homework2:把balance,writeType,switchType弄明⽩,并且⽤⾃⼰的语⾔描述每个值代表什么意思,记录电⼦⽂档 balance:负载均衡writeType:写⼊的类型(读写分离使⽤)switchType:转换的类型(读写分离所使⽤的数据)dbType:数据库的类型(在最早的版本mycat只⽀持mysql⼀种数据库,后来发展⽀持很多种数据库)dbDriver:数据库驱动(使⽤本地驱动,使⽤的是mycat所提供的驱动)slaveThreshold:主从复制时延master:主节点slave:从节点threshold:⼊⼝--><dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><!--heartbeat:⼼跳mycat⼀直在监视mysql的user表(⼼跳),如果⼀旦发现mysql的user不再有⼼跳,就会认为这⼀台mysql处于宕机状态,也就不会再向这⼀台mysql进⾏做增删改查的操作 --><heartbeat>select user()</heartbeat><!--writeHost:标签是该台mysql数据库为读和写的数据库readHost:标签是该台mysql数据库为读的数据库writeHost如果单独存在,标识该台mysql数据库为读和写的操作如果⼀旦和readHost⼀起使⽤,writeHost就只能做些的操作,所有的读操作都使⽤readHost完成readHost必须要配置在writeHost的内容,不允许单独存在host:属性只是标识了该台数据库的操作的内容,可以随意定义url:数据库的urljdbc:mysql://localhost:3306如果配置了两个writeHost,那么host的值就必须不能重复--><writeHost host="write01" url="192.168.23.129:3306" user="root"password="root" /></dataHost><dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="write02" url="192.168.23.130:3306" user="root"password="root" /></dataHost><!--mycat中所映射的真实mysql的表必须要mycat所声明的table的名字保持⼀致也就是说mycat的表名必须要和mysql的表名⼀模⼀样,否则映射不到--></mycat:schema>配置完成:进⼊到Navicat中,先新建连接,分别连接mysql01和mysql02,然后分别在mysql01和mysql02 中分别建⽴两个数据库(库名可以不⼀致),再分别建⽴mycat_student表, 然后建⽴mycat01的连接,(在建⽴连接时,端⼝号为8066,即通讯端⼝号,不能使⽤9066,为管理端⼝号)在mycat01中会有⼀个TEACH数据库,在库中有⼀个mycat_student表, 这是在配置⽂件中的配置⽣效了。
数据库(分库分表)中间件对比

数据库(分库分表)中间件对⽐分区:对业务透明,分区只不过把存放数据的⽂件分成了许多⼩块,例如mysql中的⼀张表对应三个⽂件.MYD,MYI,frm。
根据⼀定的规则把数据⽂件(MYD)和索引⽂件(MYI)进⾏了分割,分区后的表呢,还是⼀张表。
分区可以把表分到不同的硬盘上,但不能分配到不同服务器上。
优点:数据不存在多个副本,不必进⾏数据复制,性能更⾼。
缺点:分区策略必须经过充分考虑,避免多个分区之间的数据存在关联关系,每个分区都是单点,如果某个分区宕机,就会影响到系统的使⽤。
分⽚:对业务透明,在物理实现上分成多个服务器,不同的分⽚在不同服务器上个⼈感觉跟分库没啥区别,只是叫法不⼀样⽽已,值得⼀提的是关系型数据库和nosql数据库分⽚的概念以及处理⽅式是⼀样的吗?请各位看官⾃⾏查找相关资料予以解答分表:当数据量⼤到⼀定程度的时候,都会导致处理性能的不⾜,这个时候就没有办法了,只能进⾏分表处理。
也就是把数据库当中数据根据按照分库原则分到多个数据表当中,这样,就可以把⼤表变成多个⼩表,不同的分表中数据不重复,从⽽提⾼处理效率。
分表也有两种⽅案:1. 同库分表:所有的分表都在⼀个数据库中,由于数据库中表名不能重复,因此需要把数据表名起成不同的名字。
优点:由于都在⼀个数据库中,公共表,不必进⾏复制,处理更简单缺点:由于还在⼀个数据库中,CPU、内存、⽂件IO、⽹络IO等瓶颈还是⽆法解决,只能降低单表中的数据记录数。
表名不⼀致,会导后续的处理复杂(参照mysql meage存储引擎来处理)2. 不同库分表:由于分表在不同的数据库中,这个时候就可以使⽤同样的表名。
优点:CPU、内存、⽂件IO、⽹络IO等瓶颈可以得到有效解决,表名相同,处理起来相对简单缺点:公共表由于在所有的分表都要使⽤,因此要进⾏复制、同步。
⼀些聚合的操作,join,group by,order等难以顺利进⾏分库:分表和分区都是基于同⼀个数据库⾥的数据分离技巧,对数据库性能有⼀定提升,但是随着业务数据量的增加,原来所有的数据都是在⼀个数据库上的,⽹络IO及⽂件IO都集中在⼀个数据库上的,因此CPU、内存、⽂件IO、⽹络IO都可能会成为系统瓶颈。
MySQL之MyCat

MySQL之MyCat Mycat 可以简单概括为⼀个彻底开源的,⾯向企业应⽤开发的⼤数据库集群⽀持事务、ACID、可以替代MySQL的加强版数据库⼀个可以视为MySQL集群的企业级数据库,⽤来替代昂贵的Oracle集群⼀个融合内存缓存技术、NoSQL技术、HDFS⼤数据的新型SQL Server结合传统数据库和新型分布式数据仓库的新⼀代企业级数据库产品⼀个新颖的数据库中间件产品Mycat⼯作原理Mycat的原理中最重要的⼀个动词是"拦截",它拦截了⽤户发送过来的SQL语句,⾸先对SQL语句做了⼀些特定的分析:如分⽚分析、路由分析、读写分离分析、缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给⽤户Mycat应⽤场景Mycat适⽤的场景很丰富,以下是⼏个典型的应⽤场景单纯的读写分离,此时配置最为简单,⽀持读写分离,主从切换分表分库,对于超过1000万的表进⾏分⽚,最⼤⽀持1000亿的单表分⽚多租户应⽤,每个应⽤⼀个库,但应⽤程序只连接Mycat,从⽽不改造程序本⾝,实现多租户化报表系统,借助于Mycat的分表能⼒,处理⼤规模报表的统计替代Hbase,分析⼤数据作为海量数据实时查询的⼀种简单有效⽅案,⽐如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择Mycat长期路线图强化分布式数据库中间件的⽅⾯的功能,使之具备丰富的插件、强⼤的数据库智能优化功能、全⾯的系统监控能⼒、以及⽅便的数据运维⼯具,实现在线数据扩容、迁移等⾼级功能进⼀步挺进⼤数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速的巨表关联、排序、分组聚合等 OLAP⽅向的能⼒,并集成⼀些热门常⽤的实时分析算法,让⼯程师以及DBA们更容易⽤Mycat实现⼀些⾼级数据分析处理功能不断强化Mycat开源社区的技术⽔平,吸引更多的IT技术专家,使得Mycat社区成为中国的Apache,并将Mycat推到Apache基⾦会,成为国内顶尖开源项⽬,最终能够让⼀部分志愿者成为专职的Mycat开发者,荣耀跟实⼒⼀起提升Mycat不适合的应⽤场景设计使⽤Mycat时有⾮分⽚字段查询,请慎重使⽤Mycat,可以考虑放弃!设计使⽤Mycat时有分页排序,请慎重使⽤Mycat,可以考虑放弃!设计使⽤Mycat时如果要进⾏表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使⽤Mycat,可以考虑放弃!设计使⽤Mycat时如果有分布式事务,得先看是否得保证事务得强⼀致性,否则请慎重使⽤Mycat,可以考虑放弃!MyCat的⾼可⽤性:需要注意: 在⽣产环境中, Mycat节点最好使⽤双节点, 即双机热备环境, 防⽌Mycat这⼀层出现单点故障.可以使⽤的⾼可⽤集群⽅式有:Keepalived+Mycat+MysqlKeepalived+LVS+Mycat+MysqlKeepalived+Haproxy+Mycat+Mysqlmycat安装⽬录结构:bin mycat命令,启动、重启、停⽌等catlet catlet为Mycat的⼀个扩展功能conf Mycat 配置信息,重点关注lib Mycat引⽤的jar包,Mycat是java开发的logs ⽇志⽂件,包括Mycat启动的⽇志和运⾏的⽇志version.txt mycat版本说明logs⽬录:wrapper.log mycat启动⽇志mycat.log mycat详细⼯作⽇志Mycat的配置⽂件都在conf⽬录⾥⾯,这⾥介绍⼏个常⽤的⽂件:server.xml Mycat软件本⾝相关的配置⽂件,设置账号、参数等schema.xml Mycat对应的物理数据库和数据库表的配置,读写分离、⾼可⽤、分布式策略定制、节点控制rule.xml Mycat分⽚(分库分表)规则配置⽂件,记录分⽚规则列表、使⽤⽅法等Mycat 主要配置⽂件说明server.xml存放Mycat软件本⾝相关的配置⽂件,⽐如:连接Mycat的⽤户,密码,数据库名称等server.xml⽂件中配置的参数解释说明:参数说明user ⽤户配置节点name 客户端登录MyCAT的⽤户名,也就是客户端⽤来连接Mycat的⽤户名。
在MySQL中如何进行数据分片和水平拆分

在MySQL中如何进行数据分片和水平拆分引言在当今的互联网时代,数据量的增长是不可避免的。
针对大规模数据集的存储和处理,数据分片和水平拆分成为了一种常用的解决方案。
在众多数据库中,MySQL也提供了相关的功能和工具,本文将介绍在MySQL中如何进行数据分片和水平拆分。
一、什么是数据分片和水平拆分数据分片(Sharding)是指将庞大的数据集划分为多个子集,分别存储在不同的数据库节点上。
每个数据库节点负责存储和处理一部分数据,从而实现了数据的分布式存储和查询。
水平拆分(Horizontal Partitioning)则是指按照某个字段或规则对数据进行拆分和分片,使得数据在多个节点上分布均匀。
数据分片和水平拆分的优势在于提升数据库的吞吐量和性能,减轻单个节点的负担,提高系统的可扩展性和稳定性。
二、MySQL中的数据分片技术MySQL提供了多种数据分片的技术和工具,下面将介绍其中的几种常用方法。
1. 哈希分片哈希分片是通过对某个字段进行哈希计算,将数据分配到不同的节点上。
一种常用的哈希函数是MD5,它能够将任意长度的输入转换为固定长度的哈希值。
在分片的过程中,将数据的哈希值与节点的哈希范围进行比较,确定数据所属的节点。
哈希分片的优势在于均衡地分配数据,但无法按照特定的查询条件进行路由。
2. 范围分片范围分片是按照某个字段的范围将数据划分到不同的节点上。
比如按照用户ID的范围进行分片,可以将ID在1-10000的用户数据存储在节点1上,ID在10001-20000的用户数据存储在节点2上,以此类推。
范围分片的优势在于能够按照特定的查询条件进行路由,但可能存在数据不均衡的问题。
3. 列分片列分片是按照某个字段的取值将数据划分到不同的节点上。
比如按照地区将数据进行分片,可以将北京地区的数据存储在节点1上,上海地区的数据存储在节点2上,以此类推。
列分片的优势在于能够按照特定的查询条件进行路由,且更容易实现数据均衡。
mycat 自定义规则

mycat 自定义规则一、Mycat简介Mycat是一款优秀的开源中间件,具有高性能、高可用、高扩展性等特点。
它主要用于解决数据库读写分离、负载均衡和数据分库分表等问题。
Mycat的核心功能是将多个数据库实例整合成一个逻辑数据库,对外提供统一的访问接口。
这对于解决单一数据库实例容量有限、访问缓慢等问题非常有效。
二、自定义规则概述在Mycat中,规则(Rule)是用于定义数据如何在多个数据库之间进行分片和路由的关键。
自定义规则允许用户根据业务需求,灵活配置数据存储和访问策略。
这使得Mycat具备了很强的可定制性和实用性。
三、Mycat规则配置方法1.规则配置文件:在Mycat的配置文件(mycat.properties)中,可以设置默认规则。
例如:```rule.default=0```2.动态配置规则:通过Java代码动态修改规则,例如:```Public static void main(String[] args) {CatContext context = new CatContext();// 修改默认规则context.setRule("0", "modify_rule_0");}```3.创建自定义规则类:继承`com.github.mycat.config.rule.Rule`类,并实现相应的规则逻辑。
例如:```public class MyCustomRule extends Rule {@Overridepublic void execute(CatContext context) {// 自定义规则逻辑}}```4.注册自定义规则:将自定义规则类注册到Mycat的配置文件中,如下:```mycat.rule.classpath=classpath:myCustomRule.class```四、实战案例与应用1.基于规则的数据分库:通过自定义规则,实现按照业务属性(如用户ID、订单ID等)将数据存储到不同的数据库实例中。
mycat分库分表看这一篇就够了

mycat分库分表看这⼀篇就够了之前我们已经讲解过了数据的切分,主要有两种⽅式,分别是垂直切分和⽔平切分,所谓的垂直切分就是将不同的表分布在不同的数据库实例中,⽽⽔平切分指的是将⼀张表的数据按照不同的切分规则切分在不同实例的相同名称的表中。
下⾯先来描述mycat的分库操作,在进⾏分库操作的时候需要注意⼀点:有关联关系的表应该放在⼀个库⾥,相互没有关联关系的表可以分到不同的库中。
数据⽂件--客户表CREATE TABLE customer(id INT AUTO_INCREMENT,NAME VARCHAR(200),PRIMARY KEY(id));--订单表CREATE TABLE orders(id INT AUTO_INCREMENT,order_type INT,customer_id INT,amount DECIMAL(10,2),PRIMARY KEY(id));--订单详细表CREATE TABLE orders_detail(id INT AUTO_INCREMENT,detail VARCHAR(2000),order_id INT,PRIMARY KEY(id));--订单状态字典表CREATE TABLE dict_order_type(id INT AUTO_INCREMENT,order_type VARCHAR(200),PRIMARY KEY(id));1、分库实战在上述的数据⽂件中,我们包含四个不同的表,现在将不同的表分布在不同的库中,但是访问的时候使⽤的是同⼀个mycat的终端,这些操作其实很简单,都是由mycat来完成的,我们需要做的事情就是修改⼏个简单的配置即可。
1、修改schema.xml⽂件<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"><table name = "customer" dataNode="dn2"></table></schema><dataNode name="dn1" dataHost="host1" database="orders" /><dataNode name="dn2" dataHost="host2" database="orders"/><dataHost name="host1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="192.168.85.111:3306" user="root"password="123456"></writeHost></dataHost><dataHost name="host2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat><writeHost host="hostM2" url="192.168.85.113:3306" user="root" password="123456"></writeHost></dataHost></mycat:schema>mysql -uroot -p123456 -h 192.168.85.111 -P80664、插⼊sql语句执⾏上述的建表语句,会发现,customer在node03上,⽽其他的表在node01上,此时完成了分库的功能。
Mycat(水平拆分——分表取模,mycat的分片join,全局表)

Mycat(⽔平拆分——分表取模,mycat的分⽚join,全局表)相对于垂直拆分,⽔平拆分不是将表做分类,⽽是按照某个字段的某种规则来分散到多个库中。
每个表中包含⼀部分数据。
简单来说,我们可以将数据的⽔平切分理解为是按照数据⾏的切分,就是将表中的某些⾏切分到⼀个数据库,⽽别的某些⾏⼜切分到其他的数据库中。
配置分表取模1.选择要拆分的表Mysql单表存储数据条数是有瓶颈的,单表达到1000万条数据时就达到了瓶颈,会影响查询效率,需要进⾏⽔平拆分(分表)进⾏优化。
列如:当orders 和 orders_detail都达到600万⾏数据,需要进⾏分表优化。
2.分表字段以orders 表为列,可以根据不同字段进⾏分表编号分表字段效果1id(主键、或创建时间)查询订单注重时效,历史订单被查询的次数少,如此会形成⼀个节点访问多,⼀个节点访问少。
2customer_id(客户id)根据客户id去分,两个节点访问平均,⼀个客户的所有订单都在同⼀个节点。
3.修改配置⽂件schema.xml#为orders 表设置数据节点dn1,dn2,并指定分⽚规则mod_rule(⾃定义的名字)<table name="orders" dataNode="dn1,dn2" rule="mod_rule"></table>4.修改配置⽂件rule.xml#在rule 配置⽂件⾥⾯新增分⽚规则mod_rule,并指定规则适⽤字段为customer_id#还有选择分⽚算法mod-long(对字段取模运算),customer_id对两个节点取模,根据结果分⽚#配置算法mod-long参数count为2,两个节点<tableRule name="mod_rule"><rule><columns>customer_id</columns><algorithm>mod-long</algorithm></rule></tableRule>往下找到算法的具体实现5.在数据节点dn2上建orders表6.重启mycat。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Mycat 分表规则
什么是 Mycat
Mycat是一个开源的MySQL代理服务器,用于将数据库的访问请求进行分片、分流
和负载均衡,能够提高数据库的性能和可靠性。
在大型互联网公司中广泛使用,可以支持海量数据的存储和查询。
分表的必要性
随着应用数据量的增加,单一表的数据行也会呈现爆满的趋势,这会导致查询性能的下降。
而且,当数据规模达到一定级别时,单一数据库可能无法存储全部数据。
因此,需要通过分表的方式来解决这些问题。
Mycat 分表规则
Mycat提供了多种分表规则,可以根据实际需求选择适合的规则。
下面介绍几种常
用的分表规则。
1. 哈希分表
哈希分表是将数据根据某个属性的哈希值进行分片的方式。
通过选择合适的哈希函数,可以将数据均匀地分布到不同的表中,以实现负载均衡。
通过哈希分表,可以确保相同属性值的数据存放在同一个表中,从而提高查询效率。
但是,哈希分表不支持跨表的查询操作,这需要在应用程序中进行处理。
2. 范围分表
范围分表是根据数据的某个属性的范围进行分片的方式。
可以按照属性值的大小将数据划分到不同的表中。
范围分表支持跨表的查询操作,因为不同的数据可能存储在不同的表中。
但是,范围分表需要提前确定好分表的范围,一旦范围变化,需要重新进行数据迁移。
3. 列表分表
列表分表是根据数据的某个属性的列表进行分片的方式。
可以根据预先定义的列表将数据划分到不同的表中。
列表分表也支持跨表的查询操作,但是需要事先定义好列表。
列表的变更需要进行数据迁移,并且如果列表过长,可能会导致分表数目过多,不利于负载均衡。
4. 轮询分表
轮询分表是将数据按照顺序依次存放到不同的表中,类似于循环队列的方式。
每次插入数据时,选择当前轮到的表进行插入。
轮询分表的好处是简单、高效,不需要额外的哈希函数或列表定义。
但是,轮询分表不支持跨表的查询操作。
Mycat 分表的实现
Mycat提供了灵活的配置选项,可以根据不同的分表规则进行配置。
下面介绍如何通过Mycat实现分表。
1.在Mycat的配置文件中,指定需要分表的表名和字段名。
2.根据选择的分表规则,在配置文件中进行相应的配置。
可以选择哈希分表、
范围分表、列表分表或轮询分表。
3.配置分表的具体参数,例如哈希函数、分表范围、列表等。
4.在应用程序中,使用Mycat提供的连接方式连接到Mycat服务器,执行SQL
语句,Mycat会根据配置的规则将查询请求路由到正确的分表。
Mycat 分表的优缺点
使用Mycat进行分表可以提高数据库的性能和扩展性,但是也存在一些优缺点。
优点
•提高查询性能:将数据分散到不同的表中,减少单一表的数据量,从而提高查询效率。
•支持海量数据存储:通过分表的方式,可以将数据分布在不同的物理存储介质上,支持海量数据存储。
•实现负载均衡:通过合适的分表规则,可以将数据均匀地分布到不同的表中,实现负载均衡。
缺点
•跨表查询的复杂性:某些分表规则可能无法支持跨表的查询操作,需要在应用程序中进行处理。
•分表范围变更的复杂性:如果需要更改分表的范围或列表,需要进行数据迁移,较为繁琐。
•配置复杂性:Mycat的配置相对复杂,需要仔细配置分表的规则和参数,容易出错。
实际应用案例
Mycat已经在许多大型互联网公司中得到了应用,并取得了显著的效果。
下面以某
电商公司为例,介绍Mycat分表的实际应用案例。
某电商公司的订单表数据量巨大,单一表无法满足需求。
通过使用Mycat进行分表,根据用户ID进行哈希分表,将订单分散到不同的子表中。
同时,该电商公司充分利用了Mycat的负载均衡功能,将读写请求均匀分布到不同的数据库服务器上。
通过合理配置分表和负载均衡,提高了订单的查询速度和系统的整体性能。
总结
Mycat是一个强大的MySQL代理服务器,可以通过分表的方式提高数据库的性能和
可靠性。
通过选择合适的分表规则和配置参数,可以实现数据的分片、分流和负载均衡。
尽管Mycat的配置相对复杂,但是在处理大规模数据和高并发访问时,Mycat的优势得到了充分的体现。