- MySQL 中的集群部署方案
- 前言
- MySQL Replication
- InnoDB Cluster
- InnoDB ClusterSet
- InnoDB ReplicaSet
- MMM
- MHA
- Galera Cluster
- MySQL Cluster
- MySQL Fabric
- 參考
MySQL 中的集群部署方案
前言
這里來聊聊,MySQL 中常用的部署方案,
MySQL Replication
MySQL Replication 是官方提供的主從同步方案,用于將一個 MySQL 的實體同步到另一個實體中,Replication 為保證資料安全做了重要的保證,是目前運用最廣的 MySQL 容災方案,Replication 用兩個或以上的實體搭建了 MySQL 主從復制集群,提供單點寫入,多點讀取的服務,實作了讀的 scale out,
上面的栗子,一個主庫(M),三個從庫(S),通過 replication,Master 生成 event 的 binlog,然后發給 slave,Slave 將 event 寫入 relaylog,然后將其提交到自身資料庫中,實作主從資料同步,
對于資料庫之上的業務層來說,基于 MySQL 的主從復制集群,單點寫入 Master ,在 event 同步到 Slave 后,讀邏輯可以從任何一個 Slave 讀取資料,以讀寫分離的方式,大大降低 Master 的運行負載,同時提升了 Slave 的資源利用,
優點:
1、通過讀寫分離實作橫向擴展的能力,寫入和更新操作在源服務器上進行,從服務器中進行資料的讀取操作,通過增大從服務器的個數,能夠極大的增強資料庫的讀取能力;
2、資料安全,因為副本可以暫停復制程序,所以可以在副本上運行備份服務而不會破壞相應的源資料;
3、方便進行資料分析,可以在寫庫中創建實時資料,資料的分析操作在從庫中進行,不會影響到源資料庫的性能;
實作原理
在主從復制中,從庫利用主庫上的 binlog 進行重播,實作主從同步,復制的程序中蛀主要使用到了 dump thread,I/O thread,sql thread 這三個執行緒,
IO thread: 在從庫執行 start slave 陳述句時創建,負責連接主庫,請求 binlog,接收 binlog 并寫入 relay-log;
dump thread:用于主庫同步 binlog 給從庫,負責回應從 IO thread 的請求,主庫會給每個從庫的連接創建一個 dump thread,然后同步 binlog 給從庫;
sql thread:讀取 relay log 執行命令實作從庫資料的更新,
來看下復制的流程:
1、主庫收到更新命令,執行更新操作,生成 binlog;
2、從庫在主從之間建立長連接;
3、主庫 dump_thread 從本地讀取 binlog 傳送剛給從庫;
4、從庫從主庫獲取到 binlog 后存盤到本地,成為 relay log(中繼日志);
5、sql_thread 執行緒讀取 relay log 決議、執行命令更新資料,
不過 MySQL Replication 有個嚴重的缺點就是主從同步延遲,
因為資料是進行主從同步的,那么就會遇到主從同步延遲的情況,
為什么會出現主從延遲?
1、從庫機器的性能比主庫差;
2、從庫的壓力大;
- 大量查詢放在從庫上,可能會導致從庫上耗費了大量的 CPU 資源,進而影響了同步速度,造成主從延遲,
3、大事務的執行;
- 有事務產生的時候,主庫必須要等待事務完成之后才能寫入到 binlog,假定執行的事務是一個非常大的資料插入,這些資料傳輸到從庫,從庫同步這些資料也需要一定的時間,就會導致從節點出現資料延遲,
4、從庫的復制能力較差;
如果從庫的復制能力,低于主庫,那么在主庫寫入壓力很大的情況下,就會造成從庫長時間資料延遲的情況出現,
如何解決?
1、優化業務邏輯,避免出現多執行緒大事務的并發場景;
2、提高從庫的機器性能,減少主庫寫 binlog 和從庫讀 binlog 的效率差;
3、保證主庫和從庫的網路連接,避免出現網路延遲導致的 binlog 傳輸延遲;
4、強行讀主庫;
5、配合 semi-sync 半同步復制;
semi-sync 半同步復制
MySQL 有三種同步模式,分別是:
1、異步復制:MySQL 中默認的復制是異步的,主庫在執行完客戶端提交的事務后會立即將結果回傳給客戶端,并不關心從庫是否已經接收并且處理,存在問題就是,如果主庫的日志沒有及時同步到從庫,然后主庫宕機了,這時候執行故障轉移,在從庫沖選主,可能會存在選出的主庫中資料不完整;
2、全同步復制:指當主庫執行完一個事務,并且等到所有從庫也執行完成這個事務的時候,主庫在提交事務,并且回傳資料給客戶端,因為要等待所有從庫都同步到主庫中的資料才回傳資料,所以能夠保證主從資料的一致性,但是資料庫的性能必然受到影響;
3、半同步復制:是介于全同步和全異步同步的一種,主庫至少需要等待一個從庫接收并寫入到 Relay Log 檔案即可,主庫不需要等待所有從庫給主庫回傳 ACK,主庫收到 ACK ,標識這個事務完成,回傳資料給客戶端,
MySQL 中默認的復制是異步的,所以主庫和從庫的同步會存在一定的延遲,更重要的是異步復制還可能引起資料的丟失,全同步復制的性能又太差了,所以從 MySQL 5.5 開始,MySQL 以插件的形式支持 semi-sync 半同步復制,
半同步復制潛在的問題
在傳統的半同步復制中,主庫寫資料到 binlog,并且執行 commit 提交事務后,會一直等待一個從庫的 ACK,從庫會在寫入 Relay Log 后,將資料落盤,然后回復給主庫 ACK,主庫收到這個 ACK 才能給客戶端事務完成的確認,
這樣會存在問題就是,主庫已經將該事務的 commit 存盤到了引擎層,應用已經可以看到資料的變化了,只是在等待從庫的回傳,如果此時主庫宕機,可能從庫還沒有寫入 Relay Log,就會發生主從庫資料不一致,
為了解決這個問題,MySQL 5.7 引入了增強半同步復制,主庫寫入資料到 binlog 后,就開始等待從庫的應答 ACK,直到至少一個從庫寫入 Relay Log 后,并將資料落盤,然后回傳給主庫 ACK,通知主庫可以進行 commit 操作,然后主庫再將事務提交到事務引擎,應用此時才能看到資料的變化,
不過看下來增強半同步復制,在同步給從庫之后,因為自己的資料還沒有提交,然后宕機了,主庫中也是會存在資料的丟失,不過應該想到的是,這時候主庫宕機了,是會重新在從庫中選主的,這樣新選出的主庫資料是沒有發生丟失的,
MySQL Group Replication
MySQL Group Replication 組復制,又稱為 MGR,是 Oracle MySQL 于 2016 年 12 月發布 MySQL 5.7.17 推出的一個全新高可用和高擴展的解決方案,
引入復制組主要是為了解決傳統異步復制和半同步復制可能產生資料不一致的問題,
MGR 由若干個節點共同組成一個復制組,一個事務的提交,必須經過組內大多數節點 (N / 2 + 1) 決議并通過,才能得以提交,
當客戶端發起一個更新事務時,該事務先在本地執行,執行完成之后就要發起對事務的提交操作,在還沒有真正提交之前,需要將產生的復制寫集廣播出去,復制到其它成員,因為事務是通過原子廣播發送的,所以組中的成員要么都接收事務,要么都不接收事務,如果組中的所有成員收到了該廣播訊息(事務),那么他們會按照之前發送事務的相同順序收到該廣播訊息,因此,所有組成員都以相同的順序接收事務的寫集,并為事務建立全域順序,因此,所有組成員都以相同的順序接收事務的寫集,并為事務建立全域順序,
在不同組成員并發執行的事務可能存在沖突,沖突是通過檢查和比較兩個不同并發事務的 write set 來驗證的,這個程序稱為認證,在認證期間,沖突檢測在行級別執行的:如果在不同組成員上執行的兩個并發事務更新了同一行資料,則存在沖突,根據沖突認證檢測機制判斷,按照順序,第一次提交的會正常執行,第二次提交的事務會在事務發起的原始組成員上執行回滾,,組中的其他成員對該事務執行洗掉,如果兩個事務經常發生沖突,那么最好將這兩個事務放在同一個組成員中執行,這樣它們在本地鎖管理器的協調下將都有機會提交成功,而不至于因為處在兩個不同的組成員中由于沖突認證而導致其中一個事務被頻繁回滾,
最終,所有組內成員以相同的順序接收同一組事務,因此組內成員以相同的順序應用相同的修改,保證組內資料強一致性,
有下面的幾種特性:
1、避免腦裂:MGR 中不會出現腦裂的現象;
2、資料一致性保障:MGR 的冗余能力很好,能夠保證 Binlog Event 至少被復制到超過一半的成員上,只要同時宕機的成員不超過半數便不會導致資料丟失,MGR還保證只要 Binlog Event 沒有被傳輸到半數以上的成員,本地成員不會將事務的 Binlog Event 寫入 Binlog 檔案和提交事務,從而保證宕機的服務器上不會有組內在線成員上不存在的資料,因此,宕機的服務器重啟后,不再需要特殊的處理就可以加入組;
3、多節點寫入支持:多寫模式下支持集群中的所有節點都可以寫入,
組復制的應用場景
1、彈性復制:需要非常靈活的復制基礎設施的環境,其中MySQL Server的數量必須動態增加或減少,并且在增加或減少Server的程序中,對業務的副作用盡可能少,例如,云資料庫服務;
2、高可用分片:分片是實作寫擴展的一種流行方法,基于 組復制 實作的高可用分片,其中每個分片都會映射到一個復制組上(邏輯上需要一一對應,但在物理上,一個復制組可以承載多個分片);
3、替代主從復制:在某些情況下,使用一個主庫會造成單點爭用,在某些情況下,向整個組內的多個成員同時寫入資料,對應用來說可能伸縮性更強;
4、自治系統:可以利用組復制內置的自動故障轉移、資料在不同組成員之間的原子廣播和最終資料一致性的特性來實作一些運維自動化,
InnoDB Cluster
InnoDB Cluster 是官方提供的高可用方案,是 MySQL 的一種高可用性(HA)解決方案,它通過使用 MySQL Group Replication 來實作資料的自動復制和高可用性,InnoDB Cluster 通常包含下面三個關鍵組件:
1、MySQL Shell: 它是 MySQL 的高級管理客戶端;
2、MySQL Server 和 MGR,使得一組 MySQL 實體能夠提供高可用性,對于 MGR,Innodb Cluster 提供了一種更加易于編程的方式來處理 MGR;
3、MySQL Router,一種輕量級中間件,主要進行路由請求,將客戶端發送過來的請求路由到不同的 MySQL 服務器節點,
MySQL Server 基于 MySQL Group Replication 構建,提供自動成員管理,容錯,自動故障轉移動能等,InnoDB Cluster 通常以單主模式運行,一個讀寫實體和多個只讀實體,不過也可以選用多主模式,
優點:
1、高可用性:通過 MySQL Group Replication,InnoDB Cluster 能夠實作資料在集群中的自動復制,從而保證資料的可用性;
2、簡單易用:InnoDB Cluster 提供了一個簡單易用的管理界面,使得管理員可以快速部署和管理集群;
3、全自動故障轉移: InnoDB Cluster 能夠自動檢測和診斷故障,并進行必要的故障轉移,使得資料可以繼續可用,
缺點:
1、復雜性:InnoDB Cluster 的部署和管理比較復雜,需要對 MySQL 的作業原理有一定的了解;
2、性能影響:由于自動復制和高可用性的要求,InnoDB Cluster 可能對 MySQL 的性能造成一定的影響;
3、限制:InnoDB Cluster 的功能對于一些特殊的應用場景可能不夠靈活,需要更多的定制,
InnoDB ClusterSet
MySQL InnoDB ClusterSet 通過將主 InnoDB Cluster 與其在備用位置(例如不同資料中心)的一個或多個副本鏈接起來,為 InnoDB Cluster 部署提供容災能力,
InnoDB ClusterSet 使用專用的 ClusterSet 復制通道自動管理從主集群到副本集群的復制,如果主集群由于資料中心損壞或網路連接丟失而變得無法使用,用戶可以激活副本集群以恢復服務的可用性,
InnoDB ClusterSet 的特點:
1、主集群和副本集群之間的緊急故障轉移可以由管理員通過 MySQL Shell,使用 AdminAPI 進行操作;
2、InnoDB ClusterSet 部署中可以擁有的副本集群的數量沒有定義的限制;
3、異步復制通道將事務從主集群復制到副本集群,clusterset_replication 在 InnoDB ClusterSet 創建程序中,在每個集群上都設定了名為 ClusterSet 的復制通道,當集群是副本時,它使用該通道從主集群復制事務,底層組復制技術管理通道并確保復制始終在主集群的主服務器(作為發送方)和副本集群的主服務器(作為接收方)之間進行;
4、每個 InnoDB ClusterSet 集群,只有主集群能夠接收寫請求,大多數的讀請求流量也會被路由到主集群,不過也可以指定讀請求到其他的集群;
InnoDB ClusterSet 的限制:
1、InnoDB ClusterSet 只支持異步復制,不能使用半同步復制,無法避免異步復制的缺陷:資料延遲、資料一致性等;
2、InnoDB ClusterSet 僅支持Cluster實體的單主模式,不支持多主模式, 即只能包含一個讀寫主集群, 所有副本集群都是只讀的, 不允許具有多個主集群的雙活設定,因為在集群發生故障時無法保證資料一致性;
3、已有的 InnoDB Cluster 不能用作 InnoDB ClusterSet 部署中的副本集群,副本集群必須從單個服務器實體啟動,作為新的 InnoDB 集群;
4、只支持 MySQL 8.0,
InnoDB ReplicaSet
InnoDB ReplicaSet 是 MySQL 團隊在 2020 年推出的一款產品,用來幫助用戶快速部署和管理主從復制,在資料庫層仍然使用的是主從復制技術,
InnoDB ReplicaSet 由單個主節點和多個輔助節點(傳統上稱為 MySQL 復制源和副本)組成,
與 InnoDB cluster 類似, MySQL Router 支持針對 InnoDB ReplicaSet 的引導, 這意味著可以自動配置 MySQL Router 以使用 InnoDB ReplicaSet, 而無需手動組態檔. 這使得 InnoDB ReplicaSet 成為一種快速簡便的方法, 可以啟動和運行 MySQL 復制和 MySQL Router, 非常適合擴展讀取, 并在不需要 InnoDB 集群提供高可用性的用例中提供手動故障轉移功能,
InnoDB ReplicaSet 的限制:
1、沒有自動故障轉移,在主節點不可用的情況下,需要使用 AdminAPI 手動觸發故障轉移,然后才能再次進行任何更改,但是,輔助實體仍可用于讀取;
2、由于意外停止或不可用,無法防止部分資料丟失:在意外停止時未完成的事務可能會丟失;
3、在意外退出或不可用后無法防止不一致,如果手動故障轉移提升了一個輔助實體,而前一個主實體仍然可用,例如,由于網路磁區,裂腦情況可能會導致資料不一致;
4、InnoDB ReplicaSet 不支持多主模式,允許寫入所有成員的經典復制拓撲無法保證資料一致性;
5、讀取橫向擴展是有限的,InnoDB ReplicaSet 基于異步復制,因此無法像 Group Replication 那樣調整流量控制;
6、一個 ReplicaSet 最多由一個主實體組成,支持一個或多個輔助,盡管可以添加到 ReplicaSet 的輔助節點的數量沒有限制,但是連接到 ReplicaSet 的每個 MySQL Router 都必須監視每個實體,因此,一個 ReplicaSet 中加入的實體越多,監控就越多,
使用 InnoDB ReplicaSets 的主要原因是你有更好的寫性能,使用 InnoDB ReplicaSets 的另一個原因是它們允許在不穩定或慢速網路上部署,而 InnoDB Cluster 則不允許,
MMM
MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程式,MMM 使用 Perl 語言開發,主要用來監控和管理 MySQL Master-Master(雙主)復制,可以說是 MySQL 主主復制管理器,
雙主模式,業務上同一時刻只能一個主庫進行資料的寫入,另一個主備庫,會在主服務器失效時,進行主備切換和故障轉移,
MMM 中是通過一個 VIP(虛擬 IP) 的機制來保證集群的高可用的,整個集群中,在主節點會提供一個 VIP 地址來提供資料讀寫服務,當出現故障的時候,VIP 就會從原來的主節點便宜到其他節點,由其他節點提供服務,
MMM無法完全的保證資料一致性,所以適用于對資料的一致性要求不是很高的場景,(因為主備上的資料不一定是最新的,可能還沒從庫的新,解決方法:開啟半同步),
MMM 的優缺點
優點:高可用性,擴展性好,出現故障自動切換,對于主主同步,在同一時間只提供一臺資料庫寫操作,保證資料的一致性,
缺點:無法完全保資料的一致性,建議采用半同步復制方式,減少失敗的概率;目前 MMM 社區已經缺少維護,不支持基于 GTID 的復制,
適用場景:
MMM的適用場景為資料庫訪問量大,業務增長快,并且能實作讀寫分離的場景,
MHA
Master High Availability Manager and Tools for MySQL,簡稱 MHA ,是一套優秀的作為 MySQL 高可用性環境下故障切換和主從提升的高可用軟體,
這個工具專門用于監控主庫的狀態,當發現 master 節點故障的時候,會自動提升其中擁有新資料的 slave 節點成為新的 master 節點,在此期間,MHA 會通過其他從節點獲取額外的資訊來避免資料一致性問題,MHA 還提供了 mater 節點的在線切換功能,即按需切換 master-slave 節點,MHA 能夠在30秒內實作故障切換,并能在故障切換程序中,最大程度的保證資料一致性,
MHA 由兩部分組成;
MHA Manager(管理節點)和MHA Node(資料節點),
MHA Manager 可以單獨部署在一臺獨立的機器上管理多個 master-slave 集群,也可以部署在一臺 slave節點上,MHA Node 運行在每臺 MySQL 服務器上,MHA Manager 會定時探測集群中的 master 節點,當 master 出現故障時,它可以自動將最新資料的 slave 提升為新的 master,然后將所有其他的 slave 重新指向新的 master,
整個故障轉移程序對應用程式完全透明,
在 MHA 自動故障切換程序中,MHA 試圖從宕機的主服務器上最大限度的保存二進制日志,最大程度的保證資料的不丟失,但這并不總是可行的,例如,主服務器硬體故障或無法通過 ssh 訪問,MHA 沒法保存二進制日志,只進行故障轉移而丟失了最新的資料,
使用 MySQL 5.5 開始找支持的半同步復制,可以大大降低資料丟失的風險,MHA可以與半同步復制結合起來,如果只有一個 slave 已經收到了最新的二進制日志,MHA 可以將最新的二進制日志應用于其他所有的 slave 服務器上,因此可以保證所有節點的資料一致性,
目前 MHA 主要支持一主多從的架構,要搭建 MHA,要求一個復制集群中必須最少有三臺資料庫服務器 ,一主二從,即一臺 master,一臺充當備用 master,另外一臺充當從庫,因為至少需要三臺服務器,
MHA 作業原理總結如下:
1、從宕機崩潰的 master 保存二進制日志事件(binlog events);
2、識別最新更新的 slave;
3、應用差異的中繼日志(relay log) 到其他slave;
4、應用從master保存的二進制日志事件(binlog events);
5、提升一個 slave 為新master;
6、使用其他的 slave 連接新的 master 進行復制,
優點:
1、可以支持基于 GTID 的復制模式;
2、MHA 在進行故障轉移時更不易產生資料丟失;
3、同一個監控節點可以監控多個集群,
缺點:
1、需要撰寫腳本或利用第三方工具來實作 Vip 的配置;
2、MHA 啟動后只會對主資料庫進行監控;
3、需要基于 SSH 免認證配置,存在一定的安全隱患,
Galera Cluster
Galera Cluster 是由 Codership 開發的MySQL多主集群,包含在 MariaDB 中,同時支持 Percona xtradb、MySQL,是一個易于使用的高可用解決方案,在資料完整性、可擴展性及高性能方面都有可接受的表現,
其本身具有 multi-master 特性,支持多點寫入,Galera Cluster 中每個實體都是對等的,互為主從,當客戶端讀寫資料的時候,可以選擇任一 MySQL 實體,對于讀操作,每個實體讀取到的資料都是相同的,對于寫操作,當資料寫入某一節點后,集群會將其同步到其它節點,這種架構不共享任何資料,是一種高冗余架構,
主要功能
1、同步復制;
2、真正的 multi-master,即所有節點可以同時讀寫資料庫;
3、自動的節點成員控制,失效節點自動被清除;
4、新節點加入資料自動復制;
5、真正的并行復制,行級;
6、用戶可以直接連接集群,使用感受上與 MySQL 完全一致,
優勢
1、資料一致:同步復制保證了整個集群的資料一致性,無論何時在任何節點執行相同的select查詢,結果都一樣;
2、高可用性:由于所有節點資料一致,單個節點崩潰不需要執行復雜耗時的故障切換,也不會造成丟失資料或停止服務;
3、性能改進:同步復制允許在集群中的所有節點上并行執行事務,從而提高讀寫性能;
4、更小的客戶端延遲;
5、同時具有讀和寫的擴展能力,
分析下原理
Galera Cluster 中主要用到了同步復制,主庫中的單個更新事務需要在所有從庫中同步更新,當主庫提交事務,集群中的所有節點資料保持一致,
異步復制,主庫將資料更新傳播給從庫后立即提交事務,而不論從庫是否成功讀取或重放資料變化,所以異步復制會存在短暫的,主從資料同步不一致的情況出現,
不過同步復制的缺點也是很明顯的,同步復制協議通常使用兩階段提交或分布式鎖協調不同節點的操作,也及時說節點越多需要協調的節點也就越多,那么事務沖突和死鎖的概率也就會隨之增加,
我們知道 MGR 組復制的引入也是為了解決傳統異步復制和半同步復制可能產生資料不一致的問題,MGR 中的組復制,基于 Paxos 協議,原則上事務的提交,主要大多數節點 ACK 就可以提交了,
Galera Cluster 中的同步需要同步資料到所有節點,保證所有節點都成功,基于專有通信組系統 GCommon ,所有節點都必須有 ACK,
Galera 復制是一種基于驗證的復制,基于驗證的復制使用通信和排序技術實作同步復制,通過廣播并發事務之間建立的全域總序來協調事務提交,簡單的講就是事務必須以相同的順序應用于所有實體,
事務現在本地執行,然后發送的其他節點做沖突驗證,沒有沖突的時候所有節點提交事務,否則在所有節點回滾,
當客戶端發出 commit 命令時,在實際提交之前,對資料所做的更改都會收集到一個寫集合中,寫集合中包含事務資訊和所更改行的主鍵,資料庫將寫集發送到其它節點,
節點用寫集中的主鍵與當前節點中未完成事務的所有寫集的主鍵比較,確定節點是否可以提交事務,同時滿足下面三個條件會被任務存在沖突,驗證失敗:
1、兩個事務來源于不同節點;
2、兩個事務包含相同的主鍵;
3、老事務對新事務不可見,即老事務未提交完成,新老事務的劃定依賴于全域事務總序,即 GTID,
驗證失敗,節點將洗掉寫集,集群將回滾原始事務,對于所有的節點都是如此,每個節點單獨進行驗證,因為所有節點都以相同的順序接收事務,它們對事務的結果都會做出相同的決定,要么全成功,要么都失敗,成功后自然就提交了,所有的節點又會重新達到資料一致的狀態,節點之間不交換“是否沖突”的資訊,各個節點獨立異步處理事務,
MySQL Cluster
MySQL Cluster 是一個高度可擴展的,兼容 ACID 事務的實時資料庫,基于分布式架構不存在單點故障,MySQL Cluster 支持自動水平擴容,并能做自動的讀寫負載均衡,
MySQL Cluster 使用了一個叫 NDB 的記憶體存盤引擎來整合多個 MySQL 實體,提供一個統一的服務集群,
NDB 是一種記憶體性的存盤引擎,使用 Sarding-Nothing 的無共享的架構,Sarding-Nothing 指的是每個節點有獨立的處理器,磁盤和記憶體,節點之間沒有共享資源完全獨立互不干擾,節點之間通過告訴網路組在一起,每個節點相當于是一個小型的資料庫,存盤部分資料,這種架構的好處是可以利用節點的分布性并行處理資料,調高整體的性能,還有就是有很高的水平擴展性能,只需要增加節點就能增加資料的處理能力,
MySql Cluster 中包含三種節點,分別是管理節點(NDB Management Server)、資料節點(Data Nodes)和 SQL查詢節點(SQL Nodes) ,
SQL Nodes 是應用程式的介面,像普通的 mysqld 服務一樣,接受用戶的 SQL 輸入,執行并回傳結果,Data Nodes 是資料存盤節點,NDB Management Server 用來管理集群中的每個 node,
其中資料節點會存盤集群中的資料磁區和磁區的副本,來看下 MySql Cluster 是如何對資料進行分片的操作的,首先來了解下下面幾個概念
- 節點組(Node Group): 一組資料節點的集合,節點組的個數=
節點數 / 副本數;
比如有集群中 4 個節點,副本數為 2(對應 NoOfReplicas 的設定),那么節點組個數為2,
另外,在可用性方面,資料的副本在組內交叉分配,一個節點組內只有要一臺機器可用,就可以保證整個集群的資料完整性,實作服務的整體可用,
-
磁區(Partition):
MySql Cluster是一個分布式的存盤系統,資料按照 磁區 劃分成多份存盤在各資料節點中,磁區個數由系統自動計算,磁區數 = 資料節點數 / LDM 執行緒數; -
副本(Replica):磁區資料的備份,有幾個磁區就有幾個副本,為了避免單點,保證
MySql Cluster集群的高可用,原始資料對應的磁區和副本通常會保存在不同的主機上,在一個節點組內進行交叉備份,
栗如,上面的例子,有四個資料節點(使用ndbd),副本數為2的集群,節點組被分為2組(4/2),資料被分為4個磁區,資料分配情況如下:
磁區0(Partition 0)保存在節點組 0(Node Group 0)中,磁區資料(主副本 — Primary Replica)保存在節點1(node 1) 中,備份資料(備份副本,Backup Replica)保存在節點2(node 2) 中;
磁區1(Partition 1)保存在節點組 1(Node Group 1)中,磁區資料(主副本 — Primary Replica)保存在節點3(node 3) 中,備份資料(備份副本,Backup Replica)保存在節點4(node 4) 中;
磁區2(Partition 2)保存在節點組 0(Node Group 0)中,磁區資料(主副本 — Primary Replica)保存在節點2(node 2) 中,備份資料(備份副本,Backup Replica)保存在節點1(node 1) 中;
磁區3(Partition 2)保存在節點組 1(Node Group 1)中,磁區資料(主副本 — Primary Replica)保存在節點4(node 4) 中,備份資料(備份副本,Backup Replica)保存在節點3(node 3) 中;
這樣,對于一張表的一個 Partition 來說,在整個集群有兩份資料,并分布在兩個獨立的 Node 上,實作了資料容災,同時,每次對一個 Partition 的寫操作,都會在兩個 Replica 上呈現,如果 Primary Replica 例外,那么 Backup Replica 可以立即提供服務,實作資料的高可用,
mysql cluster 的優點
1、99.999%的高可用性;
2、快速的自動失效切換;
3、靈活的分布式體系結構,沒有單點故障;
4、高吞吐量和低延遲;
5、可擴展性強,支持在線擴容,
mysql cluster 的缺點
1、存在很多限制,比如:不支持外鍵,資料行不能超過8K(不包括BLOB和text中的資料);
2、部署、管理、配置很復雜;
3、占用磁盤空間大,記憶體大;
4、備份和恢復不方便;
5、重啟的時候,資料節點將資料 load 到記憶體需要很長時間,
MySQL Fabric
MySQL Fabric 會組織多個 MySQL 資料庫,將大的資料分散到多個資料庫中,即資料分片(Data Shard),同時同一個分片資料庫中又是一個主從結構,Fabric 會挑選合適的庫作為主庫,當主庫掛掉的時候,又會重新在從庫中選出一個主庫,
MySQL Fabric 的特點:
1、高可用;
2、使用資料分片的橫向功能,
MySQL Fabric-aware 連接器把從 MySQL Fabric 獲取的路由資訊存盤到快取中,然后憑借該資訊將事務或查詢發送給正確的 MySQL 服務器,
同時,每一個分片組,可以又多個一個服務器組成,構成主從結構,當主庫掛掉的時候,又會重新在從庫中選出一個主庫,保證節點的高可用,
HA Group 保證訪問指定 HA Group 的資料總是可用的,同時其基礎的資料復制是基于 MySQL Replication 實作的,
缺點
事務及查詢只支持在同一個分片內,事務中更新的資料不能跨分片,查詢陳述句回傳的資料也不能跨分片,
總結
1、MySQL Replication 是官方提供的主從同步方案,用于將一個 MySQL 的實體同步到另一個實體中,在主從復制中,從庫利用主庫上的 binlog 進行重播,實作主從同步,默認是異步同步,針對其在不同場景下的一些缺陷,衍生出了半同步復制,強同步復制等資料高可用的方案;
2、MySQL Group Replication 組復制又稱為 MGR,引入復制組主要是為了解決傳統異步復制和半同步復制可能產生資料不一致的問題, MGR 由若干個節點共同組成一個復制組,一個事務的提交,必須經過組內大多數節點 (N / 2 + 1) 決議并通過,才能得以提交;
3、InnoDB Cluster 是官方提供的高可用方案,是 MySQL 的一種高可用性(HA)解決方案,它通過使用 MySQL Group Replication 來實作資料的自動復制和高可用性;
4、InnoDB ClusterSet 通過將主 InnoDB Cluster 與其在備用位置(例如不同資料中心)的一個或多個副本鏈接起來,為 InnoDB Cluster 部署提供容災能力,每個節點就是一個 InnoDB Cluster;
5、InnoDB ReplicaSet 與 InnoDB cluster 類似, MySQL Router 支持針對 InnoDB ReplicaSet 的引導, 這意味著可以自動配置 MySQL Router 以使用 InnoDB ReplicaSet, 而無需手動組態檔. 這使得 InnoDB ReplicaSet 成為一種快速簡便的方法, 可以啟動和運行 MySQL 復制和 MySQL Router, 非常適合擴展讀取, 并在不需要 InnoDB 集群提供高可用性的用例中提供手動故障轉移功能;
6、MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程式,MMM 使用 Perl 語言開發,主要用來監控和管理 MySQL Master-Master(雙主)復制,可以說是 MySQL 主主復制管理器;
7、Master High Availability Manager and Tools for MySQL,簡稱 MHA ,是一套優秀的作為 MySQL 高可用性環境下故障切換和主從提升的高可用軟體,這個工具專門用于監控主庫的狀態,當發現 master 節點故障的時候,會自動提升其中擁有新資料的 slave 節點成為新的 master 節點,在此期間,MHA 會通過其他從節點獲取額外的資訊來避免資料一致性問題,MHA 還提供了 mater 節點的在線切換功能,即按需切換 master-slave 節點,MHA 能夠在30秒內實作故障切換,并能在故障切換程序中,最大程度的保證資料一致性;
8、Galera Cluster 是由 Codership 開發的MySQL多主集群,包含在 MariaDB 中,同時支持 Percona xtradb、MySQL,是一個易于使用的高可用解決方案,在資料完整性、可擴展性及高性能方面都有可接受的表現,本身具有 multi-master 特性,支持多點寫入,Galera Cluster 中每個實體都是對等的,互為主從,當客戶端讀寫資料的時候,可以選擇任一 MySQL 實體,對于讀操作,每個實體讀取到的資料都是相同的,對于寫操作,當資料寫入某一節點后,集群會將其同步到其它節點,這種架構不共享任何資料,是一種高冗余架構;
9、MySQL Cluster 是一個高度可擴展的,兼容 ACID 事務的實時資料庫,基于分布式架構不存在單點故障,MySQL Cluster 支持自動水平擴容,并能做自動的讀寫負載均衡,MySQL Cluster 使用了一個叫 NDB 的記憶體存盤引擎來整合多個 MySQL 實體,提供一個統一的服務集群;
10、MySQL Fabric 會組織多個 MySQL 資料庫,將大的資料分散到多個資料庫中,即資料分片(Data Shard),同時同一個分片資料庫中又是一個主從結構,Fabric 會挑選合適的庫作為主庫,當主庫掛掉的時候,又會重新在從庫中選出一個主庫,
參考
【高性能MySQL(第3版)】https://book.douban.com/subject/23008813/
【MySQL 實戰 45 講】https://time.geekbang.org/column/100020801
【MySQL技術內幕】https://book.douban.com/subject/24708143/
【MySQL學習筆記】https://github.com/boilingfrog/Go-POINT/tree/master/mysql
【MySQL檔案】https://dev.mysql.com/doc/refman/8.0/en/replication.html
【淺談 MySQL binlog 主從同步】http://www.linkedkeeper.com/1503.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/550721.html
標籤:MySQL
上一篇:新起點!大資料分布式可視化的 DAG 任務調度系統 Taier 正式發布1.4版本
下一篇:返回列表
