Galera集群监控

 

 

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.png

如果最后个节点和其他的不一致,可能是由于正在执行导致

 

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/

posted @ 2020-12-16 11:44  钟桂耀  阅读(996)  评论(0编辑  收藏  举报