---本文大綱mysql
1、什麼是GTIDsql
2、應用場景數據庫
3、多線程複製說明vim
4、實現過程安全
5、多源複製原理服務器
6、實現過程session
----------------------------------多線程
1、什麼是GITD
架構
自MySQL 5.6引入的GTID(Global Transaction IDs)使得其複製功能的配置、監控及管理變得更加易於實現,且更加健壯。官方文檔在這篇文檔裏,咱們能夠知道全局事務 ID 的官方定義是:GTID = source_id:transaction_iddom
gtid 是一個 unique 惟一的表示符,他是由服務器的uuid 全局惟一標識,是由128位的隨機符組成,mysql-5.6是依靠server-id和uuid 來標識複製架構中的每個主機,由於是128位的隨機字符串在全局都不會重複,server-id 和uuid以及每個mysql事物的事物序號組成了惟一的gtid ,自從引進mysql-5.6以後每個二進制日誌當中在每個事物的首部都會寫上gtid 標記,所以gtid使得追蹤和比較複製事物變得很是簡單並且可以實現從崩潰中快速恢復。尤爲是innodb 引擎要想實現高可用功能必需要藉助於gtid來實現。
2、應用場景
當使用mariadb實現高可用時,GTID是顯得尤其重要,例如,在一個高可用環境中,一主多從的模式下,當主庫宕機後(寫延遲),集羣資源管理器能夠在節點列表中的多個從庫中任選一個提高爲主庫,而不會影響到業務自己, 而其它的從庫將會以新提高起來爲主庫爲當前集羣中的主庫,之後將從這個庫上覆制同步;雖然這樣作完成了「瞬間」業務切換,但可能在主庫未宕機以前,多個從 庫的複製同步落後於主庫,這樣一來,當主庫宕機後,集羣資源管理器正好切換到一個與本身事務提交可能不一致的從庫(B)上,當有應用讀取以前己在宕機的主 庫中提交的事務時,發現如今的主庫沒有,這樣就會出現事務不一致,而GTID就能很好的解決這個問題。首先當一個從庫被提高爲一個主庫時,那麼以前指向原 來主庫的從庫將所有指向新提高的主庫,來進行以後的複製,然後,剛提高的主庫B會整合全部從庫中己完成的的事務,來添補本身缺乏的部分,而B 從那裏知道,缺乏的是那一個事務,有那麼多的事務,這個事務是那一個呢,這就是經過GTID來標識的,由於GTID標識了來源服務器的標識與第多少個事務 (Source_id:transaction_id),每個改變是事件都會與GTID相關連起來記錄於binlog日誌中以供其它從庫同步,從而作到全局惟一的標識。
注:
在多級複製中GTID是不會改變的。
在GTID中,若是主服務器中有多個數據庫,要實現多線程複製是靠I/O複製到從庫的中繼日誌中由多個SQL thread來進行應用於本地的。
3、多線程複製說明
MySQL 5.6以前的版本,同步複製是單線程的,隊列的,只能一個一個執行,在5.6裏,能夠作到多個庫之間的多線程複製,例如數據庫裏,存放着用戶表,商品表, 價格表,訂單表,那麼將每一個業務表單獨放在一個庫裏,這時就能夠作到多線程複製,但一個庫裏的表,多線程複製是無效的。
注:
每一個數據庫僅能使用一個線程,複製涉及到多個數據庫時多線程複製纔有意義;
同一個庫的事務複製,就必須按前後順序複製。
在複製模型中,同一個線程(I/O線程)能夠對多個數據庫提供服務。
4、實現過程
注:
此處僅是實現GTID複製。
一、資源分配
服務類型 | 版本類型 | ip地址 |
OS |
Centos6.5x86_64 | 無 |
Mariadb Master | 10.0.10-MariaDB-log Source distribution | 192.168.1.122/24 |
Mariadb Slave | 10.0.10-MariaDB-log Source distribution | 192.168.1.210/24 |
二、Mariadb Master配置清單
⑴、編輯配置文件/etc/my.cnf
[client] port = 3306 socket = /tmp/maria.sock [mysqld] port = 3306 socket = /tmp/maria.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 thread_concurrency = 4 datadir=/mydata/data log-bin=mysql-bin binlog_format=row server-id=10 log-slave-update =True master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-threads=2 master-verify-checksum=CRC32 slave-sql-verify-checksum=1 binlog-rows-query-log-events=1 report-port=3306 report-host=master.mysql.com [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
註解:
binlog-format
二進制日誌的格式,有row、statement和mixed幾種類型;
當設置隔離級別爲READ-COMMITED必須設置二進制日誌格式爲ROW,如今MySQL官方認爲STATEMENT這個已經再也不適合繼續使用;但mixed類型在默認的事務隔離級別下,可能會致使主從數據不一致;
log-slave-updates、report-port和report-host
用於啓動GTID及知足附屬的其它需求;
master-info-repository和relay-log-info-repository
啓用此兩項,可用於實如今崩潰時保證二進制及從服務器安全的功能;
sync-master-info
啓用之可確保無信息丟失;
slave-paralles-threads
設定從服務器的SQL線程數;0表示關閉多線程複製功能;
binlog-checksum、master-verify-checksum和slave-sql-verify-checksum
啓用複製有關的全部校驗功能;
binlog-rows-query-log-events
啓用之可用於在二進制日誌記錄事件相關的信息,可下降故障排除的複雜度;
log-bin
啓用二進制日誌,這是保證複製功能的基本前提;
server-id
同一個複製拓撲中的全部服務器的id號必須唯一
log_slave_updates
記錄從服務器的更新
⑵、受權複製節點及用戶
MariaDB [(none)]> GRANT REPLICATION SLAVE ON*.* TO repluser@192.168.1.122 IDENTIFIED BY 'replpass'; Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> flush privileges -> ; Query OK, 0 rows affected (0.00 sec)
⑶、備份Master節點的數據,同步於slave(此操做並不是必須的,若是Master上有大量數據須要同步到新的Slave上,Slave是新上線的此操做纔有意義)
# mysqldump -uroot -hmaster.mysql.com --all-databases --lock-all-tables --flush-logs --master-data=2 > /tmp/all.sql #scp /tmp/all.sql 192.168.1.210:/tmp
⑷、查看一下Master GTID標識
MariaDB [(none)]> show variables like "%gtid%" -> ; +------------------------+----------+ | Variable_name | Value | +------------------------+----------+ | gtid_binlog_pos | 0-1-2130 | | gtid_binlog_state | 0-1-2130 | | gtid_current_pos | 0-1-2130 | | gtid_domain_id | 0 | | gtid_ignore_duplicates | OFF | | gtid_seq_no | 0 | | gtid_slave_pos | | | gtid_strict_mode | OFF | | last_gtid | 0-1-2130 | +------------------------+----------+ 9 rows in set (0.00 sec)
三、Mariadb Slave配置清單
⑴、編輯配置文件/etc/my.cnf
[client] port = 3306 socket = /tmp/maria.sock [mysqld] port = 3306 socket = /tmp/maria.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 thread_concurrency = 4 datadir=/mydata/data log-bin=mysql-bin relay-log=relay-log-bin server-id=20 binlog-format=ROW log-slave-updates=true master-info-repository=TABLE relay-log-info-repository=TABLE sync-master-info=1 slave-parallel-threads=2 binlog-checksum=CRC32 master-verify-checksum=1 slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 report-port=3306 report-host=slave.mysql.com [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
注:
除了server-id,其它的都與主庫同樣。
⑵、應用徹底備份
# mysql /all.sql
⑶、鏈接Master
MariaDB [(none)]> change master to master_host='192.168.1.122',master_user='repluser',master_password='replpass',master_use_gtid=current_pos;
⑷、看一下效果
⑸、測試一下
在Master建立一個數據庫,創建一張測試表
MariaDB [(none)]> use yydb Database changed MariaDB [yydb]> create table t1 (id int(4) not null,name char(30) not null); Query OK, 0 rows affected (0.03 sec)
在Slave的日誌查看一下,是否含有GTID標識
# at 793 #140419 23:40:27 server id 1 end_log_pos 726 CRC32 0x7d8f09f0 GTID 0-1-2132 /*!100001 SET @@session.gtid_seq_no=2132*//*!*/; # at 835 #140419 23:40:27 server id 1 end_log_pos 852 CRC32 0x4b60d93e Query thread_id=4 exec_time=0 error_code=0 use `yydb`/*!*/; SET TIMESTAMP=1397922027/*!*/; create table t1 (id int(4) not null,name char(30) not null) /*!*/;
注:
若是Master與Slave的GTID標識不符,就沒法實現基於GTID的複製,只要將Slave庫中的GTID修改與Master一致就能夠了
查看GTID標識的語句是
MariaDB [yydb]> show global variables like 'gtid_current_pos';
修改GTID的語句是
MariaDB [(none)]> SET GLOBAL gtid_slave_pos ='Master_GTID';
=================================基於GTID複製到此結束====================================
5、多源複製原理
首先,咱們須要清楚 multi-master 與multi-source 複製不是同樣的. Multi-Master 複製一般是環形複製,你能夠在任意主機上將數據複製給其餘主機。
Multi-source 是不一樣的. MySQL5.7版本中修復了一個複製限制 , 這限制是一個從站只能有一個主站. 這是一個在咱們設計複製環境中的限制因素,也有一些極客使它正常工做了。可是如今有一個官方的解決辦法了。因此。簡單的說, Multi-Source 意味着一個從站能有一個以上主站. 如今, 像下圖同樣的複製環境是可能的:
這將幫助咱們建立一些複製的層次結構,這在過去是不可能的。 舉個例子,你能夠 將一個從站放在你的辦公室裏。在辦公室裏從全部主站中複製數據傳播到世界各地。
而在微觀上說,各Master開啓一個binlog dump線程通知Slave端,由Slave開啓多個IO threads到各Master端上覆制二進制日誌並記錄到本地的relay日誌中,由本地的SQL thread在讀取出來並在本地應用。從而實現複製功能。
6、配置過程
一、資源分配
服務類型 | 版本類型 | IP地址 |
OS | Centos6.5x86_64 | 無 |
Master 1 | 10.0.10-MariaDB-log Source distribution | 192.168.1.109 |
Master 2 | 10.0.10-MariaDB-log Source distribution | 192.168.1.111 |
Slave | 10.0.10-MariaDB-log Source distribution | 192.168.1.110 |
二、在各Master上開啓二進制日誌,受權複製用戶
⑴、Master 1
編輯配置文件
[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 thread_concurrency = 4 datadir=/mariadb/data server-id= 10 log-bin=mysql-bin binlog-format=ROW
注:
binlog-format日誌格式使用默認就能夠
只須要修改[mysqld]區域
受權複製用戶
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'192.168.1.110' identified by 'replpass'; Query OK, 0 rows affected (0.00 sec)
⑵、Master 2
編輯配置文件
#vim /etc/my.cnf [mysqld] port = 3306 socket = /tmp/maria.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 thread_concurrency = 4 datadir=/mydata/data log-bin=mysql-bin server-id= 20 binlog-format=ROW
注:
binlog-format日誌格式使用默認就能夠
只須要修改[mysqld]區域
受權複製用戶
MariaDB [(none)]> grantreplication slave,replication client on*.* to'repluser'@'192.168.1.110'identified by'replpass'; Query OK, 0 rowsaffected (0.00 sec)
⑶、Slave
鏈接兩個Master
Master 1
MariaDB [(none)]> change master 'Master1' to master_host='192.168.1.109',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000006',master_log_pos=326;
查看Slave的狀態
MariaDB [(none)]> show slave 'Master1' status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.109 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000007 Read_Master_Log_Pos: 326 Relay_Log_File: master-relay-bin-master1.000009 Relay_Log_Pos: 535 Relay_Master_Log_File: mysql-bin.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: 326 Relay_Log_Space: 1128 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: 10 Master_SSL_Crl: Master_SSL_Crlpath: Using_Gtid: No Gtid_IO_Pos: 1 row in set (0.00 sec)
Master 2
MariaDB [(none)]> change master 'Master2' to master_host='192.168.1.111',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000010',master_log_pos=342;
查看Slave的狀態
MariaDB [(none)]> show slave 'Master2' status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.111 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000010 Read_Master_Log_Pos: 342 Relay_Log_File: master-relay-bin-master2.000002 Relay_Log_Pos: 535 Relay_Master_Log_File: mysql-bin.000010 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: 342 Relay_Log_Space: 841 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: 20 Master_SSL_Crl: Master_SSL_Crlpath: Using_Gtid: No Gtid_IO_Pos: 1 row in set (0.00 sec)
⑷、測試一下
在Master1建立一個數據庫,在Master2也建立一個數據庫
Master 1
MariaDB [(none)]> show variables like 'server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 10 | +---------------+-------+ 1 row in set (0.00 sec) MariaDB [(none)]> create database m1db; Query OK, 1 row affected (0.01 sec) MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | jjdb | | m1db | | mysql | | performance_schema | | test | | yydb | +--------------------+ 7 rows in set (0.00 sec)
Master 2
MariaDB [(none)]> show variables like 'server_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 20 | +---------------+-------+ 1 row in set (0.00 sec) MariaDB [(none)]> create database m2db; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | m2db | | mysql | | performance_schema | | test | | xxdb | +--------------------+ 6 rows in set (0.00 sec) MariaDB [(none)]>
在Slave端顯示結果爲
MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | m1db | | m2db | | mysql | | performance_schema | | test | | xxdb | +--------------------+ 7 rows in set (0.00 sec)
注:
在此實驗中多源複製各Master中不能有同名庫,不然複製將失敗。
===========================================完=====================================
本文出自 「和風細雨」 博客,請務必保留此出處http://essun.blog.51cto.com/721033/1398848