GTID作为mysql5.6带来的新特性,在搭建replicate过程中,可以更快速方便,感觉上更加‘自动化’。 #一、修改配置文件
###1.修改主服务器配置文件my.cnf,添加下面的几行:
binlog-format=ROWlog-slave-updates=truegtid-mode=on # GTID onlyenforce-gtid-consistency=true # GTID onlymaster-info-repository=TABLErelay-log-info-repository=TABLEsync-master-info=1slave-parallel-workers=2binlog-checksum=CRC32master-verify-checksum=1slave-sql-verify-checksum=1binlog-rows-query-log-events=1server-id=1report-port=3306port=3306log-bin=black-bin.logreport-host=blackinnodb_flush_log_at_trx_commit=1sync_binlog=1
###2.修改从服务器配置文件,添加下面几行:
binlog-format=ROWlog-slave-updates=truegtid-mode=on # GTID onlyenforce-gtid-consistency=true # GTID onlymaster-info-repository=TABLErelay-log-info-repository=TABLEsync-master-info=1slave-parallel-workers=2binlog-checksum=CRC32master-verify-checksum=1slave-sql-verify-checksum=1binlog-rows-query-log-events=1server-id=2report-port=3307port=3307log-bin=blue-bin.logreport-host=blueinnodb_flush_log_at_trx_commit=1sync_binlog=1
可以看到主与从的配置文件基本上是相同的,这样也便于在主服务器挂掉的时候,不用修改配置文件即可把从服务器提升为主。
#二、在master上创建用户
mysql> create user 'rep'@'%' identified by 'rep';mysql> grant replication slave on *.* to 'rep'@'%';
#三、 从master导出数据
###1.master中设置所有表只读:
mysql> FLUSH TABLES WITH READ LOCK;
###2.用mysqldump导出全部数据:
->/usr/local/mysql/bin/mysqldump -uroot -p -h192.168.1.10 -P3306 --all-databases --triggers --routines --events >all.sql
###3.解锁表格:
mysql> UNLOCK TABLES;
###4.slave导入数据
-> mysql -uroot -p -h192.168.1.11 -P3307 < all.sql
###5.change master mysql > CHANGE MASTER TO MASTER_HOST='192.168.1.9', MASTER_PORT=3306, MASTER_USER='rep',MASTER_PASSWORD='rep', master_auto_position=1; mysql > SHOW warnings; +-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Level | Code |Message | +-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Note | 1759 | Sending passwords IN plain text WITHOUT SSL/TLS IS extremely insecure. | | Note | 1760 | Storing MySQL USER name OR password information IN the master.info repository IS NOT secure AND IS therefore NOT recommended. Please see the MySQL Manual FOR more about this issue AND possible alternatives. | +-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 2 ROWS IN SET (0.00 sec)
这里保存的是明文密码,存在密码泄露的风险。
mysql > SELECT * FROM mysql.slave_master_info \G; mysql > SELECT * FROM mysql.slave_relay_log_info \G;mysql > START slave;mysql > SHOW warnings;+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Level | Code | Message |+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Note | 1753 | slave_transaction_retries IS NOT supported IN multi-threaded slave mode. IN the event OF a transient failure, the slave will NOT retry the TRANSACTION AND will stop. |+-------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 ROW IN SET (0.00 sec)
多线程模式掉线不重连。
从服务器上看一下状态:
mysql > SHOW slave STATUS \G;*************************** 1. ROW *************************** Slave_IO_State: Waiting FOR master TO send event Master_Host: 127.0.0.1 Master_User: rep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: black-bin.000001 Read_Master_Log_Pos: 1770 Relay_Log_File: mysql_sandbox5611-relay-bin.000002 Relay_Log_Pos: 1980 Relay_Master_Log_File: black-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 1770 Relay_Log_Space: 2196 Until_Condition: NONE Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 05b47d41-7b10-11e2-9fff-00241db92e69 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has READ ALL relay log; waiting FOR the slave I/O thread TO UPDATE it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: 05b47d41-7b10-11e2-9fff-00241db92e69:1-6 Executed_Gtid_Set: 05b47d41-7b10-11e2-9fff-00241db92e69:1-6 Auto_Position: 11 ROW IN SET (0.00 sec)
主服务器上面也可以看到一些信息:
mysql > SHOW master STATUS;+------------------+----------+--------------+------------------+------------------------------------------+| File | POSITION | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------------------------------+| black-bin.000001 | 1770 | | | 05b47d41-7b10-11e2-9fff-00241db92e69:1-6 | +------------------+----------+--------------+------------------+------------------------------------------+1 ROW IN SET (0.00 sec)mysql > SHOW slave hosts;+-----------+------+------+-----------+--------------------------------------+| Server_id | Host | Port | Master_id | Slave_UUID |+-----------+------+------+-----------+--------------------------------------+| 2 | blue | 3306 | 1 | 1d1e71e7-7b10-11e2-9fff-00241db92e69 |+-----------+------+------+-----------+--------------------------------------+1 ROW IN SET (0.00 sec)
#四、配置文件参数含义:
###1.binlog-format:
采用了row-based,据说5.6对row-based replication做了优化。
###2.gtid-mode与enforce-gtid-consistency:
传统方式下,主从是基于master binary logfile 与 binary logfile postition的, 当主服务器挂掉,需要把某个从服务器提升为主的时候,需要做很多工作, 主要原因还是在于主从复制其实是异步的, 导致多台从服务器间的数据不一致,有的同步速度快,有的速度慢, 很有可能每一台从服务器上面的Read_Master_Log_Pos都是不同的。 首先要根据Read_Master_Log_Pos来确定每台从服务器缺少binlog中的哪些transactions(events),帮它们补充完之后, 从服务器间的数据完全一致了,然后才能把任意一台从服务器提升为主。 这个过程,人工做起来实在是比较痛苦,还好有一些开源的第三方程序可以自动做到,比如MHA。为了从根本上解决这个问题,gtid(Global Transaction ID)就被开发了出来。mysql为每一个transactions都生成了独一无二的ID,由二部分构成: 1) mysql服务器的128bit的UUID 2) 自增的一个int变量。 此服务器的第一个transaction的id就是1,第二个就是2…比如: 22096C54-FE03-4B44-95E7-BD3C4400AF21:4711这样GTID就可以在全局范围内唯一标识一个transaction。GTID也会写入binary log,然后被传输到从服务器。有了GTID,主从复制也不再基于master的binary logfile和logfile postition,从服务器连接到主服务器之后,把自己执行过的GTID(Executed_Gtid_Set) 曾经获取到的GTID(Retrieved_Gtid_Set)发给主服务器,主服务器把从服务器缺少的GTID及对应的transactions发过去即可。当主服务器挂掉的时候,可以任意选择一台从服务器直接提升为主,然后其它从服务器连接到新的主服务器之后,首先把自已已经执行过的GTID发给新主服务器,新主根据这些GTID,判断自己缺少哪些transactions,先把自己补全,然后再把从服务器缺少的GTID及对应的transactions发给从服务器。另外,gtid与myisam的关系,也不是很明确。master-info-repository与relay-log-info-repository都设置为TABLE, 默认值是FILE, 比如master info就保存在master.info文件中,relay log info保存在relay-log.info文件中,如果服务器意外关闭,正确的relay info 没有来得及更新到 relay-log.info文件中,那就比较悲剧了。
###3.mysql.slave_master_info与 mysql.slave_relay_log_info:
这二个table都是innodb类型的, 天生就支持事务,比写文件靠谱多了。
###4.sync-master-info:
如果这个值大于0的话,复制中的slave机器就会在每次sync_master_info事件完成后同步它的master.info信息到对应的磁盘文件中。
###5.slave-parallel-workers:
5.6以前的从服务器,有一个io线程负责接收binary log,还有一个sql线程负责执行binary log中的sql语句。如果主服务器的数据更新相当频繁,而从服务器一般来说硬件性能要低于主服务器,如果只有一个sql线程的话,万一某条语句执行速度过慢,就卡在这里了,会导致从服务器落后比较长的时间。采用多个sql线程,每个sql线程处理不同的database,提高了并发性能,即使某database的某条语句暂时卡住,也不会影响到后续对其它的database进行操作。ps:如果只有一个database要同步,那么多个sql线程也没有什么意义。ps2: show slave status里面的Exec_Master_Log_Pos,在多个sql线程的情况下,变为一个低水位线标识,并非表示最近执行到的pos。ps3: START SLAVE UNTIL SQL_AFTER_MTS_GAPS; 可以保证sql thread执行完relay log中全部的语句,然后自动stop slave。如果要把slave-parallel-workers的值从非0改为0(切换回单sql线程),需要这样做:START SLAVE UNTIL SQL_AFTER_MTS_GAPS;SET @@GLOBAL.slave_parallel_workers = 0;START SLAVE SQL_THREAD;
###6.binlog-checksum=CRC32,master-verify-checksum=1,slave-sql-verify-checksum=1:
这也是新特性,有了checksum, 如果binlog文件在master上损坏,或者在网络传输时损坏,或者保存到slave的时候损坏,都能自动检测出来。
###7.binlog-rows-query-log-events:
只对row-based binlog有效。enable之后,会向binlog中写入更多的调试信息,比如sql语句自身都会被写进去。 mysqlbinlog -vv 可以看到。
###8.innodb_flush_log_at_trx_commit=1 与 sync_binlog=1:
这两个参数在mysql数据库调优中有着很重要的作用,当你的mysql数据库性能很差时,你应该在排除完硬件问题后,首先检查这两个参数设置的是否合适。innodb_flush_log_at_trx_commit分别可以设置成三个数值:0、1、2。值为0表示每一秒钟将内存中的数据写入log_buff中,操作系统每秒钟将buffer中的数据写入硬盘中,这样做读写性能最优,但是安全性最差。值为1表示每次事务提交时,将内存中的数据写入log_buffer中同时将数据实时落盘即写入硬盘中,这样数据安全性最高,但是性能最差。值为2表示内存中的数据在每次提交后,被写入log_buffer中,而操作系统每隔一秒中,将buffer中数据写入硬盘,这中做法可以看作是安全和性能的折中选择。当机器宕机或者掉电后,如果你的raid卡是带电池的话,最后一秒钟的buffer数据是不会丢失的。
mysql中这个默认值为1.
sync_binlog可以设置为0、1或者N三种数值。值为0,表示不主动做log刷盘动作,即由文件系统决定何时将binlog_cache中的数据写入硬盘中,或者只有在binlog_cache满了之后才会写入磁盘。0为默认值。值为1,表示每次事务提交后,就将cache中的日志数据写入文件中,这样安全性最高,但是性能最差。值为N,表示没N次事务提交后,进行数据刷盘动作。N的值可以根据自己的业务情况进行选择。
参考文章: