天天看點

galera mysql 機制_mysql galera cluster 叢集的分裂與仲裁機制

叢集的分裂

當叢集由于網絡原因分裂為幾個單獨的組時(一組可能是單節點,也可能是幾個互聯的節點),資料出現不一緻,此時可能産生腦裂及資料不一緻。這種情況 下,隻有一組節點能夠繼續提供服務,這組節點的狀态是primary。當這種狀況發生時,galera cluster會啟動特别的仲裁算法來選舉一個元件作為primary元件。

cluster size決定了quorum仲裁的投票數(是以是單數比較好,避免産生腦裂——這擴充到其他的裝置也是适用的,比如交換機、網絡、資料中心,至少使用3 個),當一個節點不再有響應并被推測不再屬于叢集的時候,galera就會啟動一次仲裁選舉。可以使用evs.suspect_timeout來微調這個 no response timeout,預設設定是5秒。當galera進行選舉時,大部分原來連接配接保持的節點所在的部分會作為主,但分裂後的節點都還是活着的。當分裂發生後, 獲得權重仲裁的一組成為主,其他沒貨的權重的節點狀态變為non-primary并嘗試去連接配接主。

權重需要有“絕大部分”是以兩個節點不能成為叢集,如果一個faliure另一個也會自動成為non-primary狀态

腦裂的情況

叢集錯誤導緻資料節點之間互相獨立的情況稱為腦裂。腦裂發生時,資料可能發生無可挽回的損壞,比如兩個資料節點各自獨立的更新了同一張表的同一行數 據。像其他基于權重的系統一樣,當仲裁算法失效無法選出主節點時,galera叢集也會出現腦裂。這種情況會發生在例如隻有兩個節點的cluster叢集 或者在無備份交換機的情況下主交換機壞掉的時候。

為最小化偶數節點叢集環境中發生腦裂的風險,要保證叢集按照肯定能産生主的方式分開,例如4 node cluster -> 3 (Primary) + 1 (Non-primary)。可以在運作過程中對節點的權重作調整

SET GLOBAL wsrep_provider_options="pc.weight=3";

galera通過分發攜帶權重的消息來應用新的權重值,但并沒有将這一變化通知應用的機制。但是注意!當改變權重消息發送的時刻,叢集發生了分裂, 就會導緻整個叢集都變為non-primary。這種情況就隻能等待重新合并或者檢視那個部分是最新資料,然後把它當做第一個節點來重新啟動。

node1: pc.weight = 2

node2: pc.weight = 1

node3: pc.weight = 0

三個節點按以上方法配置權重,如果同時kill節點2和節點3,節點1會成為主,但kill節點1,,2和3會變為non-primary

galera仲裁者Arbitrator

galera仲裁者是叢集的一員,參與投票,但不真正參與複制。

galera仲裁者的設立出于以下兩個目的:

1、偶數節點時,仲裁者作為一個節點使叢集成為奇數,進而避免腦裂

2、它可以請求一個連續的應用狀态快照,可用來做備份

盡管仲裁者不存資料,它必須能夠流經所有的複制流,是以把仲裁者放在一個和其他節點網絡連接配接差的網絡環境裡會導緻整個cluster的性能變差。仲裁者倒了并不會影響cluster的操作,可以在任何時間挂一個新的節點上去

啟動galera仲裁者

Galera Arbitrator是一個與cluster獨立的程序,叫做garbd。這意味着必須單獨啟動它,同時也意味着不能通過my.cnf來配置仲裁者。如何 配置仲裁者取決于如何啟動它。當仲裁者啟動時,腳本在其過程中執行sudo語句作為使用者nobody。但在Fedora和其他一些Linux分支版本中, 預設的sudo配置阻止了使用者非tty連接配接的操作。為避免這一點,需要在/etc/sudoers檔案中去掉Defaults requiretty這一行。

1、用shell啟動仲裁者

用shell啟動仲裁者,有兩個選項來配置。首先可以通過指令行來設定參數

$ garbd --group=example_cluster \ --address="gcomm://192.168.1.1,192.168.1.2,192.168.1.3" \ --option="socket.ssl_key=/etc/ssl/galera/server-key.pem;socket.ssl_cert=/etc/ssl/galera/server-cert.pem;socket.ssl_ca=/etc/ssl/galera/ca-cert.pem;socket.ssl_cipher=AES128-SHA""

如果使用SSL就需要設定密碼。如果不想每次用shell啟動仲裁者都輸出這些項,可以在配置檔案中設定想使用的選項

# arbtirator.configgroup = example_cluster

address = gcomm://192.168.1.1,192.168.1.2,192.168.1.3

然後啟動仲裁者時使用--cfg

$ garbd --cfg /path/to/arbitrator.config

--help參數擷取幫助

$ garbd --helpUsage: garbd [options] [group address]

2、以服務來啟動仲裁者

當以服務的方式來啟動仲裁者時,不管用init或systemd,和用shell啟動的配置檔案不同

# Copyright (C) 2013-2015 Codership Oy# This config file is to be sourced by garbd service script.# A space-separated list of node addresses (address[:port]) in the cluster:GALERA_NODES="192.168.1.1:4567 192.168.1.2:4567"# Galera cluster name, should be the same as on the rest of the node.GALERA_GROUP="example_wsrep_cluster"# Optional Galera internal options string (e.g. SSL settings)# see http://galeracluster.com/documentation-webpages/galeraparameters.htmlGALERA_OPTIONS="socket.ssl_cert=/etc/galera/cert/cert.pem;socket.ssl_key=/$"# Log file for garbd. Optional, by default logs to syslogLOG_FILE="/var/log/garbd.log"

這個配置檔案需放在系統的服務配置檔案目錄下,常見的如/etc下。之後可啟動garb服務。用init的:# service garb start 用systemd的,# systemctl start garb

除了标準配置,cluster叢集的所有參數也都适用于仲裁者,除了那些以repl為字首的。當用shell啟動的時候,可以使用--option參數來設定。