干货如何正确搭建MySQL主从

治疗青春痘北京医院 http://m.39.net/pf/a_8736814.html

随着业务不断的增长,一台MySQL服务器已经很难满足业务上的需求,此时我们首先考虑的就是对MySQL搭建主从并实现MySQL的读写分离,来负担业务上的压力,今天给大家分享如何正确的搭建MySQL主从。

在分享之前,我们先了解下MySQL5.6开始增加的GTID(GlobalTransactionID,全局事务ID)这个新特性,GTID是用来强化数据库的主备一致性,故障恢复,以及容错能力,用于取代过去基于BingLog偏移量的主从复制(即:基于binlog和position的异步复制)。

借助GTID,在发生主备切换的情况下,MySQL的其他slave可以自动在新主上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制position发生误操作的风险。另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。

GTID的组成:

GTID是由server_uuid和事务id组成的,即GTID=server_uuid:transaction_id。

server_uuid,是在MySQL第一次启动时自动生成并持久化到auto.cnf文件(存放在数据目录下,每台机器的server_uuid都不一样。

transaction_id,是一个从1开始的自增计数,表示在这个主库上执行的第n个事务。MySQL会保证事务与GTID之间的1:1映射,如:b6af5b5c-f-11e9-bed3-c29b85ea6:1

表示在以b6af5b5c-f-11e9-bed3-c29b85ea6为唯一标志的MySQL实例上执行的第1个数据库事务。

一组连续的事务可以用-连接的事务序号范围表示。例如:b6af5b5c-f-11e9-bed3-c29b85ea6:1-5

GTID复制的好处:

基于BinLog偏移量复制,当连接发生故障时,需要重新连接到master主机,需要找到binlog和position,然后changemasterto连接到master主机,此过程需要人工来做,比较麻烦,也容易出错,尤其是master写操作较多时,更不容易确定position,如果flushtablewithreadlock,势必会影响到线上业务。而GTID复制方式不需要找master的binlog和position,只需要知道master的ip、端口、账号密码,即可进行复制,MySQl会通过内部机制自动找点同步(MASTER_AUTO_POSITION=1),大大降低了复制时的工作。

GTID复制的工作原理:

1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中

2、slave端的I/O线程将变更的binlog,写入到本地的relaylog中

3、SQL线程从relaylog中获取GTID,然后对比slave端的binlog是否有记录(所以MySQL5.6slave端必须开启binlog)

4、如果有记录,说明该GTID的事务已经执行,slave会忽略

5、如果没有记录,slave就会从relaylog中执行该GTID的事务,并记录到binlog

6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描

使用GTID复制需要注意:

1、不允许在同一个事务内对事务表和非事务进行DML操作,例如:在同一个事务内先updateinnodb表,然后updatemyisam表。因为GTID强制每一个GTID对应一个事务,而在同一个事务内既操作innodb表又操作myisam,就会产生两个GTID;

2、不允许CREATETABLE…SELECT语句,此语句是将查询结果转存到一个新表中,首先这种语句对于statement格式的binlog是不安全的;而对于row格式的binlog,这种语句在binlog实际是分成两个event进行记录的,一个记录create创建操作,一个记录insert操作,那么就有可能这两个操作是对应到同一个GTID上,而当将这两个拥有相同GTID的event传到从库时,从库就会忽略拥有相同GTID的insert操作,造成数据丢失;

3、CREATETEMPORARYTABLE和DROPTEMPORARYTABLE不允许在事务内执行,只有在事务以外并且auto


转载请注明:http://www.aierlanlan.com/grrz/2700.html

  • 上一篇文章:
  •   
  • 下一篇文章: