基于Mycat的MySQL读写分离与主从互备

96
北海三少
2016.12.27 10:39* 字数 1057

Mycat介绍
Mycat,一个开源的分布式数据库中间件,实现了MySQL协议,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问;而后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。Mycat官网:http://www.mycat.org.cn/

MySQL主从复制配置
主从复制是基于MySQL的replication机制实现,可参考另一篇文章:http://www.jianshu.com/p/eb0ac29c0ccc
这篇文章是讲述MySQL的单向主从复制,只要把slave节点也按照master节点进行配置,就可以实现双向的主从复制。

Mycat主从互备配置
从官网下载Mycat,我用的是1.6 windows版本。Mycat配置读写分离与主从互备只需修改conf目录下的server.xml与schema.xml文件。
server.xml中添加连接Mycat的用户名密码:
<user name="mycat">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
其中,TESTDB要和schema.xml文件配置的schema对应,用户名和密码可任意命名。
schema.xml配置:

Paste_Image.png

hostM1:写操作主节点
hostS1:读操作节点(从节点)
hostM2:写操作备节点,和读操作节点是同一台MySQL物理服务器

参数balance设置
balance决定了哪些MySQL服务器参与到读操作的负载均衡中。
0:表示不开启读写分离
1:表示全部的readHost与standby writeHost参与select语句的负载均衡
2:则表示所有的writeHost不参与负载均衡。
这里有一个细节,readHost是从属于writeHost的,意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,目前mycat 1.3和1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。

参数writeType设置
0:表示所有写操作发送到第一个writeHost,第一个宕机了切换到可用的第二个writeHost
1:表示所有写操作都随机的发送到所有的writeHost
2:貌似还没实现

参数switchType设置
-1:表示不自动切换
1:默认值,自动切换
2:基于MySQL主从同步的状态决定是否切换
当switchType="2" 与slaveThreshold="100",意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延,当Seconds_Behind_Master > slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则表示主从同步,可以安全切换,否则不会
切换。
注意:要确保连接的MySQL用户拥有执行心跳检测语句的权限

以上内容参考自《Mycat权威指南》

至此,基于Mycat的MySQL读写分离与主从互备的高可用数据库集群已配置完成,可使用命令行工具连接Mycat进行测试:
mysql -hlocalhost -P8066 -umycat -p123456 -DTESTDB
只要writeHost不同时宕机,这个数据库集群方案都是可用的。

注意:测试时,插入的数据最好能区分是哪台MySQL服务器的,比如使用某个字段插入@@hostname 来进行区分。

数据库应用