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

一:软件环境

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’

主从切换的语句必须是: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被路由到了哪个服务器上
特别注意:
查询语句不要加事务,否则读操作会被分发到写服务器上。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值