1. 程式人生 > 實用技巧 >2.6.2.MySQL主從複製的原理

2.6.2.MySQL主從複製的原理

MySQL主從複製的原理

MySQL複製技術介紹


主從複製

是MySQL資料庫的一種容災備份方案;是mysql自帶的功能,無需藉助第三方工具,MySQL的主從複製並不是資料庫磁碟上的檔案直接拷貝,而是通過邏輯的binlog日誌複製到要同步的伺服器本地,然後由本地的執行緒讀取日誌裡面的SQL語句重新應用到mysql資料庫中。
MySQL複製能幹什麼?

MySQL主從複製的應用場景

應用場景 資料備份與容災、讀寫分離、業務拆分使用公司 適合於初創公司,小型電商/網際網路公司,一些小型雲環境切換技術 手工切換,時間:>30分鐘(含重做主從關係,資料校驗等) 自動切換,時間:按分鐘計算

MySQL主從複製是如何工作的?


複製一共分3個步驟01 master將改變記錄到二進位制日誌 (binary log)中(這些記錄叫做二進位制日誌事件, binary log events)
02 slave將 master的 binary log events拷貝到它的中繼日誌(relay log);03 slave重做中繼日誌中的事件,將日誌操作還原並生成資料。

MySQL主從複製是如何工作的?

01 master記錄二進位制日誌。在每個事務更新資料完成之前, master在二日誌記錄這些改變。 MySQL將事務序列的寫入二進位制日誌,在事件寫入二進位制日誌完成後,master通知儲存引擎提交事務。02 slave將 master的 binary log拷貝到它自己的中繼日誌。首先, slave開始一個工作執行緒:I/O執行緒。
I/O執行緒在 master上開啟一個普通的連線,然後開始 binlog dump processBinlog dump process 從master的二進位制日誌中讀取事件接受的單位是(event),如果已經跟上 master,它會睡眠並等待 master產生新的事件。I/O 執行緒將這些事件寫入中繼日誌。
03. SQL slave thread(SQL從執行緒)是處理該過程的最後一步。SQL執行緒從中繼日誌讀取事件,並重放其中的事件(回放的單位也是 event)而更新slave的資料,使其與 master中的資料一致。只要該執行緒與I/O執行緒保持一致,中繼日誌通常會位於OS的快取中,所以中繼日誌的開銷很小。
在master中也有一個工作執行緒:
和其它MySQL的連線樣,slave 在 master中開啟一個連線也會使得 master開始一個執行緒。


MySQL主從複製的常用拓撲結構

mysql 資料庫支援單向、雙向、鏈式級聯、環狀等不同業務場景的複製。在複製過程中,一臺伺服器充當主伺服器(Master),接收來自使用者的內容更新,而一個或多個其他的伺服器充當從伺服器(Slave),接收來自主伺服器 binlog檔案的日誌內容,解析出SQL重新更新到從伺服器,使得主從伺服器資料達到一致。
不推薦的方式

MySQL主從複製技術之同步方式


MySQL主從複製技術之同步方式

MySQL有四種同步方式非同步複製(asynchronous) 搭建簡單,使用非常廣泛,從mysql誕生之初,就產生了這種架構,效能非常好,可謂非常成熟。但是這種架構資料是非同步的,所以有丟失資料庫的風險。全同步複製(fully synchronous) 保證資料安全,不丟資料,損失效能。傳統半同步複製( Semi synchronous) 效能,功能都介於非同步和全同步中間。從mysq5.5開始誕生,目的是為了折中上述兩種架構的效能以及優缺點。無損複製,增強版的半同步複製( lossless replication) 資料零丟失,效能好,mysq5.7誕生

MySQL主從複製技術之GTID特性

什麼是GTID?GTID( Global Transaction Identifiers):對於一個已提交事務的編號,事務的唯一編號,並且是一個全域性唯一的編號。GTID和事務會記錄到 binlog中,用來標識事務。GTD是用來替代以前傳統複製方法( binlog+ position),MySQL5.6.2開始支援GTD。
MySQL支援GTID後,一個事務在叢集中就不再孤單,在每一個節點中,如果存在具相同識別符號的情況,可以避免同一個事務,在同一個節點中出現多次的情況。
GTID的出現,最直接的效果就是,每一個事務在叢集中具有了唯一性的意義,相對於行復制來講資料安全性更高,故障切換更簡單。

MySQL主從複製技術之 GTID-GTID組成

GTID 是由 server_uuid:Sequence_Number。Server_Uuid:是一個MySQL例項的全域性唯一標識;存放為在 $datadir/auto.cnfSequence_Number:是 MySQL內部的一個事務的編號,一個 MySQL例項不會重複的序列號(保證伺服器內唯一),也表示在該例項上已經提交事務的數量,並且隨著事務提交而遞增。根據GTID可以知道事務最初是在哪個例項上提交的,方便故障排查和切換
cat /mysql/data/3306/data/auto.cnf
[auto]
server-uuid=1599dcea-5a7b-11e8-94bd-000c292834b0