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.config
group = 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 --help

Usage: 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.html
GALERA_OPTIONS="socket.ssl_cert=/etc/galera/cert/cert.pem;socket.ssl_key=/$"
# Log file for garbd. Optional, by default logs to syslog
LOG_FILE="/var/log/garbd.log"
這個配置文件需放在系統的服務配置文件目錄下,常見的如/etc下。之后可啟動garb服務。用init的:# service garb start 用systemd的,# systemctl start garb
除了標准配置,cluster集群的所有參數也都適用於仲裁者,除了那些以repl為前綴的。當用shell啟動的時候,可以使用--option參數來設置。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM