Percona XtraDB Cluster具备一种称为流控制的自调节机制。该机制有助于避免集群中最弱/最慢的成员明显落后于集群中其余成员的状况。
当集群成员在写数据很慢(同时又继续从群集组通道接收写集)时,传入/接收队列的大小会增长。若是此队列超过设置的阈值(gcs.fc_limit),则该节点将发出FLOW_CONTROL消息,要求其余成员放慢或暂停处理。mysql
此设置控制什么时候启用流量控制。 简而言之,若是wsrep_local_recv_queue在给定节点上超过此大小,则将发送暂停的流控制消息。
fc_limit默认为16个事务。 这实际上意味着,这能够使给定节点位于从集群提交事务的后面。sql
若是禁用了fc_master_slave(默认状况下),则会动态修改fc_limit。 该模式其实是根据集群中节点的数量动态调整fc_limit的。 群集中的节点越多,计算出的fc_limit越大。 其背后的理论是,集群得到的规模越大(而且可能来自更多节点的写操做越忙),每一个节点的应用空间就越远。shell
若是仅写入PXC中的单个节点,则建议您经过设置fc_master_slave = YES来禁用此功能。 不管是否动态调整fc_limit的大小,此设置实际上只不过是要更改。 它没有任何其余能力能够帮助PXC中的单节点提升更好的写能力。session
若是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 | +----------------------------------+----------------+