一、 引言
Mycat作为现在最流行的分布式数据库中间件,已经在很多的生产项目中实施,随着时间的推移会有更多的生产项目中会用到Mycat。
本文主要是介绍MyCat主要配置文件,以及笔者对这些配置的一些理解。
二、 前言
本文主要分析的有server.xml,schema.xml,rule.xml三个最常用的文件。
三、 Server.xml
Server.xml保存了mycat需要的所有的系统配置信息,代码映射为SystemConfig类。
标签主要有四个:
system,user,firewarll,cluster.
接下来对四个标签进行说明
1. user标签
内容:
<user name="test"> 说明用户名是test。
子标签:
property,privileges.
1) property标签
内容:
<property name="password">test</property> 用户密码是test
<property name="schemas">db1, db2</property> 可访问的schema有db1,db2
<property name="readOnly">true</property> 是否只读
<property name="benchmark">1000</property> 连接上限,降级权值。
<property name="usingDecrypt">1</property> 是否开启加密。
注意:benchmark参数有坑,他不是一个单用户控制参数,居然是一个全局参数,也就是说,只要你有一个用户设置了benchmark是1000,那你这个mycat所有用户连进来,也只有1000个连接上限.
2) privileges标签
对用户的 schema以及表进行精细化的DML权限控制。
<privileges check="false">
check表示是否开启DML权限检查。默认是关闭。
server.dtd文件中 <!ELEMENT privileges (schema)*> 说明可以有多个schema的配置。
dml顺序说明:
insert,update,select,delete
<schema name="db1" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
db1的权限是update,select。
tb01的权限是啥都不能干。
tb02的权限是insert,update,select,delete。
其他表默认是udpate,select。
2. system标签
这个标签内嵌套的所有 property 标签都与系统配置有关。
<property name="nonePasswordLogin">0</property>
0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户
<property name="charset">utf8</property>
字符集
<property name="processors">4</property>
处理线程数量,默认是cpu数量。
<property name="processorBufferChunk">4096</property>
每次读取留的数量,默认4096。
<property name="processorBufferPool">409600</property>
创建共享buffer需要占用的总空间大小。processorBufferChunk*processors*100。
<property name="processorBufferPoolType">0</property>
默认为0。0表示DirectByteBufferPool,1表示ByteBufferArena。
<property name="processorBufferLocalPercent">100</property>
二级共享buffer是processorBufferPool的百分比,这里设置的是百分比。
<property name="sequnceHandlerType">100</property>
全局ID生成方式。(0:为本地文件方式,1:为数据库方式;2:为时间戳序列方式;3:为ZK生成ID;4:为ZK递增ID生成。
<property name="useCompression">1</property>
是否开启mysql压缩协议。1为开启,0为关闭,默认关闭。
<property name="packetHeaderSize">4</property>
指定 Mysql 协议中的报文头长度。默认 4。
<property name="maxPacketSize">32M</property>
指定 Mysql 协议可以携带的数据最大长度。默认 16M。
<property name="idleTimeout">1800000</property>
指定连接的空闲超时时间。某连接在发起空闲检查下,发现距离上次使用超过了空闲时间,那么这个连接会被回收,就是被直接的关闭掉。默认 30 分钟,单位毫秒。
<property name="txIsolation">2</property>
前端连接的初始化事务隔离级别,只在初始化的时候使用,后续会根据客户端传递过来的属性对后端数据库连接进行同步。默认为 REPEATED_READ,设置值为数字默认 3。
READ_UNCOMMITTED = 1;
READ_COMMITTED = 2;
REPEATED_READ = 3;
SERIALIZABLE = 4;
<property name="sqlExecuteTimeout">600</property>
SQL 执行超时的时间,Mycat 会检查连接上最后一次执行 SQL 的时间,若超过这个时间则会直接关闭这连接。默认时间为 300 秒,单位秒。
<property name="processorCheckPeriod">1000</property>
清理 NIOProcessor 上前后端空闲、超时和关闭连接的间隔时间。默认是 1 秒,单位毫秒。
<property name="dataNodeIdleCheckPeriod">10000</property>
对后端连接进行空闲、超时检查的时间间隔,默认是 300 秒,单位毫秒。
<property name="dataNodeHeartbeatPeriod">10000</property>
对后端所有读、写库发起心跳的间隔时间,默认是 10 秒,单位毫秒。
<property name="bindIp">0.0.0.0</property>
mycat 服务监听的 IP 地址,默认值为 0.0.0.0。
<property name="serverPort">8066</property>
定义 mycat 的使用端口,默认值为 8066。
<property name="managerPort">9066</property>
定义 mycat 的管理端口,默认值为 9066。
<property name="fakeMySQLVersion">5.6</property>
mycat 模拟的 mysql 版本号,默认值为 5.6 版本,如非特需,不要修改这个值,目前支持设置 5.5,5.6,5.7 版本,其他版本可能会有问题。
<property name="useSqlStat">0</property>
是否开启实时统计。1为开启;0为关闭 。
<property name="useGlobleTableCheck">0</property>
是否开启全局表一致性检测。1为开启;0为关闭 。
<property name="handleDistributedTransactions">0</property>
分布式事务开关。0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志。
<property name="maxStringLiteralLength">65535</property>
默认是65535。 64K 用于sql解析时最大文本长度
以上举例的属性仅仅是一部分,可以配置的变量很多,具体可以查看SystemConfig这个类的属性内容。
System标签下的属性,一般是上线后,需要根据实际运行的情况,分析后调优的时候进行修改。
<property name="useOffHeapForMerge">0</property>
使用非堆内存(Direct Memory)处理跨分片结果集的 Merge/order by/group by/limit。在大数据量查询聚合的时候启用堆外内存对于查询性能提升非常明显,但是如果配置不够好就容易造成报错,需要加大MaxDirectMemorySize内存参数
3. Firewall标签
顾名思义,这个就是关于防火墙的设置,也就是在网络层对请求的地址进行限制,主要是从安全角度来保证Mycat不被匿名IP进行访问.
<firewall>
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
设置很简单,很容易理解,只要设置了白名单,表示开启了防火墙,只有白名单的连接才可以进行连接。
4. Cluster标签
待完善。
四、 Schema.xml
这个文件是MyCat最重要的配置文件,负责管理库,表,分片规则,DataNode ,DataSource。因此这个配置是需要很清楚各部分的含义的。
schema.dtd
<!ELEMENT mycat:schema (schema*,dataNode*,dataHost*)>
可以看到包含的标签有:
Schema、dataNode、dataHost。
接下来将对每个标签逐一的进行详解。
1. Schema标签
<schema name="db1" checkSQLschema="false" sqlMaxLimit="100"></schema>
schema 标签用于定义 MyCat 实例中的逻辑库,MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用 schema 标签来划分这些不同的逻辑库。
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"></schema>
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100"></schema>
如上所示的配置就配置了两个不同的逻辑库,逻辑库的概念和 MYSQL 数据库中 Database 的概念相同,我们在查询这两个不同的逻辑库中表的时候需要切换到该逻辑库下才可以查询到所需要的表。
checkSQLschema这个属性默认就是false,官方文档的意思就是是否去掉表前面的数据库的名称,”select * from db1.testtable” ,设置为true就会去掉db1。但是如果db1的名称不是schema的名称,那么也不会被去掉,因此官方建议不要使用这种语法。同时默认设置为false。
sqlMaxLimit当该值设置为某个数值时。每条执行的 SQL 语句,如果没有加上 limit 语句,MyCat 也会自动的加上所对应的值。例如设置值为 100,执行”select * from test_table”,则效果为“selelct * from test_table limit 100”.
注意:如果运行的 schema 为非拆分库的,那么该属性不会生效。
1) Table标签
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" ></table>
Table 标签定义了 MyCat 中的逻辑表,所有需要拆分的表都需要在这个标签中定义。
table 标签的相关属性:
属性 说明
name 该属性定义逻辑表的表名
dataNode 该属性定义这个逻辑表所属的 dataNode, 该属性的值需要和 dataNode 标签中 name 属性的值相互对应。
rule 该属性用于指定逻辑表要使用的规则名字,规则名字在 rule.xml 中定义,必须与 tableRule 标签中 name 属性属性值一一对应
ruleRequired 该属性用于指定表是否绑定分片规则,如果配置为 true,但没有配置具体 rule 的话 ,程序会报错。
primaryKey 该逻辑表对应真实表的主键,
type 该属性定义了逻辑表的类型,目前逻辑表只有“全局表”和”普通表”两种类型。全局表定义type=”global”,不定义的就是普通表。
autoIncrement 主键是否自增长。
subTables 分表,分表目前不支持Join。
needAddLimit 是否自动添加limit,默认是开启状态。关闭请谨慎。
2) childTable标签
<table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile"> <childTable name="c_a" primaryKey="ID" joinKey="customer_id" parentKey="id" />
</table>
childTable 标签用于定义 E-R 分片的子表。通过标签上的属性与父表进行关联。
属性说明:
属性 说明
name 子表的名称
joinKey 子表中字段的名称
parentKey 父表中字段名称
primaryKey 同Table
needAddLimit 同Table
2. dataNode标签
dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个 dataNode 标签就是一个独立的数据分片。
<dataNode name="dNode1" dataHost="dHost128" database="db1" ></dataNode>
例子中所表述的意思为:使用名字为 dHost128数据库实例上的 db1 物理数据库,这就组成一个数据分片,最后,我们使用名字 dNode1标识这个分片。
dataNode 标签的相关属性:
属性 说明
Name 定义数据节点的名字,这个名字需要是唯一的
dataHost 该属性用于定义该分片属于哪个数据库实例
Database 该属性用于定义该分片属性哪个具体数据库实例上的具体库
3. dataHost标签
该标签定义了具体的数据库实例、读写分离配置和心跳语句。
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
</writeHost>
</dataHost>
dataHost 标签的相关属性:
标签 说明
name 唯一标识 dataHost 标签,供上层的标签使用
maxCon 指定每个读写实例连接池的最大连接。
minCon 指定每个读写实例连接池的最小连接,初始化连接池的大小。
balance 负载均衡类型,也是读写分离选项,目前的取值有4 种: “0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。 “1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。”2”,所有读操作都随机的在 writeHost、readhost 上分发。”3”,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压writeType 1. 示例:writeType=”0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .2. writeType=”1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。默认0就好了!
dbType 指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、oracle、spark 等.
dbDriver 指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。
switchType 高可用模式,“-1” 表示不自动切换; “1” 默认值,自动切换; “2” 基于 MySQL 主从同步的状态决定是否切换心跳语句为 show slave status; “3” 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)心跳语句为 show status like ‘wsrep%’.建议把高可用交给后端数据库第三方应用,这里设置-1即可.
tempReadHostAvailable 如果配置了这个属性 writeHost 下面的 readHost 仍旧可用,默认 0 可配置(0、1)。
1) heartbeat 标签
这个标签内指明用于和后端数据库进行心跳检查的语句。
例如:MYSQL 可以使用 select user(),Oracle 可以使用 select 1 from dual 等。
2) writeHost /readHost 标签
这两个标签都指定后端数据库的相关配置,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、readHost 指定读实例。
在一个 dataHost 内可以定义多个 writeHost 和 readHost。但是,如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用。另一方面,由于这个 writeHost 宕机,系统会自动的检测到,并切换到备用的 writeHost 上去。这两个标签的属性相同,这里就一起介绍。
属性 说明
host 用于标识不同实例,一般 writeHost 我们使用*M1,readHost 我们用*S1。
url 后端实例连接地址。Native:地址:端口 JDBC:jdbc的url
password 后端存储实例需要的密码
user 后端存储实例需要的用户名字
weight 权重 配置在 readhost 中作为读节点的权重
usingDecrypt 是否对密码加密,默认0。具体加密方法看官方文档。
五、 Rule.xml
rule.xml 里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。
包含的标签 tableRule 和 function。
1. tableRule 标签
这个标签定义表规则。
定义的表规则,在 schema.xml:
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
name 属性指定唯一的名字,用于标识不同的表规则。
内嵌的 rule 标签则指定对物理表中的哪一列进行拆分和使用什么路由算法。
columns 内指定要拆分的列名字。
algorithm 使用 function 标签中的 name 属性。连接表规则和具体路由算法。当然,多个表规则可以连接到
同一个路由算法上。table 标签内使用。让逻辑表使用这个规则进行分片。
2. function 标签
<function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
</function>
name 指定算法的名字。
class 制定路由算法具体的类名字。
property 为具体算法需要用到的一些属性。
六、 后记
至此,MyCat三个主要的配置文件的说明已经完成,过程中参考了一些文章,在此不进行一一列举,同时参考了MyCat的源代码,以及官方文档。
————————————————
原文链接:https://blog.csdn.net/tornadojava/java/article/details/54948662
来源:oschina
链接:https://my.oschina.net/u/4273871/blog/4275673