第三版_基于Mycat的MySQL主从读写分离配置详解与示例
完整文章下载地址:http://download.csdn.net/detail/dreamcode/9383512
1、不使用Mycat托管MySQL主从服务器,简单使用如下配置:
writeType="0"dbType="mysql" dbDriver="native"switchType="1" slaveThreshold="100">
password="123456">
2、使用Mycat托管主从切换,使用如下配置:
writeType="0" dbType="mysql"dbDriver="native" switchType="2" slaveThreshold="100">
password="123456">
password="www.com.workssys"/>
(1)注意,如果只有一个writeHost,主挂了,读也不能用。writeType=0,写操作只发第一个writeHost,发生了切换,原来的从变为主,所有写操作在原来的从执行,如果不是双向复制原来的主数据就是旧的。切换间隔是5次心跳时间,默认是10 * 5=50秒(第一次10秒没响应,后面可能会变成15秒检测,然后20秒,最后真的没响应就认为挂了),心跳配置在server.xml,使用dataNodeHeartbeatPeriod参数:对后端所有读、写库发起心跳的间隔时间,默认是10秒。
(2)注意,切换后重启原来的主,如果主从不同步 ,报错:Slave_SQL_Running:No
数据保证一致后,执行:
mysql> slave stop;
Query OK, 0 rows affected(0.00 sec)
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
Query OK, 0 rows affected(0.00 sec)
mysql> slave start;
Query OK, 0 rows affected(0.00 sec)
mysql> show slave status\G
(2)切换后,Mycat会标记新的主从状态,主从状态保存在/conf/dnindex.properties文件,正常情况是将原来的从就作为主,主从对调,修改schema.xml文件。但是如果想恢复原来的主,需要执行9066端口的Mycat管理工具的switch命令切换数据源:
switch @@datasource name:index
name:schema中配置的dataHost 中name。
index:schema中配置的dataHost 的writeHost index 位标,即按照配置顺序从上到下的一次顺序,从0开始,即第一个是WriteHost是0,另一个就是1。
切换数据源时,会将原数据源所有的连接池中连接关闭,并且从新数据源创建新连接,此时mycat服务不可用。
dnindex.properties文件记录了当前的活跃writer。
writeType="0"dbType="mysql" dbDriver="native">
mysql> show @@datasource;
+----------+---------+-------+----------------+------+------+--------+------+--
|DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE |
+----------+---------+-------+----------------+------+------+--------+------+--|blog | master | mysql | 121.40.121.133 | 3306 | W | 0 | 10 | 100 | 16 |
|blog | master2 | mysql | 127.0.0.1 | 3306 | W | 0 | 0 | 100 | 0 |
+----------+---------+-------+----------------+------+------+--------+------+--2rows in set (0.00 sec)
mysql> switch @@datasource blog:1;
Query OK, 1 row affected (1min 0.05 sec)
(3)切换后,查看哪一个在执行库操作
show @@heartbeat、show @@backend
观察RS_CODE字段
(4)主突然宕机后,恢复顺序:
1)查看数据是否同步,人为同步数据,同步数据时注意,主从同步状态时一定要在主的那一端执行操作,然后主会同步到从;但是一旦在从那一端操作的话,执行到主,主又会返回给从,如执行下面的操作,有drop table操作非常危险
2)恢复主节点
3)在DB中做主从对调,先停止原从节点的从复制操作slave stop,再启动原主节点的从复制操作slave start
4)到新的从服务器执行以下语句,查看主从状态是否正常,首先手动启动新的slave,因为加入了skip-slave-start参数
slave start
show slavestatus \G
5)执行插入验证,至此操作结束
6)注意:Mycat不要重启,心跳一直会检测,在DB里把主从对调好就没错误提示了,恢复了心跳就会恢复正常
7)注意:如需要恢复原来配置,执行switch操作,但不建议这样做(switch操作执行较慢,并且似乎有问题,并不能保证执行正确)。switch之前要检查日志主的心跳有没有恢复正常,正常了才能切。
mysql -utest -ptest -hlocalhost -P9066 -DTESTDB
switch @@datasource localhost1:0
8)注意:目前主从都是通过show slave status,当主宕机以后,发生切换,从变为主,原来的主变为从,这时候show slave status就会发生错误,因为原来的主没有开启slave,不建议直接使用switch操作,而是在DB中做主从对调。
(5)特别注意:schema中的每一个dataHost的host属性值必须唯一,否则会出现主从在所有dataHost中全部切换的现象,如下所示是不对的,当一组切换时,另一组也同时切换。
(6)注意:每天从主的那一端备份全量数据库和增量数据库
(7)注意:修改schema.xml要在linux下操作,否则出现编码错误
(8)修改schema.xml后不需要执行switch命令,重启mycat后自动回复原始状态
(9)新增表或修改schema后,重新部署顺序:1.修改Mycat Schema;2.更新MySQL;3.部署新应用
3、Mycat 1.4 支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠
writeType="0"dbType="mysql"dbDriver="native" switchType="2" slaveThreshold="100">
password="123456">
password="123456"/>
(1)设置balance="1"与writeType="0"
1) 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上分发。
2) WriteType参数设置:
<1> writeType="0",所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost。如果都挂了,那就悲剧了,起来哪个,写哪个,很有可能数据不一致;所以不要数据库恢复之后不要让mycat切回。
<2>writeType="1",所有写操作都随机的发送到配置的writeHost。
<3>writeType="2",没实现。
“readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,目前mycat 1.3和1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。”
(2)设置 switchType="2" 与slaveThreshold="100"
“Mycat心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2" 与slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制。Mycat心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running","Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延。“