MySQL 5.6 基於GTID及多線程的複製詳解

一、MySQL 5.6 新特性

    MySQL 5.6 主要在查詢性能的優化、InnoDB改進以支持高吞吐量的事務、NoSQL風格的API、分區功能的改進、數據複製的改進,增加 PERFORMANCE_SCHEMA 庫以獲得數據庫性能信息等。

    1、查詢性能優化

    優化 WHERE 語句改進索引條件的處理性能,Multi-Range Read:通過隨機數據訪問來提升 SSD 上的數據讀取速度,優化文件排序:對一些組合了ORDER BY non_indexed_column和 LIMIT x的SQL語句,該特性將大大加速此類語句的執行速度。

    2、InnoDB 的改進

    MySQL 5.6 完全集成 InnoDB 作爲默認的存儲引擎。同時 5.6 版本在使用 InnoDB 上的很多細節做了改進,詳情請看這裏。

    3、提供 NoSQL 風格的 API

    該功能主要適用於將 MySQL 來作爲NoSQL 使用,而 MySQL 使用的是 memcached兼容的 API。通過該接口程序訪問數據可直達 InnoDB 存儲引擎,而無需通過 MySQL 對 SQL 的轉換過程,大大提升了數據訪問的性能。

    4、分區的改進

    顯式分區數據查詢,例如:


    SELECT * FROM employees  PARTITION (p0, p2);

    DELETE FROM employees  PARTITION (p0, p1);

    UPDATE employees PARTITION  (p0) SET store_id = 2 WHERE fname = 'Jill';

    SELECT e.id, s.city FROM  employees AS e JOIN stores PARTITION (p1) AS s ...;

    分區數據的導入導出,此功能用於快速的將某個表遷移到分區上:ALTER TABLE eEXCHANGE PARTITION p0 WITH TABLE e2;

    5、複製功能的改進

    支持多線程複製,事實上是針對每個database開啓相應的獨立線程。即每個庫有一個單獨的(sql thread)如果線上業務中,只有一個database或者絕大多數壓力集中在個別database的話,多線程併發複製特性就沒有意義了。

    支持啓用GTID,對運維人員來說應該是一件令人高興的事情,在配置主從複製,傳統的方式裏,你需要找到binlog和POS點,然後change master to指向,而不是很有經驗的運維,往往會將其找錯,造成主從同步複製報錯,在mysql5.6裏,無須再知道binlog和POS點,需要知道master的IP、端口,賬號密碼即可,因爲同步複製是自動的,mysql通過內部機制GTID自動找點同步。

    6、大大增強 PERFORMANCE_SCHEMA 數據庫

    降低了數據庫開銷、表IO的信息彙集和監控、表鎖信息彙集和監控、會話和用戶級別的監控、全局性能信息彙總。

二、GITD 詳解

    MySQL 5.6 的新特性之一,是加入了全局事務 ID (GTID) 來強化數據庫的主備一致性,故障恢復,以及容錯能力。

    1、什麼是GTID?

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

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

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

    2、什麼是server_uuid?

    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_uuid。

wKioL1U4rQLTe2VHAANHHsTAiaw568.jpg


    在 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 線程。

三、多線程複製基於庫

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

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

四、MySQL 5.6 複製管理工具

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

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

     mysqlreplicate 快速啓動複製

     mysqlrplcheck 快速檢查複製環境

     mysqlrplshow 顯示覆制拓撲

     mysqlfailover 故障轉移

     mysqlrpladmim 管理工具


五、具體配置過程

    1、環境準備

操作系統

    CentOS 6.6 x86_64

軟件版本

    Mysql 5.6.22

    2、實驗拓撲

wKiom1U4sD6x_Hu_AAF6Yes4gcA751.jpg


    3、  關閉防火牆與SELinux

# serverice iptables stop
# chkconfig iptables off
# sed -i ‘s/%SELINUX=enforcing%SELINUX=disabled%’/etc/sysconfig/selinux
# getenforce 0

    4、  配置MySQL主從複製

        A、配置選項說明

            要在MySQL 5.6中使用複製功能,其服務配置段[mysqld]中於少應該定義如下選項:


    • binlog-format:二進制日誌的格式,有rowstatementmixed幾種類型;需要注意的是:當設置隔離級別爲READ-COMMITED必須設置二進制日誌格式爲ROW,現在MySQL官方認爲STATEMENT這個已經不再適合繼續使用;但mixed類型在默認的事務隔離級別下,可能會導致主從數據不一致;

    • log-slave-updatesgtid-modeenforce-gtid-consistencyreport-portreport-host:用於啓動GTID及滿足附屬的其它需求;

    • master-info-repositoryrelay-log-info-repository:啓用此兩項,可用於實現在崩潰時保證二進制及從服務器安全的功能;

    • sync-master-info:啓用之可確保無信息丟失;

    • slave-paralles-workers:設定從服務器的SQL線程數;0表示關閉多線程複製功能;

    • binlog-checksummaster-verify-checksumslave-sql-verify-checksum:啓用複製有關的所有校驗功能;

    • binlog-rows-query-log-events:啓用之可用於在二進制日誌記錄事件相關的信息,可降低故障排除的複雜度;

    • log-bin:啓用二進制日誌,這是保證複製功能的基本前提;

    • server-id:同一個複製拓撲中的所有服務器的id號必須惟一。


        B、配置主服務器master

           

 # vim /usr/my.cnf

         在 [mysqld] 加入如下:

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
thread_concurrency= 2
log-bin=mysql-bin
innodb_file_per_table= 1
 
 
binlog-format=ROW         //設置二進制日誌格式
log-slave-updates=true//是否記錄從服務器同步數據動作
gtid-mode=on       //啓用Gtid模式
enforce-gtid-consistency=true//是否強制GTID的一致性
master-info-repository=TABLE  //master信息的記錄位置
relay-log-info-repository=TABLE  //中繼日誌信息的記錄位置
sync-master-info=1
slave-parallel-workers=2  //設置從服務器複製線程數
binlog-checksum=CRC32//設置binlog校驗算法(循環冗餘校驗碼)
master-verify-checksum=1  //設置主服務器是否校驗
slave-sql-verify-checksum=1//設置從服務器是否校驗
binlog-rows-query-log_events=1
server-id       = 10
report-port=3306
report-host=192.168.100.90   //設置報告給哪臺服務器,一般設置爲本機的主機名。


 

# service mysql restart          //重啓MySQL服務


        C、在Slave服務器上安裝MySQL與在Master服務器上安裝方法相同,這裏不在介紹,而在Slave服務器上安裝Mysql有兩個參數與Master服務器不同。如下:

           

 server-id=11
 report-host=192.168.100.91


# service mysql restart

        D、在Master服務器上爲Slave創建複製用戶並測試連接

mysql> grant replication slave,replication client on *.*to 'replication'@'192.168.%.%' identified by 'passwd';
mysql> flush privileges

;

        E、啓動slave複製線程

        在從服務器上進行操作

mysql> changemaster to master_host='192.168.100.90',master_user='replication',master_password='passwd',master_auto_position=1;
mysql> start slave;
mysql> show status\G;

wKiom1U4x5rx1sTbAAP6LUgHtd4909.jpg


好,現在可以在主上面進行創建數據庫。看看從的是否有數據。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章