Mysql升阶之Mycat正中间件(二) mycat的标识详细说

摘要:逻辑性表(虚似表) table能够是数据信息分割后,遍布在一个或好几个分块库(真正库)中,还可以不做数据信息分割,分不清片,仅有一个表组成。分块表指这些原来的非常大数据信...

逻辑性表(虚似表) 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 标识

这2个标识都特定后端开发数据信息库的有关配备给 mycat,用以案例化后端开发联接池。唯一不一样的是,writeHost 特定写实性例、readHost特定读案例,组成这种读写能力案例来考虑系统软件的规定。

一般来讲,readHost会做为子标识嵌套循环在writeHost标识内表明该读连接点是同于该写连接点的。

在一个 dataHost 内能够界定好几个 writeHost 和 readHost。可是,假如 writeHost 特定的后端开发数据信息库服务器宕机,
那麼这一 writeHost 关联的全部 readHost 都将不能用。另外一层面,因为这一 writeHost 服务器宕机系统软件会全自动的检验
到,并转换到预留的 writeHost 上来。
这2个标识的特性同样。

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 下还可以有2个 schema 标识,特定对这2个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的关联 ,来决策关联表追随哪个方位储存

方法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" 
    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"
          
    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万到1五百万的数据信息放进连接点3
超出1五百万便会出错 


3.取模优化算法 mod-long  (即大家常说的hash系统分区)

 tableRule name="mod-long" 
    rule 
        columns id /columns       # 依据id字段名系统分区
        algorithm mod-long /algorithm 
    /rule 
 /tableRule 
 function name="mod-long" 
    !-- 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"
          
    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"     property name="patternValue" 256 /property    # 表明256是被除数 id%256
    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%256获得的模在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 时便会从主连接点载入。

张柏沛IT技术性blog > Mysql升阶之Mycat正中间件(二) mycat的标识详细说明

点一下拷贝转截该一篇文章



联系我们

全国服务热线:4000-399-000 公司邮箱:343111187@qq.com

  工作日 9:00-18:00

关注我们

官网公众号

官网公众号

Copyright?2020 广州凡科互联网科技股份有限公司 版权所有 粤ICP备10235580号 客服热线 18720358503