Galera for MySQL集群安裝手冊終極版

2022-01-30 FeTech

收錄於話題 #Galera 1個

1.Galera Cluster for MySQL 安裝官方指引

Galera Cluster for MySQL 安裝手冊文字版 https://galeracluster.com/library/documentation/install-mysql.html

Galera Cluster for MySQL 安裝手冊PPT版 {% pdf /images/galera/galera-mysql-installing.pdf %}

Galera Cluster for MySQL 安裝手冊視頻版 https://galeracluster.com/library/training/videos/galera-mysql-installing.html

配置參數:https://galeracluster.com/library/documentation/mysql-wsrep-options.html#

2.集群安裝詳細步驟2.1 在/etc/yum.repos.d/ 的目錄下新增gelare.repo文件
[galera]name = Galerabaseurl = https://releases.galeracluster.com/galera-3/DIST/RELEASE/ARCHgpgkey = https://releases.galeracluster.com/GPG-KEY-galeracluster.comgpgcheck = 1
[mysql-wsrep]name = MySQL-wsrepbaseurl = https://releases.galeracluster.com/mysql-wsrep-VERSION/DIST/RELEASE/ARCHgpgkey = https://releases.galeracluster.com/GPG-KEY-galeracluster.comgpgcheck = 1

注意需要替換掉相應的參數,針對自己的環境作出相應的更改。

VERSION是mysql-wsrep的版本,如5.7;DIST是作業系統,如centos;RELEASE是作業系統版本,如7;ARCH是系統架構,如x86_64;

2.2 一鍵安裝

源配置好之後,就可以安裝了,只需執行以下命令:

# yum install galera-3 mysql-wsrep-5.7

若網絡環境不允許,則可以離線安裝,需要按照下面步驟進行安裝:使用 (yum install -y 包名)命令進行安裝。

安裝順序:    1、    mysql-wsrep-libs-compat-5.7-5.7.23-25.15.el7.x86_64.rpm    2、    mysql-wsrep-common-5.7-5.7.23-25.15.el7.x86_64.rpm    3、    mysql-wsrep-libs-5.7-5.7.23-25.15.el7.x86_64.rpm    4、    mysql-wsrep-devel-5.7-5.7.23-25.15.el7.x86_64.rpm    5、    mysql-wsrep-client-5.7-5.7.23-25.15.el7.x86_64.rpm    6、    mysql-wsrep-server-5.7-5.7.23-25.15.el7.x86_64.rpm    7、    mysql-wsrep-5.7-5.7.23-25.15.el7.x86_64.rpm    8、    mysql-wsrep-test-5.7-5.7.23-25.15.el7.x86_64.rpm(該包在安裝時會提示沒有    mysql-wsrep-server的依賴,使用rpm 加上–nodeps參數安裝,該安裝可忽略)    9、 galera-3-25.3.24-2.el7.x86_64

不推薦使用離線安裝方式:雖然yum配置的目錄中存儲的就是離線安裝的包,但是每個作業系統版本不同,需要安裝不同的包;避免後面發生問題,無法定位是否是安裝包版本的問題。

2.3 MySQL初始化
--①.初始化mysql# mysqld --initialize 
--②.查看默認密碼# grep 'temporary password' /var/log/mysqld.log
--③.更改權限# chown -R mysql:mysql /var/lib/mysql
--④.啟動mysql服務# service mysqld start
--⑤.進入mysql# mysql -uroot -p
--⑥.修改密碼# alter user user() identified by "新密碼";
--⑦.開放遠程登錄授權# GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;# flush privileges;
--⑧.關閉mysql服務# service mysqld stop (注意mysql5.7是mysqld)

官方推薦的三步操作法:

# systemctl start mysqld# grep 'temporary password' /var/log/mysqld.log# mysql_secure_installation

官方推薦步驟中 mysql_secure_installation 採用交互式設置方式,雖然簡單,但在不熟悉的情況下,建議還是逐個步驟設置,在熟悉後,再使用該命令則效果較好。並且該命令為二進位文件,無法看到具體的執行邏輯源碼。

務必注意點:防火牆狀態一定需要確認關閉,或者允許指定埠訪問,否則會影響集群正常創建!!!

2.4 網絡配置&同步工具安裝

關閉防火牆(生產上可開放埠)

# setenforce 0 && systemctl stop firewalld

去掉Postfix,這個可能跟MySQL配置有衝突:

安裝rsync包,後面galera集群節點間數據同步會使用該工具。rsync工具使用方法可參考:http://www.ruanyifeng.com/blog/2020/08/rsync.html

2.5 節點配置

修改my.cnf

vim /etc/my.cnf,在末尾增加:!includedir /etc/my.cnf.d/

修改wsrep.cnf

vim /etc/my.cnf.d/wsrep.cnf

節點78上wsrep.cnf完整配置:

[mysqld]server-id=78 #每個節點一個唯一的IDbind-address=0.0.0.0
# common settinglower_case_table_names=0table_open_cache=2048query_cache_size=0query_cache_type=0back_log=500skip-name-resolvesql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# character settingcharacter-set-server=utf8mb4collation-server=utf8mb4_general_ciinit_connect='SET NAMES utf8mb4'default-time-zone='+8:00'
# slow settingslow_query_log=1slow_query_log_file=/data/mysql_data/mysql_slow/localhost-slow.log # 手動創建目錄,需要使用chown -R mysql:mysql 該目錄權限long_query_time=1log_output=table,filelog_queries_not_using_indexes=1
# innodb settingdefault-storage-engine=innodbinnodb_autoinc_lock_mode=2innodb_locks_unsafe_for_binlog=1innodb_buffer_pool_size=12Ginnodb_max_dirty_pages_pct=75innodb_buffer_pool_chunk_size=128MBinnodb_buffer_pool_instances=8innodb_log_buffer_size=16Minnodb_flush_log_at_trx_commit=1innodb_log_file_size=3072Minnodb_log_files_in_group=2innodb_io_capacity=200innodb_print_all_deadlocks=1innodb_lock_wait_timeout = 50transaction_isolation=REPEATABLE-READ
# client connection settingmax_connections=500max_connect_errors=100000
# wsrepwsrep_on=ONwsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_node_name="node78" #node名稱,每個節點名稱唯一wsrep_node_address="192.168.36.78" #本節點地址
wsrep_cluster_name="ztgj_mysql_cluster" #集群名稱,所有節點配置為同一個wsrep_cluster_address="gcomm://192.168.36.78,192.168.36.79,192.168.36.80" #集群中所有節點地址
wsrep_provider_options="gcs.fc_limit=200;gcs.fc_factor=0.8" #修改為本節點地址
wsrep_slave_threads=40wsrep_certify_nonPK=1wsrep_max_ws_rows=131072wsrep_max_ws_size=1073741824wsrep_debug=0wsrep_convert_LOCK_to_trx=0wsrep_retry_autocommit=1wsrep_auto_increment_control=1wsrep_drupal_282555_workaround=0wsrep_causal_reads=0wsrep_notify_cmd=
wsrep_sst_method=rsyncwsrep_sst_auth=root:ztgjwq666 #數據量庫用戶名密碼wsrep_sst_donor="node78,node79,node80" #節點中所有節點的node名稱

節點79上wsrep.cnf配置:

server-id=79 #每個節點一個唯一的ID....
wsrep_node_name="node79" #node名稱,每個節點名稱唯一wsrep_node_address="192.168.36.79" #本節點地址

節點80上wsrep.cnf配置:

server-id=80 #每個節點一個唯一的ID....
wsrep_node_name="node80" #node名稱,每個節點名稱唯一wsrep_node_address="192.168.36.80" #本節點地址

2.6 啟動集群

①.啟動首節點

任意選取一個節點,執行:

參看 mysqld_bootstrap 執行內容:

[root@condition-db2 log]# whereis mysqld_bootstrapmysqld_bootstrap: /usr/bin/mysqld_bootstrap
[root@condition-db2 log]# cat /usr/bin/mysqld_bootstrap OLDVAL=$(systemctl show-environment | grep '^MYSQLD_OPTS=')
if [ -z "$OLDVAL" ]; then systemctl set-environment MYSQLD_OPTS="--wsrep-new-cluster" systemctl start mysqld systemctl unset-environment MYSQLD_OPTSelse systemctl set-environment "$OLDVAL --wsrep-new-cluster" systemctl start mysqld systemctl set-environment "$OLDVAL"fi

-z 判斷 "$OLDVAL" 變量是否為空,若為空,則 set-environment MYSQLD_OPTS="--wsrep-new-cluster",然後啟動MySQL systemctl start mysqld,啟動成功後,則 systemctl unset-environment MYSQLD_OPTS 清除設置。

防坑注意點: 若第一次執行 mysqld_bootstrap 中執行啟動mysqld失敗,則不會執行 unset-environment,則後面無論執行多少次啟動,都無法將節點加入到集群中!!!

預防方法: 在每次執行mysqld_bootstrap前,先執行systemctl show-environment | grep '^MYSQLD_OPTS='檢查結果是否為空,若不為空,則手動執行systemctl unset-environment MYSQLD_OPTS 清除參數設置。

檢查啟動結果,不出意外的話,就會顯示1,表明這個集群內現在只有一個節點.

# mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

②.啟動其它節點

登陸到其它節點上,依次執行:

然後再查看wsrep_cluster_size數量

2.7 集群狀態檢查
# show status like 'wsrep%';

集群完整性檢查

wsrep_cluster_state_uuid:在集群所有節點的值應該是相同的,有不同值的節點,說明其沒有連接入集群. wsrep_cluster_conf_id:正常情況下所有節點上該值是一樣的.如果值不同,說明該節點被臨時」分區」了.當節點之間網絡連接恢復的時候應該會恢復一樣的值. wsrep_cluster_size:如果這個值跟預期的節點數一致,則所有的集群節點已經連接. wsrep_cluster_status:集群組成的狀態.如果不為」Primary」,說明出現」分區」或是」split-brain」狀況.

節點狀態檢查

wsrep_ready:該值為ON,則說明可以接受SQL負載.如果為Off,則需要檢查wsrep_connected. wsrep_connected:如果該值為Off,且wsrep_ready的值也為Off,則說明該節點沒有連接到集群.(可能是wsrep_cluster_address或wsrep_cluster_name等配置錯造成的.具體錯誤需要查看錯誤日誌) wsrep_local_state_comment:如果wsrep_connected為On,但wsrep_ready為OFF,則可以從該項查看原因.

複製健康檢查

wsrep_flow_control_paused:表示複製停止了多長時間.即表明集群因為Slave延遲而慢的程度.值為0~1,越靠近0越好,值為1表示複製完全停止.可優化wsrep_slave_threads的值來改善. wsrep_cert_deps_distance:有多少事務可以並行應用處理.wsrep_slave_threads設置的值不應該高出該值太多. wsrep_flow_control_sent:表示該節點已經停止複製了多少次. wsrep_local_recv_queue_avg:表示slave事務隊列的平均長度.slave瓶頸的預兆. ps:最慢的節點的wsrep_flow_control_sent和wsrep_local_recv_queue_avg這兩個值最高.這兩個值較低的話,相對更好.

檢測慢網絡問題

wsrep_local_send_queue_avg:網絡瓶頸的預兆.如果這個值比較高的話,可能存在網絡瓶

衝突或死鎖的數目

wsrep_last_committed:最後提交的事務數目 wsrep_local_cert_failures和wsrep_local_bf_aborts:回滾,檢測到的衝突數目

3.集群運維指南3.1 Galera狀態文件

通常在 /var/lib/mysql 目錄下會存儲Galera的集群信息,也可通過配置datadir來指定Galera存儲位置。在該目錄下主要有三個文件:

①.gvwstate.dat

當節點將Primary Component狀態存儲到磁碟時,會保存為gvwstate.dat文件。如果節點正常關閉,則會刪除該文件。如果群集在節點關閉後繼續運行(即,有其他節點未關閉),則剩餘節點之一將成為Primary Component的主機,並在其文件系統上創建gvwstate.dat文件。

my_uuid: af1027d0-1a04-11ec-86ca-57c930759d43#vwbegview_id: 3 af1027d0-1a04-11ec-86ca-57c930759d43 12bootstrap: 0member: af1027d0-1a04-11ec-86ca-57c930759d43 0member: bb0e7607-1a04-11ec-bd8f-af2b63e25777 0member: e8a96415-1a06-11ec-96da-76f17e3872d7 0#vwend

官方文檔:https://galeracluster.com/library/documentation/pc-recovery.html

②.grastate.dat

定位最近狀態的節點、安全引導保護、定位崩潰的節點

# GALERA saved stateversion: 2.1uuid:    db2e443c-1a02-11ec-986a-bbd1796395d8seqno:   -1safe_to_bootstrap: 0

③.galera.cache

galera緩存文件,非可讀文件

官方文檔:https://galeracluster.com/library/kb/customizing-gcache-size.html

3.2 MySQL錯誤日誌

系統日誌:/var/log/mysqld.log

mysql錯誤日誌位置查看

# show variables like 'log_error';

3.3 集群重啟

官方文檔:https://galeracluster.com/library/training/tutorials/restarting-cluster.html

當需要重啟整個Galera群集時,若以錯誤的順序啟動節點,可能會造成災難性後果,並導致數據丟失。

3.3.1 識別最高級別的節點

通過比較集群中每個節點上的全局事務ID值,來確定最高級的節點狀態ID。可以在grastate.dat文件中查找,如果grastate.dat文件如下所示,則該節點即為最高級的節點狀態ID:

# GALERA saved stateversion: 2.1uuid:    db2e443c-1a02-11ec-986a-bbd1796395d8seqno:   12safe_to_bootstrap: 0

若seqno非大於0的值,則需要查找上次提交的事務的序列號,使用--wsrep recover選項運行mysqld,該命令將相應的全局事務ID值列印到錯誤日誌中,然後退出。使用該命令時,mysql服務務必是停止狀態,若mysql服務還未終止,則該命令會一直卡著不會返回,需要手動kill掉該命令。

[root@db2 ~]# mysqld --wsrep-recover --user=mysql[root@db2 ~]# [root@db2 ~]# grep "Recovered position" /var/log/mysqld.log 2021-09-20T11:20:13.844208Z 0 [Note] WSREP: Recovered position: db2e443c-1a02-11ec-986a-bbd1796395d8:02021-09-21T05:21:26.637687Z 0 [Note] WSREP: Recovered position: db2e443c-1a02-11ec-986a-bbd1796395d8:122021-09-21T05:39:42.770713Z 0 [Note] WSREP: Recovered position: db2e443c-1a02-11ec-986a-bbd1796395d8:122021-09-21T05:44:46.217621Z 0 [Note] WSREP: Recovered position: db2e443c-1a02-11ec-986a-bbd1796395d8:122021-09-21T05:48:15.066574Z 0 [Note] WSREP: Recovered position: db2e443c-1a02-11ec-986a-bbd1796395d8:12[root@db2 ~]# [root@db2 ~]# mysqld --wsrep-recover --user=mysql[root@db2 ~]# [root@db2 ~]# grep "Recovered position" /var/log/mysqld.log 2021-09-20T11:20:13.844208Z 0 [Note] WSREP: Recovered position: db2e443c-1a02-11ec-986a-bbd1796395d8:02021-09-21T05:21:26.637687Z 0 [Note] WSREP: Recovered position: db2e443c-1a02-11ec-986a-bbd1796395d8:122021-09-21T05:39:42.770713Z 0 [Note] WSREP: Recovered position: db2e443c-1a02-11ec-986a-bbd1796395d8:122021-09-21T05:44:46.217621Z 0 [Note] WSREP: Recovered position: db2e443c-1a02-11ec-986a-bbd1796395d8:122021-09-21T05:48:15.066574Z 0 [Note] WSREP: Recovered position: db2e443c-1a02-11ec-986a-bbd1796395d8:122021-09-21T05:48:25.395356Z 0 [Note] WSREP: Recovered position: db2e443c-1a02-11ec-986a-bbd1796395d8:12[root@db2 ~]#

該命令無論執行多少次,都只會輸出最後一次的事務ID,該值是節點狀態ID。找到該值後,然後手動更新grastate.dat文件中seqno欄位為輸出結果中的值。

作為替代方案,可以讓mysqld_safe自動恢復,並在下次啟動資料庫伺服器時將值傳遞給資料庫伺服器,通過將grastate.dat文件中safe_to_bootstrap的值設為1,使用mysqld_bootstrap命令啟動該節點,其他節點啟動與以前一致。

3.3.2 「安全引導」保護

從版本3.19開始,Galera提供了一個額外的保護,以防止:嘗試使用「可能不是群集關閉之前最後一個節點」來引導啟動群集。如果Galera能夠最終確定哪個節點是最後一個存活的節點,它將被標記為「安全引導」,如下grastate.dat所示:

# GALERA saved stateversion: 2.1uuid:    5981f182-a4cc-11e6-98cc-77fabedd360dseqno:   1234safe_to_bootstrap: 1

這樣的節點可用於引導集群,嘗試使用任何其他節點進行引導將導致以下錯誤消息:

2016-11-07 01:49:19 5572 [ERROR] WSREP: It may not be safe to bootstrap the cluster from this node.It was not the last one to leave the cluster and may not contain all the updates.To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .

若要覆蓋此保護,可以編輯「要用作第一個節點」的grastate.dat文件中的safe_to_bootstrap。

在所有節點同時崩潰的情況下,集群找不到任何一個節點來安全引導,當手動編輯grastate.dat文件後,即可為集群指定安全引導節點。

3.3.3 Gcache恢復

從版本3.19開始,Galera提供了gcache.recover參數。如果設置為「是」,Galera將在節點啟動時嘗試恢復gcache。如果gcache恢復成功,節點將能夠向其他加入節點提供IST,這可以加快整個集群的總體重啟時間。

Gcache恢復需要讀取整個Gcache文件兩次。對於位於慢速磁碟上的大型gcache文件,此操作可能需要一些時間。Gcache恢復是一項「盡力而為」的操作。如果恢復未成功,則節點將繼續正常運行,但其他節點在嘗試加入時將退回到SST。

3.3.4 識別崩潰節點

通過查看grastate.dat文件的內容,可以輕鬆確定節點是否崩潰。如果看起來像下面的示例,那該節點要麼在執行非事務性操作(例如ALTER TABLE)期間崩潰,要麼由於資料庫不一致而中止。

# GALERA saved stateversion: 2.1uuid:    5ee99582-bb8d-11e2-b8e3-23de375c1d30seqno:   -1cert_index:

如上所述,您可以從InnoDB恢復上次提交的事務的全局事務ID。然而,恢復是毫無意義的。崩潰後,節點狀態可能已損壞,可能無法正常工作。如果群集中沒有一個具有定義良好狀態的節點,則無需保留節點狀態ID。您必須執行徹底的資料庫恢復過程,類似於在獨立資料庫伺服器上使用的過程。恢復一個節點後,將其用作新集群中的第一個節點。

3.4 故障恢復

官方文檔:https://galeracluster.com/library/documentation/crash-recovery.html

Galera集群作為一個邏輯實體,控制其節點的狀態、一致性以及整個集群的狀態。與異步複製相比,這樣可以更高效地維護數據完整性,而不會同時丟失多個節點上的安全寫入。然而,可能會出現這樣的情況:資料庫服務停止,沒有節點能夠為請求提供服務,這些場景將在下面的章節中描述。

3.4.1 節點1正常停止

在三節點集群(節點 1、2 和 3)中,節點 1 被優雅地停止,用於維護、配置更改等。

在這種情況下,其他節點收到停止節點的「再見」消息,集群規模減小;某些屬性(如仲裁計算或自動增量)會自動更改。一旦節點 1 再次啟動,它就會根據其wsrep_cluster_address中的變量加入集群my.cnf。

如果寫集緩存在節點2或節點3上執行時,在節點1關閉時仍然執行了所有事務,則可以通過IST加入。如果由於donor的gcache中缺少事務而無法進行IST,則由donor做出回退決定,並自動啟動SST。

3.4.2 兩個節點正常停止

在3.4.1章節的情景下,集群大小減少到1個,即使是單個剩餘的節點 3 也可以構成了primary組件,可以為客戶端請求提供服務。要將其它節點重新加入集群,只需啟動它們。

但是,當新節點加入集群時,節點 3 將切換到「Donor/Desynced」狀態,因為它必須至少向第一個加入節點提供狀態轉移。在該過程中仍然可以對其進行讀/寫,但可能會慢得多,這取決於在狀態傳輸期間應該發送多少數據。此外,一些負載均衡器可能會認為donor節點無法運行並將其從池中刪除。所以,最好避免只有一個節點up的情況。

如果重新啟動節點 1 和節點 2,請確保節點 2 不使用節點 1 作為狀態轉移donor:節點 1 的 gcache 中可能沒有所有需要的寫集。在配置文件中指定節點 3 節點作為donor並啟動mysql服務:systemctl start mysql

3.4.3 所有三個節點都正常停止

集群完全停止,關鍵問題是如何再次初始化。很重要的一點是:節點將其最後執行的位置寫入grastate.dat文件。通過比較此文件中的seqno編號,可以看到哪個是最先進的節點(很可能是最後一個停止的)。必須使用此節點引導集群,否則具有更高先進位置的節點將必須執行完整的 SST 才能加入從不太高級的集群初始化的集群。因此,一些事務將丟失)。要引導第一個節點,請像這樣調用啟動腳本:

//對於 MySQL:$ mysqld_bootstrap --wsrep-new-cluster
//對於 PXC:$ systemctl start mysql@bootstrap.service
//對於 MariaDB:$ galera_new_cluster

注意:即使從最高級的節點引導,其他節點的序列號也較低。他們仍然必須通過完整的 SST 加入,因為 Galera Cache 在重新啟動時不會保留。為此,建議在集群完全關閉之前停止寫入集群,以便所有節點可以停在同一位置。

3.4.4 一個節點從集群中消失

當一個節點由於斷電、硬體故障、內核崩潰、mysqld 崩潰或通過kill -9使mysqld pid而變得不可用時,剩下的兩個節點觀察到與節點 1 的連接已關閉,並開始嘗試重新連接它。幾次超時後,節點 1 從集群中刪除。quorum會保存更新(三個節點中有兩個已啟動),因此不會發生服務中斷。重新啟動後,節點 1 會自動加入,和「節點 1 正常停止」中所述一樣。

3.4.5 兩個節點從集群中消失

兩個節點不可用,其餘節點(節點 3)無法單獨形成quorum。集群必須切換到non-primary模式,其中 MySQL 拒絕提供任何 SQL 查詢。在這種狀態下,節點 3 上的「mysqld」進程仍在運行並且可以連接,但是與data相關的任何語句都失敗並顯示錯誤。如下示例:

mysql> select * from test.sbtest1;ERROR 1047 (08S01): WSREP has not yet prepared node for application use

在節點 3 判定它不能訪問節點 1 和節點 2 之前,可以進行讀取。禁止新的寫入。一旦其他節點可用,集群就會自動再次形成。如果節點 2 和節點 3 只是與節點 1 進行網絡隔離,但它們仍然可以相互訪問,則它們將繼續運行,因為它們仍然構成quorum。如果節點 1 和節點 2 崩潰,您需要手動啟用節點 3 上的primary組件,然後才能啟動節點 1 和節點 2。執行此操作的命令是:

mysql> SET GLOBAL wsrep_provider_options='pc.bootstrap=true';

這種方法僅適用於其他節點在執行此操作之前已關閉的情況!否則,最終會得到兩個具有不同數據的集群。

3.4.6 所有節點在沒有正確關閉程序的情況下關閉

這種情況可能發生在數據中心電源故障或遇到 MySQL 或 Galera 錯誤時。此外,這可能是由於數據一致性被破壞,集群檢測到每個節點具有不同的數據。該文件未更新且不包含有效序列號 (seqno)。grastate.dat可能看起來像這樣:

$ cat /var/lib/mysql/grastate.dat# GALERA saved stateversion: 2.1uuid: 220dcdcb-1629-11e4-add3-aec059ad3734seqno: -1safe_to_bootstrap: 0

在這種情況下,您無法確定所有節點都彼此一致。我們不能使用safe_to_bootstrap變量來確定提交了最後一個事務的節點,因為它對於每個節點都設置為 0。除非使用mysqld --wsrep-recover,否則嘗試從此類節點引導將導致失敗。

恢復位置標記為最大數字的節點是最佳引導候選數據。在grastate.dat中,將safe_to_bootstrap變量設置為1,然後,從此節點引導啟動。

3.4.7 由於腦裂,集群失去了主要狀態

假設我們有一個由偶數個節點組成的集群:例如,六個。其中三個在一個位置,而另外三個在另一個位置,並且它們失去了網絡連接。避免這種拓撲結構的最佳做法是:如果您不能擁有奇數個實際節點,則可以使用額外的仲裁節點或pc.weight為某些節點設置更高的值。但是當腦裂以任何方式發生時,沒有一個分離的組可以維持仲裁:所有節點必須停止服務請求,集群的兩個部分將不斷嘗試重新連接。

如果你想在網絡連結恢復之前恢復服務,可以使用「3.4.5 兩個節點從集群中消失」中所述的相同命令再次將其中一個組設為主組。

SET GLOBAL wsrep_provider_options='pc.bootstrap=true';

此後,你可以處理集群的手動恢復部分,而另一半部分應該能夠在網絡連結恢復後立即使用 IST 自動重新加入。

注意:如果在兩個分離的部分上都設置了 bootstrap 選項,您將最終得到兩個活動的集群實例,而數據可能會彼此分開。在這種情況下恢復網絡連結不會使它們重新加入,直到節點重新啟動並且配置文件中指定的成員再次連接。那麼,由於Galera複製模型真正關心的是數據的一致性:一旦檢測到不一致,節點因數據差異而無法執行行更改語句——將執行緊急關閉,並且是將節點帶回集群的唯一方法是通過完整的 SST。

3.5 集群訪問模式

在實際應用中,Galera集群常與haproxy配合,haproxy作為單一入口,將SQL流量分配到後端Galera,注意此處是TCP級別的,而不是SQL語句級別。如果需要SQL語句級別的,可以參考看看MaxScale,相比haproxy方案,各有應用。

實際應用的結構,haproxy作為Galera Cluster的前端,2臺haproxy用keepalived避免單點故障。後端的Galera集群是3個節點,為了避免Galera寫入衝突,在haproxy配置中,實際上只允許一個節點接受寫入,另一個節點帶有backup參數,只有當前允許寫入的節點壞掉,才會自動寫入另一個節點。為了充分利用另一個節點,同時做讀寫分離,在haproxy上監聽兩個埠,例如:3307用於寫入,3308用於讀取。

參考資料

Percona Clustercheck https://github.com/olafz/percona-clustercheck

MySQL的Galera Cluster配置說明 http://blog.sina.com.cn/s/blog_704836f40101lixp.html

galera集群啟動異常問題匯總 https://www.cnblogs.com/jinyuanliu/p/10929324.html

MySQL Galera Cluster grastate.dat文件詳解 https://blog.csdn.net/zhongbeida_xue/article/details/110000874

相關焦點

  • 程序猿成長日記 MariaDB Galera Cluster多主集群設置技巧
    MySQL資料庫是線上最常用的資料庫之一,當然MySQL的主備模型也是線上成熟的資料庫集群解決方案。那MySQL集群在實際生產中有什麼不足嗎?金無足赤,人無完人,MySQL集群同樣存在著缺點。在說MySQL集群的缺點之前,我們先聊聊MySQL集群實現的原理。
  • MySQL Cluster集群探索與實踐
    )系統裡應用內存資料庫集群的技術。MySQL集群是一種分布式設計,目標是要達到沒有任何單點故障點。因此,任何組成部分都應該擁有自己的內存和磁碟。任何共享存儲方案如網絡共享,網絡文件系統和SAN設備是不推薦或不支持的。通過這種冗餘設計,MySQL聲稱數據的可用度可以達到99.999%。實際上,MySQL集群是把一個叫做NDB的內存集群存儲引擎集成與標準的MySQL伺服器集成。
  • 資料庫系列之MySQL主從複製集群部署
    主從複製是MySQL集群部署中常用的架構,本文主要介紹MySQL主從集群架構的部署以及基於GTID主從複製的部署並進行測試驗證
  • 恆豐銀行 I MySQL MGR與Galera性能測試買家秀
    長期以來MySQL官方都缺少原生的MySQL集群多活方案,所以也給第三方公司提供了發展的機會。原文連結: http://mysqlhighavailability.com/performance-evaluation-mysql-5-7-group-replication/?
  • MySQL學習筆記(3)—— Linux下MySQL的安裝與配置
    安裝並配置 MySQL 開發環境成為一切工作的前提。MySQL的安裝MySQL 具有多平臺的特點,有兼有開源的一些特性,因此其安裝方式多樣(原始碼編譯、二進位安裝和RPM安裝等)。因此本節對 MySQL 安裝方法的介紹,採用外鏈列表的方式。Windows:官網下載.exe可執行文件安裝,或者參考百度經驗對壓縮包進行配置安裝。
  • 手把手教你MySQL資料庫安裝-Mac版
    如果你的電腦是Windows,請參考另一篇文章
  • ClickHouse實戰-高可用集群安裝
    Ansible遠程安裝Zookeeper1.3.1. zk集群配置文件$ ll zk_conftotal 8-rw-r--r-- 1 admin admin 2715 Oct 1 20:35 log4j.properties-rw-rw-r-- 1 admin admin 323 Oct 1 20:35 zoo.cfg
  • 走進 Redis:Redis 的安裝、使用以及集群的搭建
    一、Redis的安裝Redis的安裝是很簡單的,安裝之前我們需要c語言的編譯環境。如果沒有gcc需要在線安裝。 yum install gcc-c++。安裝步驟:第一步:redis的源碼包上傳到linux系統。第二步:解壓縮redis。 tar-zxvf redis-3.0.0.tar.gz第三步:編譯。
  • 安裝Consul集群
    •安裝單機版Consul詳見:《安裝單機版Consul》知識預熱Consul常用命令命令解釋示例agent運行一個consul agentconsul agent -devjoin將agent加入到consul集群consul join IPmembers列出consul cluster集群中的membersconsul membersleave將節點移除所在集群consul leave參考文檔
  • 通過搭建MySQL掌握k8s(Kubernetes)重要概念(上):網絡與持久卷
    「mysql:5.7」用的是 docker 庫裡的「MySQL」5.7 版本。這次沒有用最新的 8.0 版,因為新版跟以前的客戶端不兼容,需要修改很多東西。所用的鏡像是全版的 Linux,因而文件比較大,有 400M。容器建好了之後,鍵入「docker logs test-mysql」,查看日誌。...
  • mysql安裝圖文教程+安裝包下載
    但對於剛剛接觸mysql資料庫伺服器的朋友來說,似乎還很陌生,為大家詳細介紹一下mysql安裝圖解教程,以便初學者能夠更好的掌握此資料庫管理系統的操作。在安裝mysql資料庫之前,需要去mysql官網下載mysql安裝包,然後在進行安裝。下面一起來看看mysql安裝圖解的詳細介紹。
  • Centos7.6安裝mysql
    在CentOS中默認安裝有MariaDB,而我們需要用的mysql,所有需要將其覆蓋掉,下面是安裝過程:1、下載並安裝MySQL
  • Windows安裝與配置Mysql
    免安裝版(.zip 壓縮文件)。有的會直接進入「Choosing a Setup Type(安裝類型選擇)」窗口,根據右側的安裝類型描述文件選擇適合自己的安裝類型,這裡選擇默認的安裝類型,如圖所示。步驟 2):根據所選擇的安裝類型安裝 Windows 系統框架(framework),單擊 Execute 按鈕,安裝程序會自動完成框架的安裝,如圖所示。
  • [深度Linux系統]安裝資料庫MySQL和MySQL workbench
    一.安裝MySQL1.打開命令行 ALT+CTRL+T2.輸入sudo
  • Linux軟體安裝--二進位發布包安裝、rpm發布包安裝(案例:jdk和mysql安裝)
    二、rpm發布包採用RedHat(Redhat Package Manager)的包管理規範進行打包,獲取到相應的軟體RPM發布包,然後使用rpm命令安裝。當然如mysql/jdk也可以採用這種方式安裝,但安裝軟體可能需要依賴於其他軟體,這個方法不能自動解決包依賴的問題。示例:rpm發布包安裝mysql。
  • 如何給CentOS7安裝MySQL資料庫?15分鐘搞定!
    上周咱們弄了一個虛擬機安裝好了一個CentOS7,不知道各位小夥伴讀完了之後有沒有去安裝呢?安裝好了是否有去練習一下Linux的一些操作指令呢?有沒有感受到黑窗口帶來的魅力呢?哈哈,相信你用多了就會慢慢的更有感覺的。咱們有了一個虛擬機之後,也不能讓他閒著呀,那除了練指令之外,虛擬機還能為我們做什麼呢?
  • MySQL8.0-安裝教程
    MySQL是最流行的關係型資料庫管理系統之一,在WEB 應用方面,MySQL是最好的RDBMS (Relational Database Management System,關係資料庫管理系統)應用軟體之一,由於其社區版的性能卓越,搭配PHP 和 Apache可組成良好的開發環境MySQL8.0和的區別隱藏索引在8.0中,索引可以隱藏。
  • 惡意MySQL Server讀取MySQL Client端文件
    本文是一些學習筆記:http://scz.617.cn/network/202001101612.txthttp://scz.617.cn:8/network/202001101612.txt在RedHat 7.6上安裝MySQL 5.7.28,以便抓包觀察。
  • MySQL Server 8.0安裝配置教程
    PS:關注文章下方二維碼添加圈兒,我們分享安裝包和工具下載1、雙擊安裝包,開始安裝MySQL2、點擊i accept...接受協議,下一步3、選擇Developer Default,默認安裝所有產品,也可以按照自己的需要選擇安裝,點擊next下一步
  • 一個小時學會MySQL資料庫
    範式與效率2.1、MySQL概要2.2、系統特性2.3、存儲引擎3.1.1、設置mysql遠程訪問3.1.2、修改mysql用戶密碼3.1.2、安裝服務4.1、關係型資料庫的典型概念4.2、登錄資料庫4.3、創建資料庫4.4、創建表4.5、管理數據