mycat安装完成后,目录如下:
Mycat的配置文件都在conf目录里面,介绍几个常用的文件:
文件 | 说明 |
---|---|
server.xml | Mycat的配置文件,设置账号、参数等 |
schema.xml | Mycat对应的物理数据库和数据库表的配置 |
rule.xml | Mycat分片(分库分表)规则 |
server.xml文件其实跟读写分离策略关系不大,但是需要用此文件来配置连接MyCat的用户及权限等。
.......
<user name="bobo">
<property name="password">bo@123property>
<property name="schemas">mycat/property>
user>
mycat:server>
.......
参数 | 说明 |
---|---|
user | 用户配置节点 |
name | 登录的用户名,也就是连接Mycat的用户名。 |
password | 登录的密码,也就是连接Mycat的密码 |
schemas | 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,db2 |
privileges | 配置用户针对表的增删改查的权限 |
readOnly | mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false。 |
注意:
schema.xml是最主要的配置项,此文件关联mysql读写分离策略!读写分离、分库分表策略、分片节点都是在此文件中配置的!
MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的!
schema.xml 文件定义了 MyCat 到底连接那个数据库实例,连接这个数据库实例的哪个数据库。MyCat 一共有几个逻辑数据库,MyCat 一共有几个逻辑表。
schema.xml 文件一共有四个配置节点:DataHost、DataNode、Schema、Table。
– 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,如下配置:
参数解读
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>
rule.xml 定义了逻辑表使用哪个字段进行拆分,使用什么拆分算法进行拆分。rule.xml 中有两个配置节点,分别是:TableRule 和 Function 配置节点。
TableRule 配置节点定义了逻辑表的拆分信息,例如使用哪个字段进行拆分,使用什么拆分算法。默认的 MyCat 为我们配置了一个名为 rule2 的表拆分规则,表示根据 user_id 字段进行拆分,拆分算法是 func1。
<tableRule name="rule2">
<rule>
<columns>user_idcolumns>
<algorithm>func1algorithm>
rule>
tableRule>
Function 配置节点则定义了具体的拆分算法。例如使用对 1000 取余的拆分算法,对 100 取余的拆分算分等等。默认的 MyCat 为我们定义了一个名为 func1 的拆分算法,这个拆分算法定义在 o.mycat.route.function.PartitionByLong 类中,并且还传入了两个参数值。
<function name="func1" class="io.mycat.route.function.PartitionByLong">
<property name="partitionCount">8property>
<property name="partitionLength">128property>
function>
Mycat读写分离(负载均衡)、主从自动切换
主要使用mycay的特性:
大多数读写分离的案例是同时支持高可用性的,即Mycat+MySQL主从复制的集群,并开启Mycat的读写分离功能,这种场景需求下,Mycat是最为简单并且功能最为丰富的一类Proxy,正常情况下,配置文件也最为简单,不用每个表配置,只需要在schema.xml中的元素上增加dataNode=“defaultDN”属性,并配置此dataNode对应的真实物理数据库的database,然后dataHost开启读写分离功能即可。
修改mycat的schema.xml:
仅仅进行读写分离的schema.xml配置(备份原来的schema.xml文件,清空,直接复制下面内容):不想要自动切换功能,即MySQL写节点宕机后不自动切换到备用节点:
<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 statusheartbeat>
<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):
<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 statusheartbeat>
<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;