MyCAT读写分离与MySQL主从同步
很多开发框架在框架底层就引入了读写分离的机制,面对一些没有底层支持读写分离的框架,如何实现读写分离呢?
Mycat
一个开源的高性能的数据库中间件产品,支持读写分离,支持MySQL主从,数据切分以及galera cluster集群。
它是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的的
Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用
MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,
其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。
安装指南
- 安装JDK (略)
- 安装MySQL (略)
- 安装MyCAT
- http://dl.mycat.io/1.6-RELEASE/ 目前最新的稳定版本为1.6
- 下载指定系统的压缩包,解压以后即可使用。免安装。
使用指南
配置
- server.xml 系统配置文件
<user name="root">
<property name="password">123456</property>
<property name="schemas">dsy</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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
user标签用来添加用户,管理用户权限。
- schema.xml 管理逻辑库和逻辑表的配置文件
<schema name="dsy" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="xn_user_info" dataNode="dn1"/>
</schema>
- 1
- 2
- 3
- 4
解释:schema标签定义逻辑库的名字,table定义逻辑表。dataNode属性表示数据节点也就是数据分片。如果数据没有分片,通常只有一个就行了。
<dataNode name="dn1" dataHost="localhost1" database="dsy" />
- 1
解释:创建一个名字叫做dn1的数据节点,该节点使用名字为localhost1数据库实例上的dsy这个库组成数据分片。
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="root">
<!-- can have multi read hosts -->
<!-- <readHost host="hostS2" url="localhost:3306" user="root" password="root" /> -->
<!-- <readHost host="hostS2" url="192.168.0.164:3306" user="root" password="root" /> -->
</writeHost>
<writeHost host="hostS1" url="192.168.0.164:3306" user="root"
password="root" />
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
解释:创建一个名为localhost1的数据库实例。连接池最大链接数为1000。初始化的连接池数为10。dbType标识使用mysql的二进制协议。 dbDriver使用native表示可以使用mysql和mariadb,可选值还有JDBC驱动。switchType=1表示自动切换。如果switchType设置为2并且slaveThreshold=”100,维持心跳的语句改为show slave status,意味着开启MySQL主从复制状态绑定的读写分离与切换机制。
heartbeat是采用select user这条语句来维持心跳。
writehost是用来定义写实例。在一个 dataHost 内可以定义多个 writeHost 和 readHost。但是,如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用。另一方面,由于这个 writeHost 宕机系统会自动的检测到,并切换到备用的 writeHost 上去。
balance解释0不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。1全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。2所有读操作都随机的在 writeHost、readhost 上分发。3所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。writeType负载均衡类型解释0所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .1所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。switchType切换解释-1表示不自动切换1表示自动切换2基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status3基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%’。
读写分离配置
上述dataHost配置里,两个平级的writeHost节点。是一种方案。
或者在第一个writeHost里配置一个readHost节点来做读写分离。为第二种方案。
第二种当写挂了的时候,读也同事不可用。但是第一种可以继续使用。建议使用第一种配置。也就是上面的代码里写的那样。
事务内部的一切操作都会走写节点,所以读操作不要加事务。
启动服务
进入 MYCAT/bin 目录 执行 ./mycat start
连接mycat
和mysql命令一致 mysql -uroot -p123456 -h127.0.0.1 -P8066 -Ddsy
如果看到以下字样说明正常运行了。
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6-RELEASE-20161028204710 MyCat Server (OpenCloundDB)
配置MySQL主从同步
现有主机A:192.168.0.107
主机B:192.168.0.164
做主从同步。A为master节点B为slave节点。
1. A,B主机上都开启binlog功能。
配置文件在/etc/my.cnf。取消log-bin=mysql-bin前面的注释。
1. 在A主机上创建一个slave用户,只赋给他REPLICATION SLAVE 权限即可。
1. 在A主机上执行以下SQL语句
FLUSH LOGS
SHOW MASTER STATUS
- 1
- 2
确保在执行FLUSH LOGS时刻,AB两个库的数据完全一致。
执行完SHOW MASTER STATUS以后记录下binlog文件和pos位置。
1. 在B主机上将master节点指向A主机
CHANGE MASTER TO MASTER_HOST = '192.168.0.107', MASTER_USER = 'slave', MASTER_PASSWORD = 'slave', MASTER_PORT = 3306, MASTER_LOG_FILE = 'mysql-bin.000002' MASTER_LOG_POS = 105 ;
- 1
- 启动主从同步
START SLAVE
- 1
- 查看主从同步状态
SHOW SLAVE STATUS
- 1
如果看到Slave_IO_Running和Slave_SQL_Running都是Yes
这说明mysql主从同步配置完毕
踩坑指南
尽量保证AB主机上的mysql版本一致。
如果无法保证,尽量保证mysqlbinlog版本一致。
如果连mysqlbinlog版本都无法保证一致,最起码主节点的mysqlbinlog不能高于从主机的mysqlbinlog。
我在测试的时候主节点的mysqlbinlog是V4.4的,从节点的mysqlbinlog是V3.3的。简直是噩梦。
老版本的mysqlbinlog不能正常读取新版本下产生的binlog日志文件。