mysql高可用架构 -> MHA主从复制-03
GTID复制技术说明
GTID的全称为 global transaction identifier ,可以翻译为全局事务标示符,GTID在原始master上的事务提交时被创建。GTID需要在全局的主-备拓扑结构中保持唯一性,GTID由两部分组成: GTID = source_id transaction_id source_id:用于标示源服务器,用server_uuid来表示,这个值在第一次启动时生成,并写入到配置文件data/auto.cnf中 transaction_id:则是根据在源服务器上第几个提交的事务来确定。
一个GTID的生命周期包括:
1.事务在主库上执行并提交给事务分配一个gtid(由主库的uuid和该服务器上未使用的最小事务序列号),该GTID被写入到binlog中。
2.备库读取relaylog中的gtid,并设置session级别的gtid_next的值,以告诉备库下一个事务必须使用这个值
3.备库检查该gtid是否已经被其使用并记录到他自己的binlog中。slave需要担保之前的事务没有使用这个gtid,也要担保此时已分读取gtid,但未提交的事务也不恩呢过使用这个gtid.
4.由于gtid_next非空,slave不会去生成一个新的gtid,而是使用从主库获得的gtid。这可以保证在一个复制拓扑中的同一个事务gtid不变。由于GTID在全局的唯一性,通过GTID,我们可以在自动切换时对一些复杂的复制拓扑很方便的提升新主库及新备库,例如通过指向特定的GTID来确定新备库复制坐标。
GTID组成
GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增
基于GTID的主从复制
先决条件 1)主库和从库都要开启binlog 2)主库和从库server-id不同 3)要有主从复制用户
配置主从复制文件
51节点为主库,52,53 为从库,除了bin-log日志不开,server_id 不同,其余都一样
mysql> system vim /etc/my.cnf //在mysql中直接编辑配置 [mysqld] server-id=1 user=mysql basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/tmp/mysql.sock log-error=/data/mysql/error.log gtid_mode=ON //启用gtid类型,否则就是普通的复制架构 enforce_gtid_consistency //强制GTID的一致性 skip-name-resolve # 跳过域名解析 log-slave-updates=1 # slave更新是否记入日志(5.6必须的) log_bin=mysql-bin //开启bin-log日志,只有主库开启,这样更节省资源
创建主从复制用户
#登录数据库 [root@mysql-db01 ~]# mysql //在主库创建授权用户 #创建rep用户 mysql> grant replication slave on *.* to rep@'10.0.0.%' identified by '123';
从库开启复制
52,53为从库,登录数据库执行 change master to
change master to master_user='rep', master_host='10.0.0.51', master_password='123', master_auto_position=1; #配置复制主机信息 mysql> change master to #主库IP -> master_host='10.0.0.51', #主库复制用户 -> master_user='rep', #主库复制用户的密码 -> master_password='123', #GTID位置点 -> master_auto_position=1;
查看状态
start slave; //开启从库 show slave status\G //查看状态 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.0.0.51 Master_User: rep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 154 Relay_Log_File: db02-relay-bin.000002 Relay_Log_Pos: 367 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Auto_Position: 1 //1为开启,0为关闭
检查GTID状态
mysql> show global variables like '%gtid%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | enforce_gtid_consistency | ON | #执行GTID一致 | gtid_executed | | | gtid_mode | ON | #开启GTID模块 | gtid_owned | | | gtid_purged | | +--------------------------+-------+
注:主库从库都需要开启GTID否则在做主从复制的时候就会报错
报错信息
传统的主从复制开启
#创建rep用户 mysql> grant replication slave on *.* to rep@'10.0.0.%' identified by '123';
mysql> mysql> show master status; +------------------+----------+--------------+------------------+----------------------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+----------------------------------------+ | mysql-bin.000003 | 194 | | | fc221cfa-db16-11e8-b7c2-000c29afa37f:1 | +------------------+----------+--------------+------------------+----------------------------------------+ 1 row in set (0.00 sec)
注:在以往如果是基于binlog日志的主从复制,则必须要记住主库的master状态信息。
从库开启主从复制
如果是之前做过gtid的,先关闭slave,注释掉gtid配置 stop slave; reset slave all; CHANGE MASTER TO MASTER_HOST='10.0.0.51', MASTER_USER='rep', MASTER_PASSWORD='123', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=194;
查看是否成功
start slave show slave status\G Auto_Position: 0 //变为0为关闭
mysql> show slave status\G
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.0.0.51 Master_User: rep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 480 Relay_Log_File: db02-relay-bin.000006 Relay_Log_Pos: 360 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes //io,sql线程开启 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: 480 Relay_Log_Space: 772 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: fc221cfa-db16-11e8-b7c2-000c29afa37f Master_Info_File: /usr/local/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: fc221cfa-db16-11e8-b7c2-000c29afa37f:1 Executed_Gtid_Set: fc221cfa-db16-11e8-b7c2-000c29afa37f:1 Auto_Position: 0 //关闭gtid Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)