Percona XtraDB Cluster之流量控制

什麼是流量控制?

Percona XtraDB Cluster具備一種稱爲流控制的自調節機制。該機制有助於避免集羣中最弱/最慢的成員明顯落後於集羣中其餘成員的狀況。
當集羣成員在寫數據很慢(同時又繼續從羣集組通道接收寫集)時,傳入/接收隊列的大小會增長。若是此隊列超過設置的閾值(gcs.fc_limit),則該節點將發出FLOW_CONTROL消息,要求其餘成員放慢或暫停處理。mysql

gcs.fc_limit

此設置控制什麼時候啓用流量控制。 簡而言之,若是wsrep_local_recv_queue在給定節點上超過此大小,則將發送暫停的流控制消息。
fc_limit默認爲16個事務。 這實際上意味着,這能夠使給定節點位於從集羣提交事務的後面。sql

gcs.fc_master_slave

若是禁用了fc_master_slave(默認狀況下),則會動態修改fc_limit。 該模式其實是根據集羣中節點的數量動態調整fc_limit的。 羣集中的節點越多,計算出的fc_limit越大。 其背後的理論是,集羣得到的規模越大(而且可能來自更多節點的寫操做越忙),每一個節點的應用空間就越遠。shell

若是僅寫入PXC中的單個節點,則建議您經過設置fc_master_slave = YES來禁用此功能。 不管是否動態調整fc_limit的大小,此設置實際上只不過是要更改。 它沒有任何其餘能力能夠幫助PXC中的單節點提升更好的寫能力。session

gcs.fc_factor

若是fc_limit控制什麼時候啓用流控制,則fc_factor在釋放時進行尋址。 該係數是介於0.0到1.0之間的數字,該數字乘以當前的fc_limit(若是fc_master_slave = NO,則經過上述計算進行調整)。 這樣就產生了在節點發出另外一條流控制消息以前,recv隊列必須降至低於事務級別的事務數,該消息向羣集授予了繼續複製的權限。
fc_factor默認爲0.5,這意味着在恢復複製以前,隊列必須降至fc_limit的50%如下。 在這種狀況下,較大的fc_limit可能意味着要等待很長時間才能再次放鬆流量控制。 可是,最近將此值修改成默認值1.0,以容許複製儘快恢復。code

對於最終用戶來講,流控是透明的,可是對於集羣管理員而言,重要的是要知道節點是否在使用流控制。若是是這樣,它將影響整個羣集的生產率。隊列

查找節點是否處於流控制中

FLOW_CONTROL不是持久狀態。隊列大小超過設置的閾值後,節點將進入FLOW_CONTROL。一旦隊列大小回到低端水印如下,它將再次釋放。事務

如何看待較高和較低的閾值
從Percona XtraDB Cluster 5.7.17-29.20開始,如今能夠經過SHOW STATUS來查看較低和較高閾值:it

mysql> show status like 'wsrep_flow_control_interval';
+-----------------------------+----------------+
| Variable_name               | Value          |
+-----------------------------+----------------+
| wsrep_flow_control_interval | [ 3547, 3547 ] |
+-----------------------------+----------------+
1 row in set (0.01 sec)

如您所見,wsrep_flow_control_interval狀態變量發出一個範圍,該範圍表明較低和較高的水平。值集(3547, 3547)表示若是傳入隊列大小大於3547,則啓用FLOW_CONTROL。若是大小小於3547,則釋放FLOW_CONTROL。io

儘管如此,這仍沒法顯示節點在任何給定時刻是否正在使用FLOW_CONTROL。ast

爲了解決這個問題,PXC在版本中同時引入了wsrep_flow_control_status狀態變量。此布爾值狀態變量告訴用戶該節點是否在FLOW_CONTROL中。一旦節點處於流控制以外,則當節點採用流控制時,變量將切換爲OFF,反之則爲ON

mysql> show status like '%flow%';
+-------------------------------------------------------+----------------+
| Variable_name                                         | Value          |
+-------------------------------------------------------+----------------+
| Innodb_scrub_background_page_split_failures_underflow | 0              |
| Ssl_session_cache_overflows                           | 370780         |
| Table_open_cache_overflows                            | 0              |
| wsrep_flow_control_paused_ns                          | 7056357841773  |
| wsrep_flow_control_paused                             | 0.000901       |
| wsrep_flow_control_sent                               | 0              |
| wsrep_flow_control_recv                               | 176            |
| wsrep_flow_control_interval                           | [ 3547, 3547 ] |
| wsrep_flow_control_interval_low                       | 3547           |
| wsrep_flow_control_interval_high                      | 3547           |
| wsrep_flow_control_status                             | OFF            |
+-------------------------------------------------------+----------------+

最後,wsrep_flow_control_sent / recv計數器可用於跟蹤FLOW_CONTROL狀態。這顯示了流控制啓動的總次數。您能夠使用FLUSH STATUS清除它們。

mysql> show global status like 'wsrep_flow%';
+----------------------------------+----------------+
| Variable_name                    | Value          |
+----------------------------------+----------------+
| wsrep_flow_control_paused_ns     | 6893631531679  |
| wsrep_flow_control_paused        | 0.000413       |
| wsrep_flow_control_sent          | 5366           |
| wsrep_flow_control_recv          | 5369           |
| wsrep_flow_control_interval      | [ 3547, 3547 ] |
| wsrep_flow_control_interval_low  | 3547           |
| wsrep_flow_control_interval_high | 3547           |
| wsrep_flow_control_status        | OFF            |
+----------------------------------+----------------+

mysql> flush status

mysql> show global status like 'wsrep_flow%';
+----------------------------------+----------------+
| Variable_name                    | Value          |
+----------------------------------+----------------+
| wsrep_flow_control_paused_ns     | 6893631531679  |
| wsrep_flow_control_paused        | 0.000413       |
| wsrep_flow_control_sent          | 0           |
| wsrep_flow_control_recv          | 0           |
| wsrep_flow_control_interval      | [ 3547, 3547 ] |
| wsrep_flow_control_interval_low  | 3547           |
| wsrep_flow_control_interval_high | 3547           |
| wsrep_flow_control_status        | OFF            |
+----------------------------------+----------------+
相關文章
相關標籤/搜索