使用mycat实现mysql读写分离以及主备自动切换模式

来源:互联网 发布:大数据计算引擎 编辑:程序博客网 时间:2024/04/29 06:02

一:软件环境

Window7

Mycat-server1.6

JDK1.8

Mysql5.62

二:读写分离的好处

 增加了冗余(备份数据)。

 读写分开,减轻机器压力,提高数据库并发。

Mycat自身不提供主从复制的功能,也不做数据备份,因此应用Mycat做读写分离,主从复制还得使用Mysql的机制。

mysql主从复制配置详见:http://blog.csdn.net/qq_33556185/article/details/52958083

读写分离架构图:


三:读写分离配置
(1)配置连接信息

Mycat的server.xml配置逻辑库的名称访问的账号密码

<user name="root"><property name="password">digdeep</property><property name="schemas">TESTDB</property></user><user name="user"><property name="password">user</property><property name="schemas">TESTDB</property><property name="readOnly">true</property></user>

配置说明:

配置中name是应用连接中间件逻辑库的用户名。

mycat中password是应用连接中间件逻辑库的密码。

schemas中可以配置一个或多个。

readOnly是应用连接中间件逻辑库所具有的权限。true为只读,false为读写都有,默认为false。

(2)配置数据库信息

修改schema里面的配置

仅仅主从读写分离的配置:

<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">      </schema><dataNode name="dn1" dataHost="localhost1" database="test" /><dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>show slave status</heartbeat><!-- can have multi write hosts --><writeHost host="hostM1" url="localhost:3306" user="root"   password="123456"><!-- can have multi read hosts --><readHost host="hostS2" url="localhost:3307" user="root" password="123456" /></writeHost></dataHost></mycat:schema>

主挂掉之后自动切换到从的配置:

<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">      </schema><dataNode name="dn1" dataHost="localhost1" database="test" /><dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>show slave status</heartbeat><!-- can have multi write hosts --><writeHost host="hostM1" url="localhost:3306" user="root"   password="123456"><!-- can have multi read hosts --><readHost host="hostS2" url="localhost:3307" user="root" password="123456" /></writeHost><writeHost host="hostM2" url="localhost:3307" user="root"   password="123456"/></dataHost></mycat:schema>

配置说明:

name属性唯一标识dataHost标签,供上层的标签使用。

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语句的负载均衡。

3.balance="2",所有读操作都随机的在writeHost、readhost上分发。

4.balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,

writerHost不负担读压力,注意balance=3只在1.4及其以后版本有,1.3没有。


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

1.writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties.

2.writeType="1",所有写操作都随机的发送到配置的writeHost,1.5以后废弃不推荐。

3.writeType="2",不执行写操作

 

switchType属性

-1 表示不自动切换

1 默认值,自动切换

2 基于MySQL主从同步的状态决定是否切换

3 基于MySQLgalarycluster的切换机制(适合集群)(1.4.1)

心跳语句为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上去。


(3)启动mycat

在mycat的lib包下面丢入mysql的驱动包,然后在mycat\bin目录下找到startup_nowrap.bat双击运行。

双击没有一闪而退,就启动成功了。如果启动不成功,仔细检查配置信息。


(4)连接mycat

将mycat启动起来后,用jdbc的方式连接,默认端口是8066,逻辑库名和账号密码就是在server里配置的信息。


四:读写分离测试

将mycat的日志输出级别改完debug,在conf/log4j2.xml里配置

然后去查询去添加数据在/logs/mycat.log日志文件里查看sql被路由到了哪个服务器上

特别注意:

查询语句不要加事务,否则读操作会被分发到写服务器上。




1 0