Percona XtraDB Cluster之流量控制
什么是流量控制?
Percona XtraDB Cluster具有一種稱為流控制的自調(diào)節(jié)機(jī)制。該機(jī)制有助于避免集群中最弱/最慢的成員明顯落后于集群中其他成員的情況。
當(dāng)集群成員在寫數(shù)據(jù)很慢(同時(shí)又繼續(xù)從群集組通道接收寫集)時(shí),傳入/接收隊(duì)列的大小會增加。如果此隊(duì)列超過設(shè)置的閾值(gcs.fc_limit),則該節(jié)點(diǎn)將發(fā)出FLOW_CONTROL消息,要求其他成員放慢或暫停處理。
gcs.fc_limit
此設(shè)置控制何時(shí)啟用流量控制。 簡而言之,如果wsrep_local_recv_queue在給定節(jié)點(diǎn)上超過此大小,則將發(fā)送暫停的流控制消息。
fc_limit默認(rèn)為16個事務(wù)。 這實(shí)際上意味著,這可以使給定節(jié)點(diǎn)位于從集群提交事務(wù)的后面。
gcs.fc_master_slave
如果禁用了fc_master_slave(默認(rèn)情況下),則會動態(tài)修改fc_limit。 該模式實(shí)際上是根據(jù)集群中節(jié)點(diǎn)的數(shù)量動態(tài)調(diào)整fc_limit的。 群集中的節(jié)點(diǎn)越多,計(jì)算出的fc_limit越大。 其背后的理論是,集群獲得的規(guī)模越大(并且可能來自更多節(jié)點(diǎn)的寫操作越忙),每個節(jié)點(diǎn)的應(yīng)用空間就越遠(yuǎn)。
如果僅寫入PXC中的單個節(jié)點(diǎn),則建議您通過設(shè)置fc_master_slave = YES來禁用此功能。 無論是否動態(tài)調(diào)整fc_limit的大小,此設(shè)置實(shí)際上只不過是要更改。 它沒有任何其他能力可以幫助PXC中的單節(jié)點(diǎn)提高更好的寫能力。
gcs.fc_factor
如果fc_limit控制何時(shí)啟用流控制,則fc_factor在釋放時(shí)進(jìn)行尋址。 該系數(shù)是介于0.0到1.0之間的數(shù)字,該數(shù)字乘以當(dāng)前的fc_limit(如果fc_master_slave = NO,則通過上述計(jì)算進(jìn)行調(diào)整)。 這樣就產(chǎn)生了在節(jié)點(diǎn)發(fā)出另一條流控制消息之前,recv隊(duì)列必須降至低于事務(wù)級別的事務(wù)數(shù),該消息向群集授予了繼續(xù)復(fù)制的權(quán)限。
fc_factor默認(rèn)為0.5,這意味著在恢復(fù)復(fù)制之前,隊(duì)列必須降至fc_limit的50%以下。 在這種情況下,較大的fc_limit可能意味著要等待很長時(shí)間才能再次放松流量控制。 但是,最近將此值修改為默認(rèn)值1.0,以允許復(fù)制盡快恢復(fù)。
對于最終用戶來說,流控是透明的,但是對于集群管理員而言,重要的是要知道節(jié)點(diǎn)是否在使用流控制。如果是這樣,它將影響整個群集的生產(chǎn)率。
查找節(jié)點(diǎn)是否處于流控制中
FLOW_CONTROL不是持久狀態(tài)。隊(duì)列大小超過設(shè)置的閾值后,節(jié)點(diǎn)將進(jìn)入FLOW_CONTROL。一旦隊(duì)列大小回到低端水平以下,它將再次釋放。
如何看待較高和較低的閾值
從Percona XtraDB Cluster 5.7.17-29.20開始,現(xiàn)在可以通過SHOW STATUS來查看較低和較高閾值:
- 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狀態(tài)變量發(fā)出一個范圍,該范圍代表較低和較高的水平。值集(3547, 3547)表示如果傳入隊(duì)列大小大于3547,則啟用FLOW_CONTROL。如果大小小于3547,則釋放FLOW_CONTROL。
盡管如此,這仍無法顯示節(jié)點(diǎn)在任何給定時(shí)刻是否正在使用FLOW_CONTROL。
為了解決這個問題,PXC在版本中同時(shí)引入了wsrep_flow_control_status狀態(tài)變量。此布爾值狀態(tài)變量告訴用戶該節(jié)點(diǎn)是否在FLOW_CONTROL中。一旦節(jié)點(diǎn)處于流控制之外,則當(dāng)節(jié)點(diǎn)采用流控制時(shí),變量將切換為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計(jì)數(shù)器可用于跟蹤FLOW_CONTROL狀態(tài)。這顯示了流控制啟動的總次數(shù)。您可以使用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 |
- +----------------------------------+----------------+
【編輯推薦】