Mycat中的基本定义:
逻辑性库 schema
逻辑性表(虚似表) table
能够是数据信息分割后,遍布在一个或好几个分块库(真正库)中,还可以不做数据分割,不分块,只有一个表组成。
分块表
指这些原来的非常大数据信息的表,必须分割到好几个数据库查询的表,那样,每一个分块都是有一部分数据信息,全部分块组成了详细的数据信息。
非分块表
指信息量并不是非常大的逻辑性表,不用将数据信息分割到好几个真正表,只放到一个真正的表就可以
比如 Mycat有一个逻辑性表A,相匹配3个连接点库,每一个库都是有表A,逻辑性表A的全部数据信息按一定优化算法各自存有3个连接点库的真正表A中。这一逻辑性表便是分块表
<table node="t_node" dataNote="d1,d2,d3" rule="rule1" /> dataNode(数据信息连接点)有3个,那麼t_node表便是分块表
<table node="t_node" dataNote="d1" rule="rule1" />
这时t_node就是是非非分块表
ER 表
ER表这一定义和分块中的关联查询相关。我们知道在分块的状况下,有关联方交易的2个表的数据信息假如在不一样连接点中,那麼开展关联查询会出现很大的特性难题。为了更好地处理这个问题,明确提出了根据 E-R关联的数据信息分块对策,子表的纪录与所关系的父表纪录储放在同一个数据信息分块(同连接点的同一个库文件),即子表取决于父表,根据表排序(Table Group)确保数据 Join 不容易跨库实际操作。而表排序(Table Group)是处理跨分块数据信息 join的一种非常好的构思,也是数据信息分割整体规划的关键一条标准。表排序含意便是将关联查询的表们放到同一分块中防止跨分块开展关联查询。ER表的完成方法能够根据在<table>标识中嵌入<childTable>标识的方法完成。
事例:
create table product(
id int unsigned primary key auto_increment,
name varchar(255),
price decimal(10,2),
type_id int # 产品分类种类
)engine=innodb;
create table type(
id int unsigned primary key auto_increment,
type_name varchar(255)
)engine=innodb;
schema.xml
<table name="type" primaryKey="id" dataNode="dn4,dn5,dn6" rule="mod-long">
<childTable name="product" primaryKey="id" joinKey="type_id" parentKey="id"></childTable>
</table>
这儿type是父表,product是字表,因此 <table>和<childTable>中的name属性別写反了。
type应用牙模型优化算法分割,product表不用特定优化算法,由于product会随type的分割而分割。joinKey是product表格中的关系字段名,parentKey是父表type中相匹配product的关系字段名,即type中的id字段名,这儿不必写出type_id。
全局性表 type="global"
全局性表有下列特性:
变化不经常;
信息量整体转变 并不大;
数据信息经营规模并不大,非常少有超出数十万条纪录。
<table name="t_node" primaryKey="vid" autoIncrement="true" dataNode="dn1,dn2,dn3" />
<table>标识中带有type="global"特性的逻辑性表便是全局性表,对这种表,假如特定dataNote="dn1,dn2,d3",那麼t_node这一逻辑性表的数据信息会在这里3个连接点中沉余存有,也便说逻辑性表t_node有10条数据信息,则dn1~3的三个t_node表都是会有10条数据信息,而不象分块表那般每一个连接点中只包括t_node的一部分数据信息。
那样设计方案的缘故是处理分块表和全局性表的关联查询难题,为了更好地便捷分块表和全局性表的关联查询,干脆让全局性表在每一个连接点储存一份,根据缓存溢出防止跨分块join。
而这一也是一种MySQL分布式系统的构架构思。
分块连接点 dataNode
一个逻辑性表的数据信息分割后,一个大表被分得不一样的分块数据库查询上边,每一个表分块所属的数据库查询便是分块连接点。
因此 分块连接点是(真正)库,而不是表换句话说是服务器。
连接点服务器 dataHost
数据信息分割后,每一个分块连接点(dataNode)不一定都是会独享一台设备,同一设备上边能够有好几个分块数据库查询,
那样一个或好几个分块连接点(dataNode)所属的设备便是连接点服务器(dataHost),为了更好地避开单连接点服务器并发数限定,
尽可能将读写能力工作压力高的分块连接点(dataNode)平衡的放到不一样的连接点服务器(dataHost)。
全局性系列号 sequence
数据信息分割后,原来的关系型数据库中的主键管束在分布式系统标准下将没法应用,因而必须引进外界体制确保数据
唯一性标志,这类确保全面性的数据信息唯一标志的体制便是全局性系列号(sequence)
多租户
是一种软件体系结构技术性,它是在讨论与完成怎样于多客户的自然环境下同用同样的系统软件或程序流程部件,而且仍可保证各客户间数据信息的防护性。
多租户在数据储存上存有三种关键的计划方案,分别是:
A.单独数据库查询
它是第一种计划方案,即一个租赁户一个数据库查询B.共享资源数据库查询,防护数据架构
即好几个或全部租赁户共享资源一个Database(真正库),可是每一个租赁户一个 Schema(逻辑性库)
比如:
有3个客户u1~3,她们选购了阿里云数据库,每一个客户都可以应用mysql -hxxx -uroot -p的方法让她们觉得自身是在用mysql数据库查询服务项目。那麼假如应用mycat完成单Database多Schema得话。能够以下配备:
# schema.xml
<schema name="schema1" dataNode="dn1"></schema>
<schema name="schema2" dataNode="dn1"></schema>
<schema name="schema3" dataNode="dn1"></schema>
<dataNode name="dn1" dataHost="h1" database="db1" />
<dataHost name="h1" dbType="mysql" dbDriver="native">
<writeHost host="hostM1" url="localhost:3306" user="root" password="xxxxx">
</writeHost>
<readHost host="hostM1" url="localhost:3306" user="root" password="xxxxx"></readHost>
</dataHost>
server.xml
<user name="u1">
<property name="password">xxxxx</property>
<property name="schemas">schema1</property>
</user>
<user name="u2">
<property name="password">xxxxx</property>
<property name="schemas">schema2</property>
</user>
<user name="u3">
<property name="password">xxxxx</property>
<property name="schemas">schema3</property>
</user>
如今u1~3这三个客户应用schema1~3这3个逻辑性库,而这3个逻辑性库事实上偏向的是dn1这一分块连接点,也就是偏向localhost这台服务器的db1这一真正库。她们能够在自身的逻辑性库建立随意的表,但事实上3个客户的全部表都建在db1这一一个库文件。
C.共享资源数据库查询,共享资源数据架构
即租赁户共享资源同一个 Database、同一个 Schema,但在表格中根据 TenantID 区别租赁户的数据信息。能够了解为,好几个客户同用一个schema,每一个客户应用不一样的表,根据在表名标明客户作为前缀开展区别什么表是哪个客户的。
它是共享资源水平最大、隔离级别最少的方式。
==========================================
schema.xml/server.xml/rule.xml的标识和特性详细介绍
schema.xml
1.schema 标识(逻辑性库标识)
schema 标识用以界定 MyCat 案例中的逻辑性库,MyCat 能够有好几个逻辑性库(虚似库),每一个逻辑性库都是有自身的有关配
置。能够应用 schema 标识来区划这种不一样的逻辑性库。
如果不配备 schema 标识,全部的表配备,会归属于同一个默认设置的逻辑性库。
必须对于不一样的逻辑性库特定不一样的客户(在server.xml中),仅有相对的客户才能够应用其特定的虚似库,不然查看和载入的时候会出错。以下:
<user name="test">
<property name="password">123456</property>
<property name="schemas">TESTDB,shop</property>
</user>
用分号分隔能够特定客户可以应用好几个库。
1.1 schema 标识的有关特性
A. dataNode:该特性用以关联逻辑性库到某一实际的 database(分块连接点) 上
下边举例子:
倘若<dataNode>标识中界定了dn1,dn2,dn3这3个连接点库
例1:
schema界定以下
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"></schema>
<schema>标识内,沒有特定一切<table>,表明对USERDB的全部表的删改改,都是会在dn2这一连接点开展,不容易在dn1和dn3开展。
例2:
schema界定以下
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
<table name="tuser" dataNode=”dn1,d2,d3”/>
</schema>
表明USERDB的tuser表有分块载入dn1~3这3个连接点库。而USERDB的别的表只有载入dn2这一连接点库。
B. checkSQLschema
当该值设定为 true 时,如果我们实行句子select * from TESTDB.travelrecord;则 MyCat 会把句子改动为select * from travelrecord;。即把表明schema的标识符除掉,防止发送至后端开发数据库查询实行日报(ERROR1146 (42S02): Table ‘testdb.travelrecord’ doesn’t exist)。
实际上,最好是在写sql语句的情况下没有库名。那样设不设定checkSQLschema特性也不危害。
C. sqlMaxLimit
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
</schema>
sqlMaxLimit="100" 表明USERDB下的表在查看的时候会全自动再加上 limit 100;
2.table 标识(逻辑性表标识)
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" ></table>
Table 标识界定了 MyCat 中的逻辑性表,全部必须分拆的表都必须在这个标识中界定。
2.1 特性
name :表名
dataNode:界定这一逻辑性表所能够分块到的 dataNode连接点库假如需
要界定的 dn 太多 能够应用以下的方式降低配备:
<table name="travelrecord" dataNode="multipleDn$0-99,multipleDn2$100-199" rule="auto-sharding-long" ></table>
<dataNode name="multipleDn$0-99" dataHost="localhost1" database="db$0-99" ></dataNode>
<dataNode name="multipleDn2$100-199" dataHost="localhost1" database=" db$100-199" ></dataNode>
rule:用以特定逻辑性表要应用的系统分区标准,标准姓名在 rule.xml 中界定
ruleRequired :是不是关联分块标准
primaryKey: 标明该逻辑性表相匹配真正表的主键
何时要标明primaryKey呢?
当分块的字段名并不是主键字段名的情况下。这时候假如应用主键在虚似表开展查看,便会查全部的分块,高效率便会很低。
假如应用该特性配备真正表的主键。那麼MyCat会缓存文件主键与实际 分块连接点的信息内容,换句话说,用主键做为标准来查看便会立即寻找这一系统分区去查而不容易全部系统分区都查一次。
type:用以特定逻辑性表是否全局性表
type="global" 是全局性表
不特定type则并不是全局性表
autoIncrement:
特定这一表有应用自提高主键,那样 mycat 才会不抛出去分块键找不着的出现异常。
needAddLimit:
等同于sqlMaxLimit
3. dataNode 标识 (分块连接点标识)
<dataNode name="dn1" dataHost="lch3307" database="db1" ></dataNode>
dataNode 标识界定了 MyCat 中的分块连接点
事例中所表述的意思为:应用姓名为 lch3307 数据库实例上的 db1 物理学数据库查询,这就构成一个数据信息分块,最终,大家应用姓名 dn1 标志这一分块。
特性就仅有 dataHost/database/name三个特性
4.dataHost 标识(连接点服务器标识)
立即界定了实际的数据库实例、读写分离配备和心率句子
name特性 略
maxCon
每一个读写能力案例数据库连接池的较大 联接。
换句话说,标识内嵌入的writeHost、readHost标识都是会应用这一特性的值来实例化出数据库连接池的最大连接数。
minCon
读写能力案例数据库连接池的最少联接
balance
负载均衡种类,现阶段的赋值有 3 种:
1. balance="0", 不打开读写分离体制,全部读实际操作都发送至当今能用的 writeHost 上。
2. balance="1",所有的 readHost 与 stand by writeHost 参加 select 句子的负载均衡,简易的说,当双
主双从方式(M1->S1,M2->S2,而且 M1 与 M2 互为主导备),一切正常状况下,M2,S1,S2 都参加 select 句子的负荷
平衡而M1不可以读。
3. balance="2",全部读实际操作都任意的在 writeHost、readhost 上派发。
4. balance="3",全部读要求任意的派发到 wiriterHost 相匹配的 readhost 实行,writerHost 不压力读工作压力,
留意 balance=3 只在 1.4 以及之后版本号有,1.3 沒有
balance=0 是M1可写应写;balance=1 是M1不能读应写
writeType=0是Slave可读不能写
writeType
负载均衡种类,现阶段的赋值有 3 种:
1. writeType="0", 全部写实际操作发送至配备的第一个 writeHost,第一个挂掉切出还存活的第二个 writeHost,
重启后已转换后的为标准,转换纪录在环境变量中:dnindex.properties
2. writeType="1",全部写实际操作都任意的发送至配备的 writeHost,1.5 之后废料不强烈推荐。
switchType
-1 表明不全自动转换
1 初始值,全自动转换
2 根据 MySQL 主从关系同歩的情况决策是不是转换
心率句子为 show slave status
3 根据 MySQL galary cluster 的转换体制(合适群集)(1.4.1)
心率句子为 show status like ‘wsrep%’
这儿转换的意思是,
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
</writeHost>
<writeHost host="hostS1" url="192.168.244.146:3306" user="root"
password="123456" />
<writeHost host="hostS2" url="192.168.244.144:3306" user="root"
password="123456" />
</dataHost>
假如第一个主连接点<writeHost>挂了以后,第二个<writeHost>,也就是以连接点,是不是会全自动转换为主导连接点来开展写实际操作。
这儿设定为switchType="-1",代表着当主挂了的情况下,不开展全自动转换,即hostS1和hostS2并不会被提高为主导,仍只出示读的作用。这就防止了将数据信息写进slave的概率
dbType
特定后端开发联接的数据库类型,适用mysql,mongodb,oracle,spark
dbDriver
特定联接后端开发数据库查询应用的 Driver,现阶段可选择的值有 native 和 JDBC。应用 native 得话,由于这一值实行的是二进制的 mysql 协议书,因此 能够应用 mysql 和 maridb。其他类型的数据库查询则必须应用 JDBC 驱动器来适用。
5.heartbeat 标识
该标识用以特定查验mycat和mysql服务项目是不是还维持联接的句子
比如,MYSQL 能够应用 select user(),Oracle 能够应用 select 1 from dual 等。
在开展主从复制的情况下,要用show slave status做为心率句子而不能用select user()
6.writeHost 标识、readHost 标识
这两个标识都特定后端开发数据库查询的有关配备给 mycat,用以实例化后端开发数据库连接池。唯一不一样的是,writeHost 特定写案例、readHost特定读案例,组成这种读写能力案例来考虑系统软件的规定。
一般来说,readHost会做为子标识嵌入在writeHost标识内表明该读连接点是同于该写连接点的。
在一个 dataHost 内能够界定好几个 writeHost 和 readHost。可是,假如 writeHost 特定的后端开发数据库查询服务器宕机,
那麼这一 writeHost 关联的全部 readHost 都将不能用。另一方面,因为这一 writeHost 服务器宕机系统软件会全自动的检验
到,并转换到预留的 writeHost 上来。
这两个标识的特性同样。
host 特性
自定的服务器名字 一般 writeHost 大家应用*M1,readHost 大家用*S1。
url 特性
特定服务器的IP地址。如果是应用 native 的 dbDriver,则一般为address:port 这类方式。
user 特性/password 特性
应用哪一个客户和登录密码MySQL服务项目,这儿的客户是mysql的客户并非mycat的客户。
这儿的user客户和password务必历经MySQL服务项目的受权才能够应用
weight 特性
权重值 配备在 readhost 中做为读连接点的权重值
server.xml
user 标识
用以界定mycat的客户和管理权限。该标识的功效便是特定客户能够实际操作什么schema。假如你只在schemas.xml中界定了schema,可是沒有在server.xml中界定实际操作该schema的客户,那麼你也就没法对该schema实际操作。
<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
<property name="benchmark">11111</property>
<property name="usingDecrypt">1</property>
<privileges check="false">
<schema name="TESTDB" dml="0010" showTables="custome/mysql">
<table name="tbl_user" dml="0110"></table>
<table name="tbl_dynamic" dml="1111"></table>
</schema>
</privileges>
</user>
name特性 特定mycat的登录名
property标识则是实际申明的特性值
password 特定登陆密码
schemas 特定该客户能浏览的逻辑性库,在 mysql 手机客户端来看则是没法应用 use 转换到别的的数据库查询。能用分号分隔来特定好几个该客户可浏览的schemas
readOnly 为 true 或 false 来限定客户是不是仅仅可写的;
privileges 子连接点
是user标识的子标识。
对客户的 schema 及 下属的 table 开展精细化管理的 DML(增删) 权限管理。
check 特性是用
于标志是不是打开 DML 管理权限查验, 默认设置 false 标志不查验,自然 privileges 连接点不配备,等同于 check=false
Mycat 一个<user>的 schemas 特性可配备好几个 schema 如:
<property name="schemas">TESTDB,DB1,DB2</property>
因此 <privileges> 的子标识 <schema> 一样可配备好几个,对多库多表开展粗粒度的 DML 权限管理
比如:
<user name="zhuam">
<property name="password">111111</property>
<property name="schemas">TESTDB,TESTDB1</property>
<!-- 表级管理权限: Table 级的 dml(curd)操纵,未设定的 Table 承继 schema 的 dml -->
<!-- TODO: 非 CURD SQL 句子, 全透明传送至后端开发 -->
<privileges check="true">
<schema name="TESTDB" dml="0110" >
<table name="table01" dml="0111"></table>
<table name="table02" dml="1111"></table>
</schema>
<schema name="TESTDB1" dml="0110">
<table name="table03" dml="1110"></table>
<table name="table04" dml="1010"></table>
</schema>
</privileges>
</user>
因为<property name="schemas">TESTDB,TESTDB1</property>特定了两个schema
因此 <privileges>下还可以有两个<schema>标识,特定对这两个schema的管理权限
<schema name="TESTDB" dml="0110" > 表明客户zhuam对TESTDB这一逻辑性库的管理权限是不能插进,可改,可查看,不能删掉
0110 相匹配 curd (create,update,read,delete)
system 标识
这一标识内嵌入的全部 property 标识都和系统设置相关
charset 特性
<system> <property name="charset">utf8</property> </system>
===========================================
Mycat的分块方法
在数据信息分割解决中,尤其是水准分割中,分布式数据库最重要的2个处理方式便是数据信息的分割、数据信息的汇聚。挑选适合的分割标准,尤为重要,因为它决策了事后数据信息汇聚的难度系数水平,乃至能够防止跨库的数据信息汇聚解决。
方法1:全局性表
不用对数据信息开展分块,只需在全部的分块上储存一份数据信息的表便是全局性。应用全局性表的这类构架方法能够根据缓存溢出到全部连接点保证同分块内开展多表联查,防止了跨分块join。
方法2:ER分块
假如子表和父表是一对一的关联方交易,并且信息量非常大(必须分块)。
将子表的纪录和所关系的父表纪录储放到同一个数据信息分块上的方法便是ER分块。益处是,能够防止跨分块join。这时要以关系字段名为分块字段名。
比如 客户表和客户详细信息表/订单信息表和订单明细表
order与order_detial 关系字段名order_id
schema.xml
<table name="order" dataNode="dn$1-10" rule="mod-long">
<childTable name="order_detial" primaryKey="id" parentKey="id" joinKey="order_id"></childTable>
</table>
上边表明,对order表水准分表到10个连接点,选用牙模型优化算法。
<childTable>标识专业用以界定ER分块的子表,用了该标识就表明应用ER分块,并与父表order关系。joinKey和parentKey是特定关系id(joinKey是子表的关系字段名,parentKey是父表的关系字段名,一般便是父表的id)
自然,一对多的状况还可以那样做,A表为主导表,B表为子表,A放进10个分块中,将B中关系字段名和A主键同样的数据信息放进同一个分块中。配备也是和上边是一样的。
方法3:多对多关系
状况如: 表1 — 关系表 — 表2
这类状况下的分块会非常复杂,必须从业务流程视角来整体规划。
关系表更偏重哪一个表,即“A 的关联”還是“B的关联”,来决策关系表追随那一个方位储存
比如 文章内容表 — 关系表 — 标识表,文章内容表标识表多对多关联。
做3个分块,这时文章内容表水准区划数据信息到3个分块,关系表按和文章内容表一对多的关联将关系表中aritcle_id和文章内容表id同样的放同一个系统分区,标识表则看情况,假如标识表信息量少,就每一个分块都放一份作为全局性表,那样能够极致防止跨分块关联查询。假如标识表信息量多且常常变化就只有独立开一个分块或是挑选文章内容表的在其中一个分块(查看的数最多的一个分块)来放标识表。
这时是以文章内容表为核心的,换句话说常常根据查文章内容表联查标识表。如果是以标识表为核心就将上边的配备相反,标识表放好几个分块。
但是一般来说,文章内容的信息量全是比标识要多很多的,主要是以文章内容为核心。
方法4:主键分块 和 非主键分块
如果你没有人一切字段名能够做为分块字段名的情况下,主键分块便是唯一挑选,其优势是依照主键的查看更快,当选用全自动提高的系列号做为主键时,还能较为匀称的将数据信息分块在不一样的连接点上。
若有某一适合的业务流程字段名较为适合做为分块字段名,则提议选用此业务流程字段名分块,挑选分块字段名的标准以下:
尽量的较为分布均匀数据信息到每个连接点上;
该业务流程字段名是最经常的或是最重要的查询条件。
普遍的除开主键以外的别的很有可能分块字段名有“订单信息建立時间”、“店面类型”或“所属省”等。如果你寻找某一适合的业务流程字段名做为分块字段名之后,无须担心于“放弃了按主键查看纪录的特性”,由于在这类状况下,
MyCAT出示了“主键到分块”的运行内存缓存文件体制,网络热点数据信息依照主键查看,分毫不损害特性。
下边是是非非主键分块,在父节点的primaryKey上特定非主键的分块字段名为逻辑性表的主键。
<table name="t_user" primaryKey="user_id" dataNode="dn$1-32" rule="mod-long">
<childTable name="t_user_detail" primaryKey="id" joinKey="user_id" parentKey="user_id" />
</table>
Mycat普遍的分块标准
便是大家说的系统分区标准,纪录分块标准的配备是rule.xml
<tableRule>标识用以界定一种优化算法
name特性界定优化算法名字
<columns>子标识 特定按哪个字段系统分区
<algorithm>子标识 特定应用哪些分块涵数,分块涵数必须用<function>界定
<function>标识 用以界定分块涵数
name特性 分块涵数名
clas特性 特定该分块涵数应用的是java源代码中的那一个类
<property>子标识 特定<function>的一些特性,在其中:
mapFile特性 特定该优化算法的实际分法的标志环境变量名字,该文件必须客户亲自建立和改动。自然,有一些优化算法不用特定mapFile文档。比如mod-log牙模型优化算法,他只需在<property>中特定共有多少个分割表就可以。
别的特性会因为不一样优化算法而异。
1.分块枚举类型 sharding-by-intfile (即大家常说的list系统分区)
该系统分区方法类似依照归类种类开展系统分区,比如按归类id分,按省份分这些。配备方法以下:
<tableRule name="sharding-by-intfile">
<rule>
<columns>tid</columns> # 特定tid,即我自定的数据分析表中的归类id做为系统分区字段名
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="type">0</property> # type为0表明tid这一字段名种类是整形;不以0则表明tid并不是整形
<property name="defaultNode">0</property> # defaultNode为0表明特定默认设置连接点是第一个连接点;默认设置连接点的功效是当有不认识的tid的值,那麼这条数据信息机遇插进到默认设置连接点。如果不特定tid又插进不认识的tid的值便会出错。
</function>
partition-hash-int.txt 的文档配备的书写:
1=0
2=1
3=2
4=3
表明tid为1的数据信息载入第一个连接点,tid为2的数据信息载入第二个连接点…
如果有tid为5的数据信息,那麼这就是不认识的tid,如果不设定默认设置连接点便会出错
2.范畴承诺 auto-sharding-long (即大家常说的range系统分区)
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns> #表明依照id字段名开展系统分区
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<function name="rang-long"
class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
autopartition-long.txt:
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
表明id在0到五百万的纪录会放到连接点1,五百万到1000万的数据信息放进连接点2,1000万到1500万的数据信息放进连接点3
超出1500万便会出错
3.牙模型优化算法 mod-long (即大家常说的hash系统分区)
<tableRule name="mod-long">
<rule>
<columns>id</columns> # 依据id字段名系统分区
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property> # 特定仅有3个分区表,按3这一数对id开展开展牙模型
</function>
此类在批量插入时很有可能存有批量插入单事务管理插进多数据信息分块,扩大事务管理一致性难度系数。
4.按日期(天)分块 sharding-by-date
<tableRule name="sharding-by-date">
<rule>
<columns>createTime</columns> # 按createTime字段名系统分区,createTime字段名务必是datetime种类,不可以是int类型
<algorithm>partbyday</algorithm>
</rule>
</tableRule>
<function name="partbyday"
class="io.mycat.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sNaturalDay">0</property>
<property name="sBeginDate">2014-01-01</property>
<property name="sEndDate">2014-01-31</property>
<property name="sPartionDay">10</property>
</function>
配备表明:
columns :标志即将分块的表字段
algorithm :分块涵数dateFormat :日期文件格式
sBeginDate :逐渐日期
sEndDate:完毕日期
sPartionDay :系统分区日数,即默认设置从开始日期算起,隔开 10 天一个系统分区
假如配备了 sEndDate 则意味着数据信息做到了这一日期的分块之后循环系统从开始分块插进。
5.牙模型范畴管束 sharding-by-pattern
此类标准是取模运算与范畴管束的融合,关键为了更好地事后数据备份转移做准备,即能够独立决策牙模型后数据信息的连接点遍布。
<tableRule name="sharding-by-pattern">
<rule>
<columns>user_id</columns>
<algorithm>sharding-by-pattern</algorithm>
</rule>
</tableRule>
<function name="sharding-by-pattern" class="io.mycat.route.function.PartitionByPattern"
<property name="patternValue">256</property> # 表明256是被除数 id%6
<property name="defaultNode">2</property> # 默认设置连接点,假如配备了默认设置,则不容易依照求模运算
<property name="mapFile">partition-pattern.txt</property>
</function>
partition-pattern.txt
1-32=0
33-64=1
65-96=2
97-128=3
129-160=4
161-192=5
193-224=6
225-256=7
0-0=7
表明id%6获得的模在1-32的数据信息会插进连接点1,依此类推。
大量的分块优化算法能够参照mycat的官方网文本文档。
===========================================
Mycat中的读写分离:
读写分离都离不了主从复制,开展主从复制以后,服务器点开展写实际操作,从连接点开展读实际操作。
Mycat不容易开展主从复制,同歩的工作中必须在mysql中完成,mycat则承担配备读写分离。
读写分离的配备以下:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
<readHost host="hostS1" url="localhost2:3306" user="root" password="123456"
weight="1" />
</writeHost>
</dataHost>
上边配备了一个主连接点hostM1,一个从连接点hostS1,2个连接点在不一样服务器。
标识具备嵌入嵌入关联的<writeHost>和<readHost>表明是同歩关联的2个连接点。<readHost>嵌入在<writeHost>中则当写连接点挂了了,读连接点也不能用。
关键环节以下:
a.balance要设成1,即打开读写分离,为0则读和写都是会在<writeHost>完成
b.写连接点得用<writeHost>标识,从连接点得用<readHost>标识
或是
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
</writeHost>
<writeHost host="hostS1" url="localhost:3307" user="root" password="123456">
</writeHost>
</dataHost>
这一段配备主连接点和从连接点全是用writeHost标识。
有关主从关系廷时转换
我们知道主连接点同歩到从连接点会出现廷时,假如廷时过长,从连接点载入的数据信息是老数据信息。
这时我们可以不从连接点读,只是从写连接点读。
只需在<dataHost>中应用switchType="2"和slaveThreshold="100",而且<heartbeat>中界定心率句子为:show slave status。
Mycat 心率体制根据检验 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running",
"Slave_SQL_Running" 三个字段来明确当今主从关系同歩的情况及其 Seconds_Behind_Master 主从复制延迟,
当 Seconds_Behind_Master>slaveThreshold 时便会从主连接点载入。