Mysql-5.6基于GTID主从复制

作者:aha45  发布日期:2014-05-26 15:56:38

wKioL1OB8EeDF_SBAAEYFXPU8AE375.jpg

一、术语解析

1.TID:Transaction ID,事务的ID号:也就是说在mysql复制中每一个事务都有自己的ID号(随机数)

2.GTID:Global Transaction ID,全局事务ID,在整个事务架构中每一个事务ID号是全局唯一的,不止是在一个节点上而是整个主从复制架构中每任何两个事务的ID号都不会相同。

3.全局事务ID是怎么生成的?简单来讲是由mysql服务器自动管理的,在mysql5.6以后每一个mysql服务器都有一个全局唯一的ID号叫做uuid,通用唯一识别码 (Universally Unique Identifier),而GTID就是由当前节点的UUID(一个128位的随机数)和为当前节点生成的随机数(TID)组成的,因此只要UUID不同再在此基础上保证事务ID不同就保证全局不一样了。

4.全局事务ID有何用处?简单来讲GTID能够保证让一个从服务器到其他的从服务器那里实现数据复制而且能够实现数据整合的。GTID在分布式架构中可以保证数据的一致性。从而也实现了mysql的高可用性。

5.GTID相关操作:默认情况下将一个事务记录进二进制文件时将首先记录它的GTID而且GTID和事务相关信息一并要发送给从服务器由从服务器在在本地应用认证但是绝对不会改变原来的事务ID号。

6.因此在GTID的架构上就算有了N层架构,复制是N级架构、事务ID依然不会改变;有效的保证了数据的完整和安全性。

二、新增选项

1.MySQL5.6引入的GTID(Global Transaction IDs)使得其复制功能的配置、监控及管理变得更加易于实现,且更加健壮。

2.要在MySQL 5.6中使用复制功能,其服务配置段[mysqld]中于少应该定义如下选项:

2.1. binlog-format:二进制日志的格式,有row、statement和mixed几种类型;

需要注意的是:当设置隔离级别为读提交READ-COMMITED必须设置二进制日志格式为ROW,现在MySQL官方认为STATEMENT这个已经不再适合继续使用;但mixed类型在默认的事务隔离级别下,可能会导致主从数据不一致;log-slave-updates(slave更新是否记入日志)、gtid-mode(gtid类型)、enforce-gtid-consistency(强制gtid一致性)、report-port和report-host:用于启动GTID及满足附属的其它需求;

2.2.master-info-repository(资源库)和relay-log-info-repository:启用此两项,可用于实现在崩溃时保证二进制及从服务器安全的功能;

2.3.sync-master-info:确保服务器崩溃时无信息丢失;

2.4.slave-paralles-workers:设定从服务器的SQL线程数;0表示关闭多线程复制功能;值与你要复制的数据库数目相同即可;

2.5.binlog-checksum校验码、master-verify-checksum和slave-sql-verify-checksum:启用复制有关的所有校验功能;

2.6.binlog-rows-query-log-events:用于在二进制日志详细记录事件相关的信息,可降低故障排除的复杂度;

2.7.log-bin:启用二进制日志,这是保证复制功能的基本前提;

2.8.server-id:同一个复制拓扑中的所有服务器的id号必须惟一;

 

三、操作步骤

主服:station20:192.168.1.20

从服:station21:192.168.1.21

support-files/my-default.cnf 几乎为空文件,mysql-5.6不提供my.cnf

修改主节点配置文件

[root@station20~]#vim/etc/my.cnf
server-id=1
log-bin=mysql-bin
binlog_format=row二进制格式改为行row模式,三种模式statement语句模式,row行模式,mixed混合模式
当设置隔离级别为READ-COMMITED必须设置二进制日志格式为ROW,现在MySQL官方认为STATEMENT这个已经不再适合继续使用;但mixed类型在默认的事务隔离级别下,可能会导致主从数据不一致;
#添加以下这些选项
log-slave-updates=trueslave更新是否记入日志
gtid-mode=on启用gtid类型,否则就是普通的复制架构
enforce-gtid-consistency=true强制GTID的一致性
master-info-repository=TABLE主服信息记录库=表/文件
relay-log-info-repository=TABLE中继日志信息记录库
sync-master-info=1同步主库信息
slave-parallel-workers=4从服务器的SQL线程数,要复制库数目相同
binlog-checksum=CRC32校验码
master-verify-checksum=1主服校验
slave-sql-verify-checksum=1从服校验
binlog-rows-query-log_events=1二进制日志详细记录事件
report-port=3306提供复制报告端口
report-host=station20.example.com提供复制报告主机
[root@station20~]#servicemysqldrestart
[root@station20~]#mysql-e"showmasterstatus;"
已执行过的GTID集Executed_Gtid_Set
+------------------+----------+--------------+------------------+-------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|Executed_Gtid_Set|
+------------------+----------+--------------+------------------+-------------------+
|mysql-bin.000002|120||||
+------------------+----------+--------------+------------------+-------------------+
mysql5.6以后每台mysql服务器都有一个全局唯一的ID号叫做uuid,GTID就是由当前节点的UUID(一个128位的随机数)和为当前节点生成的随机数(TID)组成的,因此只要UUID不同再在此基础上保证事务ID不同就保证全局不一样。
[root@station20~]#mysql-e"showglobalvariableslike'%uuid%';"
+---------------+--------------------------------------+
|Variable_name|Value|
+---------------+--------------------------------------+
|server_uuid|3eda76df-e355-11e3-8d42-000c294698bf|
+---------------+--------------------------------------+
创建复制用户
mysql>grantreplicationslave,replicationclienton*.*torepluser@'192.168.1.%'identifiedby'replpass';
mysql>flushprivileges;

 

 

修改从节点配置文件

[root@station20~]#scp/etc/my.cnf192.168.1.21:/etc/my.cnf
[root@station21~]#vim/etc/my.cnf从master复制my.cnf,修改关键部分
server-id=2
log-bin=mysql-bin
binlog_format=row
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=4
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
report-port=3306
report-host=station21.example.com
[root@station21~]#servicemysqldrestart
[root@station21~]#mysql-e"showglobalvariableslike'%uuid%';"
+---------------+--------------------------------------+
|Variable_name|Value|
+---------------+--------------------------------------+
|server_uuid|08c840ad-e35c-11e3-8d6f-000c29ed6c68|
+---------------+--------------------------------------+
从库连接主库
mysql>changemastertomaster_host='192.168.1.20',master_user='repluser',master_password='replpass',master_auto_position=1;
mysql>startslave;
mysql>showslavestatus\G;
***************************1.row***************************
Slave_IO_State:Waitingformastertosendevent
Master_Host:192.168.1.20
Master_User:repluser
Master_Port:3306
Connect_Retry:60
Master_Log_File:mysql-bin.000003
Read_Master_Log_Pos:151
Relay_Log_File:station21-relay-bin.000002不用配置,自动生成中继日志
Relay_Log_Pos:361
Relay_Master_Log_File:mysql-bin.000003
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:151
Relay_Log_Space:569
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:0
Master_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:3eda76df-e355-11e3-8d42-000c294698bf
Master_Info_File:mysql.slave_master_info
SQL_Delay:0
SQL_Remaining_Delay:NULL
Slave_SQL_Running_State:Slavehasreadallrelaylog;waitingfortheslaveI/Othreadtoupdateit
Master_Retry_Count:86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position:1
mysql>showprocesslist;
|Id|User|Host|db|Command|Time|State|Info|
|1|systemuser||NULL|Connect|164|Slavehasreadallrelaylog;waitingfortheslaveI/Othreadtoupdateit|NULL|
|2|systemuser||NULL|Connect|164|Waitingformastertosendevent|NULL|
|3|systemuser||NULL|Connect|164|WaitingforaneventfromCoordinator|NULL|
|4|systemuser||NULL|Connect|164|WaitingforaneventfromCoordinator|NULL|
|5|systemuser||NULL|Connect|164|WaitingforaneventfromCoordinator|NULL|
|6|systemuser||NULL|Connect|164|WaitingforaneventfromCoordinator|NULL|
|7|root|localhost|NULL|Query|0|init|showprocesslist|
4个复制线程,主库上同时创建4个数据库,每个数据库事务启动一个复制线程,这些复制线程可同时启动;

测试主从测试
主库
mysql>createdatabasehellodb;
mysql>showdatabases;
+--------------------+
|Database|
+--------------------+
|information_schema|
|hellodb|
|mysql|
|performance_schema|
|test|
+--------------------+
mysql>showprocesslist;
|Id|User|Host|db|Command|Time|State|Info|
|1|repluser|slave:60241|NULL|BinlogDumpGTID|1178|Masterhassentallbinlogtoslave;waitingforbinlogtobeupdated|NULL|
|2|root|localhost|NULL|Query|0|init|showprocesslist|
从库
mysql>showdatabases;
+--------------------+
|Database|
+--------------------+
|information_schema|
|hellodb|
|mysql|
|performance_schema|
|test|
+--------------------+
mysql>showprocesslist;
|Id|User|Host|db|Command|Time|State|Info
|1|systemuser||NULL|Connect|126|Slavehasreadallrelaylog;waitingfortheslaveI/Othreadtoupdateit|NULL
|2|systemuser||NULL|Connect|920|Waitingformastertosendevent|NULL
|3|systemuser||NULL|Connect|920|WaitingforaneventfromCoordinator|NULL
|4|systemuser||NULL|Connect|920|WaitingforaneventfromCoordinator|NULL
|5|systemuser||NULL|Connect|920|WaitingforaneventfromCoordinator|NULL
|6|systemuser||NULL|Connect|126|WaitingforaneventfromCoordinator|NULL
|7|root|localhost|NULL|Query|0|init|showprocesslist

 

Tag标签: Mysql   主从复制   GTID  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规