Galera:多主同步MySQL集群原理解析

jopen 9年前發布 | 79K 次閱讀 Galera MySQL 數據庫服務器

原文  http://www.majin163.com/2015/03/24/galera/

引言

Galera Cluster是基于MySQL/innodb二次開發而成的一個支持“多主同步”的數據庫主從集群。強調主從集群意味著Galera Cluster的每個節點充當一個數據冗余,而沒有在節點間做分庫分表的水平擴展。Galaer官網中為Galera Cluster洋洋灑灑羅列了10大優勢,其實總結下來無非上文用引號注明的兩點:

多主

Galera Cluster沒有MySQL主從集群只有一個主能提供寫服務的限制,集群中每個節點都可讀可寫,無需讀寫分離。在一個Galera Cluster前直接部署HAProxy或LVS做讀寫負責均衡是比較常用的做法。

同步

Galera replication具有實時性,能夠保障不同節點的數據視圖在較小的時間范圍內是一致的。MySQL原生replication方案slave中的 SQL線程和IO線程是分離的,即便使用半同步甚至同步復制,也可能因為SQL線程的速度跟不上IO線程而導致slave數據落后很多,當然5.7引入并行復制后會好很多,而Galera中除了具有并行復制的功能外,還具有flow control的功能來控制節點間數據同步的速度。

Galera Cluster相較于MySQL 來說的核心貢獻是基于Galera replication plugin實現實現了多主和同步兩大特性,本文將詳細剖析Galera在解決多主和同步兩大問題上的想法和思路。

架構簡述

Galera Cluster節點間通過wsapi進行數據通信和同步,如圖1和圖2所示,wsapi通過hook的方式侵入Innodb中事務的commit流程,獲取事務內所有數據行的更改,構造一個write set并將其同步到Cluster其他節點,wsapi即write set api簡稱。

圖1. Galera Overview

圖2. Galera library

Galera provider目前是wsapi的唯一實現。Galera provider內部實現又劃分為多個層次,其中最為核心的是認證層(certification)和復制層(replication)。認證層負責檢測本機事務,以及從其他節點同步來的事務是否可以提交,Galera的基于認證的事務樂觀并發控制會在多主實現一節中介紹。復制層的工作包含兩方面:

  • 組通信,與其他節點同步writeset,并為事務分配全局唯一的GTID
  • 并行復制,結合Galera事務樂觀并發控制原理的并行復制

復制層通過組通信(Group communication)完成writeset的同步和GTID的分配,GTID的分配是Galera基于認證的事務并發控制和并行復制的前提和基礎。

GTID與組通信

GTID是global transaction id的縮寫,在MySQL社區中,GTID的概念并不新鮮,MySQL中的GTID是由Master生成,用于標志事務唯一性并通過ID定位binlog位置的一種手段,從而有效解決了級聯復制等場景中的各種問題。

對于Galera Cluster來說,replication通過Galera replication中間件來保障,不基于binlog,因此Galera的GTID雖然也標志事務的唯一性,但是它的設計初衷完全不同,在介紹它的設計目的之前,先來看下Galera的GTID格式:

45eec521-2f34-11e0-0800-2a36050b826b:94530586304

如上圖所示,GTID包含兩部分:

  • UUID,標志事務的唯一性ID
  • 一個順序ID,標志這個事務在Galera Cluster所有節點事務中的順序

而且實現方式也要復雜的多,因為Galera Cluster中所有節點都可做master,因此不能由一個節點隨意去分配。理論上需要所有節點對一個事務的ID達成一致才能確定,但是這里引入 Paxos一類的分布式一致性算法顯然會嚴重拖慢commit速度,因為Paxos采用的是全同步的通信方式。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!