mycat安装完成后,目录以下:html
Mycat的配置文件都在conf目录里面,介绍几个经常使用的文件:java
文件 | 说明 |
---|---|
server.xml | Mycat的配置文件,设置帐号、参数等 |
schema.xml | Mycat对应的物理数据库和数据库表的配置 |
rule.xml | Mycat分片(分库分表)规则 |
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
schema.xml是最主要的配置项,此文件关联mysql读写分离策略!读写分离、分库分表策略、分片节点都是在此文件中配置的!算法
MyCat做为中间件,它只是一个代理,自己并不进行数据存储,须要链接后端的MySQL物理服务器,此文件就是用来链接MySQL服务器的!
schema.xml 文件定义了 MyCat 到底链接那个数据库实例,链接这个数据库实例的哪一个数据库。MyCat 一共有几个逻辑数据库,MyCat 一共有几个逻辑表。sql
schema.xml 文件一共有四个配置节点:DataHost、DataNode、Schema、Table。mongodb
– 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 之后废弃不推荐。
参数 | 说明 |
---|---|
schema | 数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应 |
dataNode | 分片信息,也就是分库相关配置 |
dataHost | 物理数据库,真正存储数据的数据库 |
配置说明:
每一个节点的属性逐一说明:
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 种:
writeType 属性,负载均衡类型,目前的取值有 3 种:
对于事务内的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属性:
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标签:
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>
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" />
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读写分离(负载均衡)、主从自动切换
主要使用mycay的特性:
大多数读写分离的案例是同时支持高可用性的,即Mycat+MySQL主从复制的集群,并开启Mycat的读写分离功能,这种场景需求下,Mycat是最为简单而且功能最为丰富的一类Proxy,正常状况下,配置文件也最为简单,不用每一个表配置,只须要在schema.xml中的元素上增长dataNode=“defaultDN”属性,并配置此dataNode对应的真实物理数据库的database,而后dataHost开启读写分离功能便可。
修改mycat的schema.xml:
仅仅进行读写分离的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故障后,会自动切换到第二个,第二个故障后自动切换到第三个; 若是当是1主3从模式,能够把第1个从节点配置为writeHost 2,第2个和第3个从节点则配置为writeHost 1的readHost;