1)監控集群的一致性
mysql>show status like 'wsrep_cluster_state_uuid';
通過檢查變量wsrep_cluster_state_uuid的值,確認此節點是否屬於正確的集群。該變量的值在集群的各個節點中必須相同,如果某個節點出現不同的值,說明此節點沒有連接到集群中。
mysql>show status like 'wsrep_cluster_conf_id';
通過檢查變量wsrep_cluster_conf_id的值,用於查看集群發生變化的總數,同時確認此節點是否屬於主集群。該變量的值在集群的各個節點中必須相同,如果某個節點出現不同的值,說明此節點脫離集群了,需要檢查網絡連接等將其恢復到一致的狀態。
mysql>show status like 'wsrep_cluster_size';
通過檢查變量wsrep_cluster_size的值,查看集群節點的總數。在當前集群中有節點的數量,實際理解就是加入的服務器數量。查詢了實際環境中的默認值是 3(因為我部署了三台),此值實際經驗是要大於等於3且數值最好是奇數,偶數容易產生腦裂現象。
mysql> show status like 'wsrep_cluster_status';
通過檢查變量wsrep_cluster_status的值,查看節點的狀態是否為Primary,若不為Primary,表示集群部分節點不可用,甚至可能是集群出現了腦裂。
如果所有節點的狀態都不為Primary,就需要重置仲裁,如果不能重置仲裁,就需要手動重啟。
第一步,關閉所有節點
第二步,重啟各個節點,重啟過程中可以參考wsrep_last_committed的值確定主節點。
注:手動重啟的缺點是會造成緩存丟失,從而不能做IST。
注意事項
請不要在少於3個節點時候關閉數據庫,否則需要重新引導
集群建好后,如果需要全部關閉,在啟動時需要重新引導
對於MyISAM等非事務表,只會同步DDL不會同步DML,如新建一張MyISAM表並插入數據,其他節點會新建表但是不會插入數據(行數為0)
2)監控節點狀態
mysql> show status like 'wsrep_ready';
通過檢查變量wsrep_ready的值,查看該節點的狀態是否可以正常使用SQL語句。如果為ON,表示正常,若為OFF,需進一步檢查wsrep_connected的值。
mysql> show status like 'wsrep_connected';
如果此變量的值為OFF,說明該節點還沒有加入到任何一個集群組件中,這很可能是因為配置文件問題,例如wsrep_cluster_address或者wsrep_cluster_name值設置錯誤,也可以通過查看錯誤日志進一步定位原因。
如果節點連接沒有問題,但wsrep_ready的值還為OFF,檢查wsrep_local_state_comment的值。
mysql> show status like 'wsrep_local_state_comment';
當節點的狀態為Primary時,wsrep_local_state_comment的值一般為Joining, Waiting for SST, Joined, Synced或者Donor,如果wsrep_ready為OFF,並且wsrep_local_state_comment的值為Joining, Waiting for SST, Joined其中一個,說明此節點正在執行同步。
當節點的狀態不為Primary時,wsrep_local_state_comment的值應該為Initialized。任何其他狀態都是短暫的或臨時的。
3)檢測復制的健康狀態
mysql> show status like 'wsrep_flow_control_paused';
通過檢查變量wsrep_flow_control_paused的值,可以確認有多少slave延遲在拖慢整個集群的,從而查看復制的健康狀態。這個值越接近0.0越好,優化的方法主要通過增加配置文件中wsrep_slave_threads的值,或者將復制很慢的節點剔除出集群。wsrep_slave_threads取值可以參考wsrep_cert_deps_distance,wsrep_cert_deps_distance表示並發事務處理數的均值,wsrep_slave_threads的值不應該比wsrep_cert_deps_distance高很多。
4)檢測網絡慢的問題
mysql> show status like 'wsrep_local_send_queue_avg';
通過檢查變量wsrep_local_send_queue_avg的值,可以檢測網絡狀態。如果此變量的值偏高,說明網絡連接可能是瓶頸。造成此情況的原因可能出現在物理層或操作系統層的配置上。
5)集群監控通知擴展
通過wsrep_notify_cmd參數調用命令腳本的二次擴展。
wsrep狀態監控
mysql> show status like '%wsrep%'; +------------------------------------------+-------------------------------------------------------+ | Variable_name | Value | +------------------------------------------+-------------------------------------------------------+ | wsrep_local_state_uuid | e8149a5c-636a-11e5-8b4b-67b16bb666a4 | | wsrep_protocol_version | 7 | | wsrep_last_committed | 526498 | | wsrep_replicated | 526498 | | wsrep_replicated_bytes | 238196578 | | wsrep_repl_keys | 1926403 | | wsrep_repl_keys_bytes | 27520685 | | wsrep_repl_data_bytes | 176980021 | | wsrep_repl_other_bytes | 0 | | wsrep_received | 7970 | | wsrep_received_bytes | 64791 | | wsrep_local_commits | 526357 | | wsrep_local_cert_failures | 0 | | wsrep_local_replays | 0 | | wsrep_local_send_queue | 0 | | wsrep_local_send_queue_max | 2 | | wsrep_local_send_queue_min | 0 | | wsrep_local_send_queue_avg | 0.000041 | | wsrep_local_recv_queue | 0 | | wsrep_local_recv_queue_max | 4 | | wsrep_local_recv_queue_min | 0 | | wsrep_local_recv_queue_avg | 0.034504 | | wsrep_local_cached_downto | 1 | | wsrep_flow_control_paused_ns | 22690449177 | | wsrep_flow_control_paused | 0.000005 | | wsrep_flow_control_sent | 0 | | wsrep_flow_control_recv | 371 | | wsrep_cert_deps_distance | 74.734609 | | wsrep_apply_oooe | 0.000000 | | wsrep_apply_oool | 0.000000 | | wsrep_apply_window | 1.000000 | | wsrep_commit_oooe | 0.000000 | | wsrep_commit_oool | 0.000000 | | wsrep_commit_window | 1.000000 | | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | | wsrep_cert_index_size | 43 | | wsrep_cert_bucket_count | 126282 | | wsrep_gcache_pool_size | 261431296 | | wsrep_causal_reads | 0 | | wsrep_cert_interval | 0.000002 | | wsrep_incoming_addresses | 10.130.7.5:3306,,10.130.7.4:3306 | | wsrep_evs_delayed | | | wsrep_evs_evict_list | | | wsrep_evs_repl_latency | 0/0/0/0/0 | | wsrep_evs_state | OPERATIONAL | | wsrep_gcomm_uuid | e813b31f-636a-11e5-90c7-0f6d378e1dfb | | wsrep_cluster_conf_id | 5 | | wsrep_cluster_size | 3 | | wsrep_cluster_state_uuid | e8149a5c-636a-11e5-8b4b-67b16bb666a4 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_local_bf_aborts | 0 | | wsrep_local_index | 2 | | wsrep_provider_name | Galera | | wsrep_provider_vendor | Codership Oy <info@codership.com> | | wsrep_provider_version | 3.11(rXXXX) | | wsrep_ready | ON | +----------------------------------------+---------------------------------------------------+ 58 rows in set (0.12 sec)
該語句查詢出來可能有60個,可能大多數都不是我們需要的
但是有些是你需要查看的,我們可以簡單分為3個種類
集群完整性(Cluster's Integrity) 節點狀態(node status) 復制健康度(replication health)
1.集群完整性
該分類主要有如下狀態變量
wsrep_cluster_state_uuid
wsrep_cluster_conf_id
wsrep_cluster_size
wsrep_cluster_status
1.1 檢查UUID
我們知道集群內節點是相互同步的,這意味着他們執行完了所有的相同的事務
每個事務由一個uuid來標識,所以所有節點最后執行的uuid應該是一樣的
所以我們在所有節點查詢uuid並比較
所有節點
SHOW GLOBAL STATUS LIKE 'wsrep_cluster_state_uuid' \G
如果最后個節點和其他的不一致,可能是由於正在執行導致
1.2 節點數量
對於一個健康的集群,所有節點查詢出來的集群大小應該是一致的,應該是所有節點的個數
所有節點
SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size';
1.3 集群變化次數
對於一個健康的集群,所有節點的集群變化次數應該是一致的,重啟數據庫算2次(關閉和啟動)
所有節點
SHOW GLOBAL STATUS LIKE 'wsrep_cluster_conf_id';
如果該值非常大,可能會是由於節點不斷的被踢出和加入導致,需要查看
2. 各節點狀態
我們日常除了查詢集群整體狀態,對於各個節點我們也應該有所關注
主要有如下狀態變量
wsrep_ready
wsrep_connected
wsrep_local_state_comment
節點連接狀態
我們可以查詢如下變量來查看該節點是否在集群內
SHOW GLOBAL STATUS LIKE 'wsrep_ready'; SHOW GLOBAL STATUS LIKE 'wsrep_connected';
該值必須為ON
如果為OFF說明有問題,在該節點的事務會失敗
可能是由於節點故障,網絡問題,也可能是參數配置錯誤
wsrep_cluster_address
wsrep_cluster_name
我們可以在錯誤日志中查看相關錯誤
節點在集群中的狀態
我們使用如下語句查詢節點在集群中的狀態
SHOW GLOBAL STATUS LIKE 'wsrep_local_state_comment';
其結果很容易理解,有:
Joining
Waiting on SST
Joined
Synced
Donor
一般應該為Synced,代表已同步
復制性能狀態
通過上面的查詢我們可以知道集群的是否正常,且不會對服務器造成大的負載
當復制隊列中有很多寫集,節點會觸發Flow Control機制暫停復制用來緩解服務器壓力
我們可以監控如下變量來檢查該機制的運行情況
wsrep_local_recv_queue_avg
wsrep_flow_control_paused
wsrep_cert_deps_distance
上面三個變量,當執行FLUSH STATUS 命令時會被清零
大量寫狀態
下面的變量顯示上次狀態查詢以來本地隊列的平均大小
SHOW STATUS LIKE 'wsrep_local_send_queue_avg';
如圖:
該值大於0代表,節點無法及時應用接收到的寫集
這時我們需要查詢如下變量來查看最大和最小值
wsrep_local_recv_queue_min
wsrep_local_recv_queue_max
Flow Control Paused
如果你懷疑節點負載較大,你可以執行flush status之后等待一段時間,再查詢如下值
SHOW STATUS LIKE 'wsrep_flow_control_paused';
其顯示了在這段時間內復制進程暫停了多久(百分比),任何大於0的數值說明復制的性能不佳
如果值為0.18,代表18%的時間
你可以不時的查詢該值來檢查其是否是0(記得先執行flush status來清零以前的值),如果不能解決,需要增加slave thread的值(wsrep_slave_threads)
並行恢復
我們可以查詢如下變量來評估節點是否可以啟用並行恢復
SHOW STATUS LIKE 'wsrep_cert_deps_distance';
如圖:
我們可以根據該值來參考設置wsrep_slave_threads的值
wsrep相關參數含義介紹:
wsrep_local_state_uuid:存儲於該節點的UUID狀態
wsrep_protocol_version:wsrep協議使用的版本
wsrep_last_committed:最后提交事務的序列號
wsrep_replicated:發送到其他節點的writesets總數
wsrep_replicated_bytes:發送到其他節點的writesets總字節數
wsrep_repl_keys:復制keys總數
wsrep_repl_keys_bytes:復制keys總字節數
wsrep_repl_data_bytes:復制數據的總字節數
wsrep_repl_other_bytes:其他復制的總字節數
wsrep_received:從其他節點接收的writesets總數
wsrep_received_bytes:從其他節點接收的writesets總字節數
wsrep_local_commits:該節點提交的writesets總數
wsrep_local_cert_failures:認證測試中失敗的writesets總數
wsrep_local_replays:因非對稱鎖粒度回放的事務數
wsrep_local_send_queue:當前發送隊列的長度,表示等待被發送的writesets數
wsrep_local_send_queue_avg:網絡瓶頸的預兆。如果這個值比較高的話,可能存在網絡瓶
wsrep_local_recv_queue:當前接收隊列的長度,表示等待被使用的writesets數
wsrep_local_recv_queue_avg:表示slave事務隊列的平均長度,slave瓶頸的預兆
wsrep_local_cached_downto:gcache的最小序列號,這個變量可以用來判斷是用IST,還是SST。如果此值為0,表示gcache中沒有writesets
wsrep_flow_control_paused_ns:表示復制停止了多長時間,以納秒為單位
wsrep_flow_control_paused:表示復制停止了多長時間。即表明集群因為Slave延遲而慢的程度,值為0~1,越靠近0越好,值為1表示復制完全停止。可優化wsrep_slave_threads的值來改善
wsrep_flow_control_sent:表示該節點已經停止復制了多少次
wsrep_flow_control_recv:表示該節點已經停止復制了多少次
wsrep_cert_deps_distance:有多少事務可以並行應用處理。wsrep_slave_threads設置的值不應該高出該值太多
wsrep_apply_oooe:並發執行效率,writesets應用於out-of-order的頻率
wsrep_apply_oool:大序列值的writeset比小序列值的writeset多出的執行頻率
wsrep_apply_window:同時使用的最高序列值和最小序列值間的平均差值
wsrep_commit_oooe:事務脫離隊列的頻率
wsrep_commit_window:同時提交的最大序列值和最小序列值間的平均差值
wsrep_local_state:galera狀態值
1 - Joining (requesting/receiving State Transfer) –表示此節點正在加入集群
2 - Donor/Desynced –表示正在加入的節點是donor
3 - Joined –表示節點已經加入集群r
4 - Synced –表示節點已經和集群同步
Open:節點啟動成功,嘗試連接到集群
Primary: 節點已處於集群中,在新節點加入時,選取donor進行數據庫同步時會產生的狀態
Joiner: 節點處於等待接收或正在接收同步文件的狀態
Joined: 節點完成數據同步,但還有部分數據不是最新的,在追趕與集群數據一致的狀態
Synced: 節點正常提供服務的狀態,表示當前節點數據狀態與集群數據狀態是一致的
Donor: 表示該節點被選為Donor節點,正在為新加進來的節點進行全量數據同步,此時該節點對客戶端不提供服務
wsrep_local_state_comment:galera狀態,如果wsrep_connected為On,但wsrep_ready為OFF,則可以從該項查看原因
wsrep_cert_index_size:certification索引的entries數量
wsrep_cert_bucket_count:哈希表中certification索引的cells數
wsrep_gcache_pool_size:page pool或者為gcache動態分配的字節數
wsrep_causal_reads:writesets處理數
wsrep_incoming_addresses:以逗號分隔顯示集群中的節點地址
wsrep_evs_repl_latency:提供集群節點間通信復制延遲信息
wsrep_evs_delayed:被剔除出集群的UUID
wsrep_evs_evict_list:有延遲的節點列表
wsrep_evs_state:EVS協議狀態
wsrep_gcomm_uuid:galera的view_id,不同於集群的uuid,在gvwstate.dat可以查看到
wsrep_cluster_conf_id:集群成員發生變化的數目,正常情況下所有節點上該值是一樣的。如果值不同,說明該節點被臨時"分區"了。當節點之間網絡連接恢復的時候應該會恢復一樣的值
wsrep_cluster_size:集群中的節點數目,如果這個值跟預期的節點數一致,則所有的集群節點已經連接
wsrep_cluster_state_uuid:集群的UUID值,在集群所有節點的值應該是相同的,有不同值的節點,說明其沒有連接入集群
wsrep_cluster_status:集群節點的狀態。如果不為"Primary",說明出現"分區"或是"split-brain"狀況,可能的取值為:Primary、Non-Primary、Disconnected
wsrep_connected:節點是否連接到集群,如果該值為Off,且wsrep_ready的值也為Off,則說明該節點沒有連接到集群。(可能是wsrep_cluster_address或wsrep_cluster_name等配置錯造成的。具體錯誤需要查看錯誤日志)
wsrep_local_bf_aborts:被其他節點上的事務終止的正在執行的本地事務數
wsrep_local_index:集群節點索引
wsrep_provider_name:wsrep程序提供者
wsrep_provider_vendor:wsrep供應商
wsrep_provider_version:wsrep程序提供者的版本
wsrep_ready:節點是否可以提供查詢。該值為ON,則說明可以接受SQL負載。如果為Off,則需要檢查wsrep_connected
監控
本節說明監控Galera集群的主要方法,包括查詢狀態變量、使用腳本監控和檢查數據庫服務器日志等。
1. 使用狀態變量
可以使用標准查詢檢查整個集群中寫集復制的狀態:
mysql> show global status like 'wsrep_%'; +------------------------------+----------------------------------------------------------------+ | Variable_name | Value | +------------------------------+----------------------------------------------------------------+ | wsrep_local_state_uuid | 4a6db23a-f9de-11e9-ba76-93e71f7c9a45 | | wsrep_protocol_version | 9 | | ... | ... | | wsrep_ready | ON | +------------------------------+----------------------------------------------------------------+ 60 rows in set (0.00 sec)
下面列舉一些需要重點監控的狀態變量。
(1)檢查集群完整性
可以使用以下狀態變量檢查群集完整性:
1.wsrep_cluster_state_uuid:集群狀態uuid,可以使用它確定節點是否屬於集群的一部分。群集中的每個節點都應提供相同的值。
當一個節點具有不同值時,表示它不再連接到集群。一旦節點重新連接到集群,該狀態變量的值變為與集群其它節點一致。
2.wsrep_cluster_conf_id:發生群集成員身份更改的總數,可以使用它確定節點是否是主組件的一部分。群集中的每個節點都應提供相同的值。
當一個節點具有不同值時,表示集群已經發生網絡分區。一旦節點重新連接到集群,該狀態變量的值變為與集群其它節點一致。
3.wsrep_cluster_size:集群中的節點數量,可以使用它來確定是否缺少節點。當返回值小於集群中的節點數時,表示某些節點已經與集群失去連接。
4.wsrep_cluster_status:節點所在的群集主組件狀態,可用於確定群集是否處於網絡分區狀態。節點的返回值只應該為primary,
任何其它值都表示該節點是不可操作組件的一部分。這發生在多個成員的變化導致失去法定票數,或腦裂情況下。如果檢查群集中的所有節點都不返回Primary,則需要重置仲裁。
當每個節點上的這些狀態變量都返回所需結果時,集群具有完整性,這意味着復制可以在每個節點上正常進行。下一步是檢查節點狀態,以確保它們都處於工作狀態並能夠接收寫集。
(2)檢查節點狀態
節點狀態顯示節點是否接收和處理來自群集寫集的更新,並可能揭示阻止復制的問題。
1.wsrep_ready:節點是否可以接受查詢。當節點返回值ON時,它可以接受來自集群的寫集。當它返回值OFF時,所有查詢都將失敗,
並出現錯誤:ERROR 1047 (08501) Unknown Command。 2.wsrep_connected:節點是否與任何其它節點連接。當該值為ON時,該節點與構成群集的一個或多個節點連接。當該值為OFF時,該節點沒有與任何群集其它節點的連接。
連接丟失的原因可能與配置錯誤有關,例如wsrep_cluster_address或wsrep_cluster_name參數不對。檢查錯誤日志以獲得正確的診斷。 3.wsrep_local_state_comment:節點狀態注釋。當節點是主組件的一部分時,典型的返回值是join、waiting on sst、joined、synced或donor。
如果節點是不可操作組件的一部分,則返回值為Initialized。如果節點返回除此以外的值,則狀態注釋是瞬時的,應再次檢查狀態變量以獲取更新。
如果每個狀態變量返回所需的值,則節點處於工作狀態,這意味着它正在從集群接收寫集並將它們復制到本地數據庫中的表中。
(3)檢查復制運行狀況
群集完整性和節點狀態相關變量可以反映阻止復制的問題。而以下狀態變量將有助於識別性能問題。這些變量是變化的,每次執行FLUSH STATUS后都會重置。
1.wsrep_local_recv_queue_avg:自上次FLUSH STATUS以來本地接收隊列的平均事務數。當節點返回一個大於0的值時,說明應用寫集慢於接收寫集,
一個較大值可能觸發流控。除此狀態變量外,還可以使用wsrep_local_recv_queue_max和wsrep_local_recv_queue_min查看節點本地接收隊列的最大、最小值。 2.wsrep_flow_control_paused:自上次FLUSH STATUS以來節點因流控而暫停的時長。如果flush status和show status之間的時間為1分鍾,並且節點返回0.25,
則表示該節點在該時間段內總共暫停了15秒。返回0時,表示該節點在此期間沒有由於流控而暫停。返回1時,表示該節點在整個時段都處於暫停復制狀態。
理想情況下,返回值應盡可能接近0,如果發現節點經常暫停,可以調整wsrep_slave_threads參數增加應用寫集的線程數,也可以從集群中移除該節點。 3.wsrep_cert_deps_distance:節點可能並行應用的事務序號之差,表示節點的並行化程度。可與wsrep_slave_threads參數配合使用,
wsrep_slave_threads的值不應該大於此狀態變量的值。
(4)檢測網絡
wsrep_local_send_queue_avg:自上次FLUSH STATUS以來發送隊列中的平均事務數。如果該值遠大於0,表示網絡吞吐量可能有問題。從服務器的物理組件到操作系統配置,任何層級都可能導致出現此問題。除此狀態變量外,還可以使用wsrep_local_send_queue_max和wsrep_local_send_queue_min查看節點本地發送隊列的最大、最小值。
參考:
https://www.cnblogs.com/feiyun8616/p/11680010.html
https://wxy0327.blog.csdn.net/article/details/102819470
http://blog.itpub.net/28413242/viewspace-2656228/