Percona XtraDB Cluster之流量控制

运维 系统运维
Percona XtraDB Cluster具有一种称为流控制的自调节机制。该机制有助于避免集群中最弱/最慢的成员明显落后于集群中其他成员的情况。

[[386221]]

 什么是流量控制?

Percona XtraDB Cluster具有一种称为流控制的自调节机制。该机制有助于避免集群中最弱/最慢的成员明显落后于集群中其他成员的情况。

当集群成员在写数据很慢(同时又继续从群集组通道接收写集)时,传入/接收队列的大小会增加。如果此队列超过设置的阈值(gcs.fc_limit),则该节点将发出FLOW_CONTROL消息,要求其他成员放慢或暂停处理。

gcs.fc_limit

此设置控制何时启用流量控制。 简而言之,如果wsrep_local_recv_queue在给定节点上超过此大小,则将发送暂停的流控制消息。

fc_limit默认为16个事务。 这实际上意味着,这可以使给定节点位于从集群提交事务的后面。

gcs.fc_master_slave

如果禁用了fc_master_slave(默认情况下),则会动态修改fc_limit。 该模式实际上是根据集群中节点的数量动态调整fc_limit的。 群集中的节点越多,计算出的fc_limit越大。 其背后的理论是,集群获得的规模越大(并且可能来自更多节点的写操作越忙),每个节点的应用空间就越远。

如果仅写入PXC中的单个节点,则建议您通过设置fc_master_slave = YES来禁用此功能。 无论是否动态调整fc_limit的大小,此设置实际上只不过是要更改。 它没有任何其他能力可以帮助PXC中的单节点提高更好的写能力。

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,以允许复制尽快恢复。

对于最终用户来说,流控是透明的,但是对于集群管理员而言,重要的是要知道节点是否在使用流控制。如果是这样,它将影响整个群集的生产率。

查找节点是否处于流控制中

FLOW_CONTROL不是持久状态。队列大小超过设置的阈值后,节点将进入FLOW_CONTROL。一旦队列大小回到低端水平以下,它将再次释放。

如何看待较高和较低的阈值

从Percona XtraDB Cluster 5.7.17-29.20开始,现在可以通过SHOW STATUS来查看较低和较高阈值:

  1. mysql> show status like 'wsrep_flow_control_interval'
  2. +-----------------------------+----------------+ 
  3. | Variable_name               | Value          | 
  4. +-----------------------------+----------------+ 
  5. | wsrep_flow_control_interval | [ 3547, 3547 ] | 
  6. +-----------------------------+----------------+ 
  7. 1 row in set (0.01 sec) 

 如您所见,

wsrep_flow_control_interval状态变量发出一个范围,该范围代表较低和较高的水平。值集(3547, 3547)表示如果传入队列大小大于3547,则启用FLOW_CONTROL。如果大小小于3547,则释放FLOW_CONTROL。

尽管如此,这仍无法显示节点在任何给定时刻是否正在使用FLOW_CONTROL。

为了解决这个问题,PXC在版本中同时引入了wsrep_flow_control_status状态变量。此布尔值状态变量告诉用户该节点是否在FLOW_CONTROL中。一旦节点处于流控制之外,则当节点采用流控制时,变量将切换为OFF,反之则为ON:

  1. mysql> show status like '%flow%'
  2. +-------------------------------------------------------+----------------+ 
  3. | Variable_name                                         | Value          | 
  4. +-------------------------------------------------------+----------------+ 
  5. | Innodb_scrub_background_page_split_failures_underflow | 0              | 
  6. | Ssl_session_cache_overflows                           | 370780         | 
  7. | Table_open_cache_overflows                            | 0              | 
  8. | wsrep_flow_control_paused_ns                          | 7056357841773  | 
  9. | wsrep_flow_control_paused                             | 0.000901       | 
  10. | wsrep_flow_control_sent                               | 0              | 
  11. | wsrep_flow_control_recv                               | 176            | 
  12. | wsrep_flow_control_interval                           | [ 3547, 3547 ] | 
  13. | wsrep_flow_control_interval_low                       | 3547           | 
  14. | wsrep_flow_control_interval_high                      | 3547           | 
  15. | wsrep_flow_control_status                             | OFF            | 
  16. +-------------------------------------------------------+----------------+ 

 最后,wsrep_flow_control_sent / recv计数器可用于跟踪FLOW_CONTROL状态。这显示了流控制启动的总次数。您可以使用FLUSH STATUS清除它们。

  1. mysql> show global status like 'wsrep_flow%'
  2. +----------------------------------+----------------+ 
  3. | Variable_name                    | Value          | 
  4. +----------------------------------+----------------+ 
  5. | wsrep_flow_control_paused_ns     | 6893631531679  | 
  6. | wsrep_flow_control_paused        | 0.000413       | 
  7. | wsrep_flow_control_sent          | 5366           | 
  8. | wsrep_flow_control_recv          | 5369           | 
  9. | wsrep_flow_control_interval      | [ 3547, 3547 ] | 
  10. | wsrep_flow_control_interval_low  | 3547           | 
  11. | wsrep_flow_control_interval_high | 3547           | 
  12. | wsrep_flow_control_status        | OFF            | 
  13. +----------------------------------+----------------+ 
  14.  
  15. mysql> flush status 
  16.  
  17. mysql> show global status like 'wsrep_flow%'
  18. +----------------------------------+----------------+ 
  19. | Variable_name                    | Value          | 
  20. +----------------------------------+----------------+ 
  21. | wsrep_flow_control_paused_ns     | 6893631531679  | 
  22. | wsrep_flow_control_paused        | 0.000413       | 
  23. | wsrep_flow_control_sent          | 0           | 
  24. | wsrep_flow_control_recv          | 0           | 
  25. | wsrep_flow_control_interval      | [ 3547, 3547 ] | 
  26. | wsrep_flow_control_interval_low  | 3547           | 
  27. | wsrep_flow_control_interval_high | 3547           | 
  28. | wsrep_flow_control_status        | OFF            | 
  29. +----------------------------------+----------------+ 

 【编辑推荐】

 

责任编辑:姜华 来源: 今日头条
相关推荐

2021-05-12 09:13:48

MySQL数据库Docker搭建

2010-02-03 23:04:31

流量控制P2P华夏创新

2023-10-08 12:14:42

Sentinel流量控制

2011-06-23 09:09:37

流量控制

2013-07-22 14:25:29

iOS开发ASIHTTPRequ

2010-06-04 10:49:58

Linux流量控制

2010-06-17 17:00:07

Linux流量控制

2010-05-27 11:03:44

Linux流量控制

2010-08-06 10:02:07

2019-07-02 10:22:15

TCP流量数据

2009-02-05 10:13:00

局域网流量控制数据流量

2010-06-04 11:21:42

Linux 流量控制

2021-03-22 08:06:59

SpringBootSentinel项目

2024-03-04 00:02:00

Redis存储令牌

2016-12-13 08:45:48

2010-11-30 09:40:15

流量控制设备AllotQOS策略

2023-06-20 08:10:00

2009-10-27 20:14:15

数据传输流量控制网管技巧

2010-05-27 10:43:29

Linux流量控制

2011-08-09 15:52:08

点赞
收藏

51CTO技术栈公众号