Mycat 配置文件解析

mycat安装完成后,目录以下:html

  • bin mycat命令,启动、重启、中止等
  • catlet catlet为Mycat的一个扩展功能
  • conf Mycat 配置信息,重点关注
  • lib Mycat引用的jar包,Mycat是java开发的
  • logs 日志文件,包括Mycat启动的日志和运行的日志

Mycat的配置文件都在conf目录里面,介绍几个经常使用的文件:java

文件 说明
server.xml Mycat的配置文件,设置帐号、参数等
schema.xml Mycat对应的物理数据库和数据库表的配置
rule.xml Mycat分片(分库分表)规则
1、server.xml

server.xml文件其实跟读写分离策略关系不大,可是须要用此文件来配置链接MyCat的用户及权限等。node

.......
        <user name="bobo">
                <property name="password">bo@123</property>
                <property name="schemas">mycat/property>
 
                <!-- 表级 DML 权限设置 -->
                <!-- <privileges check="false"> <schema name="TESTDB" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> -->
        </user>
 
        <!-- #注意,因为这里只定义了一个标签,因此把多余的都注释了。若是这个打开,也须要将TESTDB库改成和上面同样的mycat库名。 <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user> -->
</mycat:server>
.......
参数 说明
user 用户配置节点
name 登陆的用户名,也就是链接Mycat的用户名。
password 登陆的密码,也就是链接Mycat的密码
schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如须要这个用户须要管理两个数据库db1,db2,则配置db1,db2
privileges 配置用户针对表的增删改查的权限
readOnly mycat逻辑库所具备的权限。true为只读,false为读写都有,默认为false。

注意:mysql

  • server.xml文件里登陆mycat的用户名和密码能够任意定义,这个帐号和密码是为客户机登陆mycat时使用的帐号信息。
  • 逻辑库名(如上面的mycat,也就是登陆mycat后显示的库名,切换这个库以后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,不然会致使mycat服务启动失败!
  • 这里只定义了一个标签,因此把多余的都注释了。若是定义多个标签,即设置多个链接mycat的用户名和密码,那么就须要在schema.xml文件中定义多个对应的库!
2、schema.xml

schema.xml是最主要的配置项,此文件关联mysql读写分离策略!读写分离、分库分表策略、分片节点都是在此文件中配置的!算法

MyCat做为中间件,它只是一个代理,自己并不进行数据存储,须要链接后端的MySQL物理服务器,此文件就是用来链接MySQL服务器的!
在这里插入图片描述
schema.xml 文件定义了 MyCat 到底链接那个数据库实例,链接这个数据库实例的哪一个数据库。MyCat 一共有几个逻辑数据库,MyCat 一共有几个逻辑表。sql

schema.xml 文件一共有四个配置节点:DataHost、DataNode、Schema、Table。mongodb

  • schema 标签用于定义MyCat 实例中的逻辑库,MyCat 能够有多个逻辑库,每一个逻辑库都有本身的相关配置。可使用schema 标签来划分这些不一样的逻辑库。
  • dataNode 标签订义了MyCat 中的数据节点,也就是咱们一般说所的数据分片。一个dataNode 标签就是一个独立的数据分片。
  • dataHost标签直接定义了具体的数据库实例、读写分离配置和心跳语句。其中有几个重要的属性:

– balance属性数据库

负载均衡类型,目前的取值有3 种:
balance=“0”, 不开启读写分离机制,全部读操做都发送到当前可用的writeHost 上。
balance=“1”,所有的readHost 与stand by writeHost 参与select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,而且M1 与M2 互为主备),正常状况下,M2,S1,S2 都参与select 语句的负载均衡。
balance=“2”,全部读操做都随机的在writeHost、readhost 上分发。
balance=“3”,全部读请求随机的分发到wiriterHost 对应的readhost 执行,writerHost 不负担读压
力,注意balance=3 只在1.4 及其之后版本有,1.3 没有。后端

– writeType 属性服务器

负载均衡类型,目前的取值有3 种: writeType=“0”,
全部写操做发送到配置的第一个writeHost,第一个挂了切到还生存的第二个
writeHost,从新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
writeType=“1”,全部写操做都随机的发送到配置的writeHost,1.5 之后废弃不推荐。

2.1 schema.xml文件中配置的参数解释

参数 说明
schema 数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应
dataNode 分片信息,也就是分库相关配置
dataHost 物理数据库,真正存储数据的数据库

配置说明:

  • name属性惟一标识dataHost标签,供上层的标签使用。
  • maxCon属性指定每一个读写实例链接池的最大链接。也就是说,标签内嵌套的.
  • writeHost、readHost标签都会使用这个属性的值来实例化出链接池的最大链接数。
  • minCon属性指定每一个读写实例链接池的最小链接,初始化链接池的大小。

每一个节点的属性逐一说明:

  • schema:
    • name:逻辑数据库名,与server.xml中的schema对应
    • checkSQLschema:数据库前缀相关设置,建议看文档,这里暂时设为false
    • sqlMaxLimit:select 时默认的limit,避免查询全表

table:

属性 说明
name 表名,物理数据库中表名
dataNode 表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
primaryKey 主键字段名,自动生成主键时须要设置
autoIncrement 是否自增
rule 分片规则名

dataNode:

属性 说明
name 节点名,与table中dataNode对应
datahost 物理数据库名,与datahost中name对应
database 物理数据库中数据库名

dataHost:

属性 说明
name 物理数据库名,与dataNode中dataHost对应
balance 均衡负载的方式
writeType 写入方式
dbType 数据库类型
heartbeat 心跳检测语句,注意语句结尾的分号要加

schema.xml文件中有三点须要注意:balance=“1”,writeType=“0” ,switchType=“1” 。

schema.xml中的balance的取值决定了负载均衡对非事务内的读操做的处理。balance 属性负载均衡类型,目前的取值有 4 种:

  • balance=“0”: 不开启读写分离机制,全部读操做都发送到当前可用的writeHost 上,即读请求仅发送到writeHost上。
  • balance=“1”: 读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即所有的readHost与stand by writeHost 参与select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,而且 M1 与 M2 互为主备),正常状况下, M2,S1,S2 都参与 select 语句的负载均衡。
  • balance=“2”: 读请求随机分发到当前dataHost内全部的writeHost和readHost上。即全部读操做都随机的在writeHost、 readhost 上分发。
  • balance=“3”: 读请求随机分发到当前writeHost对应的readHost上。即全部读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其之后版本有,1.3 没有。

writeType 属性,负载均衡类型,目前的取值有 3 种:

  • writeType=“0” 全部写操做发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,从新启动后已切换后的为- 准,切换记录在配置文件中:dnindex.properties .
  • writeType=“1” 全部写操做都随机的发送到配置的 writeHost。
  • writeType=“2” 没实现。

对于事务内的SQL默认走写节点:

以 /balance/ 开头,能够指定SQL使用特定负载均衡方案。例如在大环境开启读写分离的状况下,特定强一致性的SQL查询需求;
slaveThreshold:近似的主从延迟时间(秒)Seconds_Behind_Master < slaveThreshold ,读请求才会分发到该Slave,确保读到的数据相对较新。

schema.xml中的writeType的取值决定了负载均衡对写操做的处理:
writeType=“0”:全部的写操做都发送到配置文件中的第一个write host。(第一个write
host故障切换到第二个后,即便以后修复了仍然维持第二个为写库)。推荐取0值,不建议修改.

主从切换(双主failover):switchType 属性:

若是细心观察schem.xml文件的话,会发现有一个参数:switchType,以下配置:
 <dataHost name="237_15" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"switchType="1"  slaveThreshold="100">
 
参数解读
switchType="-1":  不自动切换
switchType="1":   默认值,自动切换
switchType="2":   基于MySQL主从同步的状态来决定是否切换。需修改heartbeat语句(即心跳语句):show slave status
switchType="3":   基于Mysql Galera Cluster(集群多节点复制)的切换机制。需修改heartbeat语句(即心跳语句):show status like 'wsrep%'

dbType属性:

  • 指定后端链接的数据库类型,目前支持二进制的mysql协议,还有其余使用JDBC链接的数据库。例如:mongodb、oracle、spark等。

dbDriver属性指定链接后端数据库使用的:

Driver,目前可选的值有native和JDBC。

使用native的话,由于这个值执行的是二进制的mysql协议,因此可使用mysql和maridb。

其余类型的数据库则须要使用JDBC驱动来支持。从1.6版本开始支持postgresql的native原始协议。

若是使用JDBC的话须要将符合JDBC 4标准的驱动JAR包放到MYCAT\lib目录下,并检查驱动JAR包中包括以下目录结构的文件:
META-INF\services\java.sql.Driver。在这个文件内写上具体的Driver类名,例如:com.mysql.jdbc.Driver。

heartbeat标签:

这个标签内指明用于和后端数据库进行心跳检查的语句。例如,MYSQL可使用select user(),Oracle可使用select 1 from dual等。
这个标签还有一个connectionInitSql属性,主要是当使用Oracla数据库时,须要执行的初始化SQL

语句就这个放到这里面来。例如:altersession set nls_date_format=‘yyyy-mm-dd hh24:mi:ss’

1.4主从切换的语句必须是:showslave status

writeHost标签、readHost标签:

  • 这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端链接池。
  • 惟一不一样的是:writeHost指定写实例、readHost指定读实例,组着这些读写实例来知足系统的要求。
  • 在一个dataHost内能够定义多个writeHost和readHost。可是,若是writeHost指定的后端数据库宕机,那么这个writeHost绑定的全部readHost都将不可用。
  • 另外一方面,因为这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。

2.1.1 DataHost

DataHost 节点定义了 MyCat 要链接哪一个 MySQL 实例,链接的帐号密码是多少。默认的 MyCat 为咱们定义了一个名为 localhost1 的数据服务器(DataHost),它指向了本地(localhost)3306 端口的 MySQL 服务器,对应 MySQL 服务器的帐号是 root,密码是 123456。

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()</heartbeat> 
    <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> 
        <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
    </writeHost>
    <writeHost host="hostS1" url="localhost:3316" user="root" password="123456" /> 
</dataHost>

2.1.2 DataNode

DataNode 节点指定了须要链接的具体数据库名称,其使用一个 dataHost 属性指定该数据库位于哪一个数据库实例上。默认的 MyCat 为咱们建立了三个数据节点(DataNode),dn1 数据节点对应 localhost1 数据服务器上的 db1 数据库,dn2 数据节点对应 localhost1 数据服务器上的 db2 数据库,dn1 数据节点对应 localhost1 数据服务器上的 db3 数据库。

<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />

2.1.3 Schema

Schema 节点定义了 MyCat 的全部逻辑数据库,Table 节点定义了 MyCat 的全部逻辑表。默认的 MyCat 为咱们定义了一个名为 TESTDB 的逻辑数据库,在这个逻辑数据库下又定义了名为 travaelrecord、company 等 6 个逻辑表。

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> 
    <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> 
    <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
    ……
</schema>
3、rule.xml

rule.xml 定义了逻辑表使用哪一个字段进行拆分,使用什么拆分算法进行拆分。rule.xml 中有两个配置节点,分别是:TableRule 和 Function 配置节点。

TableRule 配置节点定义了逻辑表的拆分信息,例如使用哪一个字段进行拆分,使用什么拆分算法。默认的 MyCat 为咱们配置了一个名为 rule2 的表拆分规则,表示根据 user_id 字段进行拆分,拆分算法是 func1。

<tableRule name="rule2">
    <rule>
        <columns>user_id</columns>
        <algorithm>func1</algorithm>
    </rule>
</tableRule>

Function 配置节点则定义了具体的拆分算法。例如使用对 1000 取余的拆分算法,对 100 取余的拆分算分等等。默认的 MyCat 为咱们定义了一个名为 func1 的拆分算法,这个拆分算法定义在 o.mycat.route.function.PartitionByLong 类中,而且还传入了两个参数值。

<function name="func1" class="io.mycat.route.function.PartitionByLong">
    <property name="partitionCount">8</property>
    <property name="partitionLength">128</property>
</function>
应用场景

Mycat读写分离(负载均衡)、主从自动切换

Mycat读写分离(负载均衡)、主从自动切换
主要使用mycay的特性:

  • 读写分离支持
  • 高可用

大多数读写分离的案例是同时支持高可用性的,即Mycat+MySQL主从复制的集群,并开启Mycat的读写分离功能,这种场景需求下,Mycat是最为简单而且功能最为丰富的一类Proxy,正常状况下,配置文件也最为简单,不用每一个表配置,只须要在schema.xml中的元素上增长dataNode=“defaultDN”属性,并配置此dataNode对应的真实物理数据库的database,而后dataHost开启读写分离功能便可。

修改mycat的schema.xml:

  • balance为1:让所有的readHost及备用的writeHost参与select的负载均衡。
  • switchType为2:基于MySQL主从同步的状态决定是否切换。
  • heartbeat:主从切换的心跳语句必须为show slave status。

仅仅进行读写分离的schema.xml配置(备份原来的schema.xml文件,清空,直接复制下面内容):不想要自动切换功能,即MySQL写节点宕机后不自动切换到备用节点:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
 
        <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="haha">
        </schema>
         
<dataNode name="haha" dataHost="Mycat-node" database="kevin" />
 
    <dataHost name="Mycat-node" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="Mysql-node1" url="192.168.10.205:3306" user="root" password="123456">
             <readHost host="Mysql-node2" url="192.168.10.206:3306" user="root" password="123456">
             </readHost>
        </writeHost>
    </dataHost>
 
</mycat:schema>

实现主从自动切换的schema.xml配置:即MySQL写节点宕机后自动切换到备用节点(也就是把从机也配置成writeHosts):

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
 
        <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="haha">
        </schema>
         
<dataNode name="haha" dataHost="Mycat-node" database="kevin" />
 
    <dataHost name="Mycat-node" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="Mysql-node1" url="192.168.10.205:3306" user="root" password="123456">
             <readHost host="Mysql-node2" url="192.168.10.206:3306" user="root" password="123456">
             </readHost>
        </writeHost>
        <writeHost host="Mysql-node2" url="192.168.10.206:3306" user="root" password="123456">
        </writeHost>
    </dataHost>
 
</mycat:schema>

上面配置中,balance改成1,表示读写分离。
以上配置达到的效果就是192.168.10.205为主库,192.168.10.206为从库。
注意:要保证192.168.10.205和192.168.10.206机器能使用root/123456权限成功登陆mysql数据库。同时,也必定要受权mycat机器能使用root/123456权限成功登陆这两台机器的mysql数据库!!这很重要,不然会致使登陆mycat后,对库和表操做失败!

一主一从结构是最简单的配置。
MyCat支持双主多从,若是有N个主,那么就配置N个writeHost兄弟节点;若是有M个从节点,那么就配置M个readHost节点便可。
也能够有多台MySQL服务器,或者SQL Server、Oracle等,配置多个dataHost节点就能够。

须要注意的是:
Mycat主从分离只是在读的时候作了处理,写入数据的时候,只会写入到writehost,须要经过mycat的主从复制将数据复制到readhost!这个问题须要弄明白!!
若是没有提早作mysql主从复制,会发现Mycat读写分离配置后,数据写入writehost后,readhost一直没有数据!由于Mycat就没有实现主从复制的功能,毕竟数据库自己自带的这个功能才是最高效稳定的。

特别注意:

1)本案例采用的一主一从模式的两个mysql实例,而且针对单一的数据库名进行测试;大多数mycat使用场景都是在多主多从模式并针对多个库进行的。
2)要想登陆Mycat后看到mysql的真实数据库的表内容,须要在schema.xml文件中指明database,其中dataNote和dataHost名称能够自定义,database名称要是mysql上的库名。
3)若是针对的是mysql的多个库,好比mysql的真实库名是kevin、grace、shanshan,那么schema.xml文件里应该指明多个库名,如:
       <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="haha,heihei,hengheng">
       </schema>
   <dataNode name="haha" dataHost="Mycat-node" database="kevin" />
   <dataNode name="heihei" dataHost="Mycat-node" database="grace" />
   <dataNode name="hengheng" dataHost="Mycat-node" database="shanshan" />
   ........
4)主从自动切换配置后,第一个writeHost故障后,会自动切换到第二个,第二个故障后自动切换到第三个;
   若是当是13从模式,能够把第1个从节点配置为writeHost 2,第2个和第3个从节点则配置为writeHost 1的readHost;
相关文章
相关标签/搜索