mysql5.6 基於GTID及多線程複製詳解

一 GTID 詳解php

官方文檔:http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html在這篇文檔裏,咱們能夠知道全局事務 ID 的官方定義是:GTID = source_id:transaction_idcss

MySQL 5.6 中,每個 GTID 表明一個數據庫事務。在上面的定義中,source_id 表示執行事務的主庫 uuid(server_uuid),transaction_id 是一個從 1 開始的自增計數,表示在這個主庫上執行的第 n 個事務。MySQL 會保證事務與 GTID 之間的 1 : 1 映射。html

例如,下面就是一個 GTID:3E11FA47-71CA-11E1-9E33-C80AA9429562:50 表示在以 "3E11FA47-71CA-11E1-9E33-C80AA9429562" 爲惟一標示的 MySQL 實例上執行的第 50 個數據庫事務。很容易理解,MySQL 只要保證每臺數據庫的 server_uuid 全局惟一,以及每臺數據庫生成的 transaction_id 自身惟一,就能保證 GTID 的全局惟一性。node

2.什麼是server_uuid?mysql

MySQL 5.6 用 128 位的 server_uuid 代替了本來的 32 位 server_id 的大部分功能。緣由很簡單,server_id 依賴於 my.cnf 的手工配置,有可能產生衝突 —— 而自動產生 128 位 uuid 的算法能夠保證全部的 MySQL uuid 都不會衝突。算法

在首次啓動時 MySQL 會調用 generate_server_uuid() 自動生成一個 server_uuid,而且保存到 auto.cnf 文件 —— 這個文件目前存在的惟一目的就是保存 server_uuidsql

在 MySQL 再次啓動時會讀取 auto.cnf 文件,繼續使用上次生成的 server_uuid。使用 SHOW 命令能夠查看 MySQL 實例當前使用的 server_uuid?:SHOW GLOBAL VARIABLES LIKE 'server_uuid';它是一個 MySQL 5.6 global variables,文檔連接在這裏: server_uuid? 全局惟一的 server_uuid 的一個好處是:能夠解決由 server_id 配置衝突帶來的 MySQL 主備複製的異常終止(BUG #33815?)數據庫

在MySQL 5.6,Slave 向 Master 申請 binlog 時,會首先發送本身的 server_uuid,Master 用 Slave 發送的 server_uuid 代替 server_id (MySQL 5.6 以前的方式)做爲 kill_zombie_dump_threads 的參數,終止衝突或者僵死的 BINLOG_DUMP 線程vim

 

二 多線程複製安全

MySQL 5.6以前的版本,同步複製是單線程的,隊列的,只能一個一個執行,在5.6裏,能夠作到多個庫之間的多線程複製,例如數據庫裏,存放着用戶表,商品表,價格表,訂單表,那麼將每一個業務表單獨放在一個庫裏,這時就能夠作到多線程複製,但一個庫裏的表,多線程複製是無效的。

注,每一個數據庫僅能使用一個線程,複製涉及到多個數據庫時多線程複製纔有意義。

 

三 mysql複製管理工具

Mysql 5.6 複製管理工具

官方下載地址:http://dev.mysql.com/downloads/tools/utilities/#downloads

注,這裏只簡單的介紹一下,具體的工具使用,不具體說明,使用方法 命令—help

  • mysqlreplicate 快速啓動複製

  • mysqlrplcheck 快速檢查複製環境

  • mysqlrplshow 顯示覆制拓撲

  • mysqlfailover 故障轉移

  • mysqlrpladmim 管理工具

 

四 配置過程

環境

操做系統 Centso 6.4 x86_64

軟件版本 mysql 5.6.19

master 192.168.200.17

slave     192.168.200.18

mysql 安裝過程略

1 配置選項說明

  • binlog-format:二進制日誌的格式,有row、statement和mixed幾種類型;須要注意的是:當設置隔離級別爲READ-COMMITED必須設置二進制日誌格式爲ROW,如今MySQL官方認爲STATEMENT這個已經再也不適合繼續使用;但mixed類型在默認的事務隔離級別下,可能會致使主從數據不一致;
  • log-slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report-host:用於啓動GTID及知足附屬的其它需求;
  • master-info-repository和relay-log-info-repository:啓用此兩項,可用於實如今崩潰時保證二進制及從服務器安全的功能;
  • sync-master-info:啓用之可確保無信息丟失;
  • slave-paralles-workers:設定從服務器的SQL線程數;0表示關閉多線程複製功能;
  • binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:啓用複製有關的全部校驗功能;
  • binlog-rows-query-log-events:啓用之可用於在二進制日誌記錄事件相關的信息,可下降故障排除的複雜度;
  • log-bin:啓用二進制日誌,這是保證複製功能的基本前提;
  • server-id:同一個複製拓撲中的全部服務器的id號必須唯一。

 

配置master節點

[root@node1 ~]# vim /etc/my.cnf 
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8

datadir = /mydata/data
log-bin=/binlog/mysql
innodb_file_per_table = 1

sync_binlog = 1
binlog_format=row

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id       = 1

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=node1.daphne.com

從新啓動mysql

[root@node1 ~]# service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

查看GTID 相關信息

mysql> show global variables like '%gtid%';
+--------------------------+------------------------------------------+
| Variable_name            | Value                                    |
+--------------------------+------------------------------------------+
| enforce_gtid_consistency | ON                                       |
| gtid_executed            | 99ba0aa4-0c10-11e4-96dd-000c298632f6:1-3 |
| gtid_mode                | ON                                       |
| gtid_owned               |                                          |
| gtid_purged              |                                          |
+--------------------------+------------------------------------------+
5 rows in set (0.01 sec)

建立有複製權限的用戶

mysql> grant replication slave on *.* to user@192.168.200.18 identified by 'redhat';

配置從服務器

[root@node2 ~]# vim /etc/my.cnf 
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8

datadir = /mydata/data
log-bin=/binlog/mysql
innodb_file_per_table = 1

sync_binlog = 1
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
# 
#skip-networking

# Replication Master Server (default)
# binary logging is required for replication

# binary logging format - mixed recommended
binlog_format=row

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id       = 10
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=node2.daphne.com

從新啓動mysql

[root@node2 ~]# service mysqld restart
Shutting down MySQL..                                      [  OK  ]
Starting MySQL.                                            [  OK  ]

在從服務器上進行復制

mysql> change master to master_host='192.168.200.17',master_user='user',master_password='redhat',master_auto_position=1;
mysql> start slave;

查看複製狀態

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.200.17
                  Master_User: user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql.000007
          Read_Master_Log_Pos: 191
               Relay_Log_File: node2-relay-bin.000006
                Relay_Log_Pos: 393
        Relay_Master_Log_File: mysql.000007
             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: 191
              Relay_Log_Space: 982
              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: 99ba0aa4-0c10-11e4-96dd-000c298632f6
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
           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: 99ba0aa4-0c10-11e4-96dd-000c298632f6:1-3
            Executed_Gtid_Set: 99ba0aa4-0c10-11e4-96dd-000c298632f6:1-3
                Auto_Position: 1
1 row in set (0.00 sec)

測試主從複製

相關文章
相關標籤/搜索