ProxySQL的服务发现机制

 ̄綄美尐妖づ 提交于 2019-12-06 03:43:43

ProxySQL内部有一个Monitor模块,通过一个monitor账户对后端数据库进行监控,监控的内容主要包括:数据库可用性,是否read_only以及slave延迟。

配置监控账户

首先要在ProxySQL中配置监控账户。它是通过global variables来配置的。

12345678910111213141516171819202122232425262728
mysql> select * from global_variables where variable_name like '%monitor%';+-----------------------------------------------------+----------------+| variable_name                                       | variable_value |+-----------------------------------------------------+----------------+| mysql-monitor_enabled                               | true           || mysql-monitor_connect_timeout                       | 600            || mysql-monitor_ping_max_failures                     | 3              || mysql-monitor_ping_timeout                          | 1000           || mysql-monitor_read_only_max_timeout_count           | 3              || mysql-monitor_replication_lag_interval              | 10000          || mysql-monitor_replication_lag_timeout               | 1000           || mysql-monitor_groupreplication_healthcheck_interval | 5000           || mysql-monitor_groupreplication_healthcheck_timeout  | 800            || mysql-monitor_replication_lag_use_percona_heartbeat |                || mysql-monitor_query_interval                        | 60000          || mysql-monitor_query_timeout                         | 100            || mysql-monitor_slave_lag_when_null                   | 60             || mysql-monitor_wait_timeout                          | true           || mysql-monitor_writer_is_also_reader                 | true           || mysql-monitor_username                              | monitor        || mysql-monitor_password                              | monitor        || mysql-monitor_history                               | 600000         || mysql-monitor_connect_interval                      | 60000          || mysql-monitor_ping_interval                         | 10000          || mysql-monitor_read_only_interval                    | 1500           || mysql-monitor_read_only_timeout                     | 500            |+-----------------------------------------------------+----------------+22 rows in set (0.00 sec)

如上面所示:mysql-monitor_username为监控账户的用户名;mysql-monitor_password是密码。它们都是monitor, 当然你可以update这个表,将它们更新成任何你想要的字符串。上面这些monitor相关的配置变量,可根据需要自行更新。

这里多说一个变量:mysql-monitor_writer_is_also_reader, 它的意思是wirter节点是否可以为reader节点,这里设置的是true. 当一个节点的read_only=ON,变为read_only=OFF时,在mysql_servers表中会复制一条同样记录,放到writer_hostgroup中。即这台机器会有两条记录,一条属于writer,另一条属于reader。 当mysql-monitor_writer_is_also_reader值为false时,则会将该机器移动到writer组中,该机器不会在mysql_servers表中重复存在。

接下来就要在后端数据库创建monitor账户。授予权限如下:

1
GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'%' identified by 'monitor';

授予复制权限是为了监控复制延迟,不然仅usage权限就够了。

监控只读属性

对于传统复制架构,若要监控只读属性,必须配置表mysql_replication_hostgroups。这个表中每一行都代表一个复制组。

12345大专栏  ProxySQL的服务发现机制an>67
mysql> select * from mysql_replication_hostgroups;+------------------+------------------+----------+| writer_hostgroup | reader_hostgroup | comment  |+------------------+------------------+----------+| 0                | 1                |          || 2                | 3                | test_app |+------------------+------------------+----------+

可以看到这个表的内容很简单,只有三个字段。它们分别指定了writer_hostgroup和reader_hostgroup的ID, 这些ID和表mysql_servers表中的hostgroup_id相关联。

1234567
mysql> select * from mysql_servers;+--------------+-----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+| hostgroup_id | hostname        | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |+--------------+-----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+| 0            | 192.168.216.203 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         || 1            | 192.168.216.204 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |+--------------+-----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+

当一台mysql server的read_only属性发生变化时,monitor模块会自动更新hostgroup_id.如IP 203主机hostgroup_id是0, 在writer组中,若把它的read_only设置为ON, 它的hostgroup_id会被更新为1,即被分配到reader组。但表mysql_users中的default_hostgroup不会改变。另外需要注意的是,配置完mysql_servsers后,只有执行load mysql servsers to runtime;后monitor才会起作用!

监控复制延迟

怎样启用复制延迟监控呢?也很简单,只需要在mysql_servers表中为从库的max_replication_lag设置一个大于0(秒)的值就可以了。当复制延迟超过这个阈值时,ProxySQL会屏蔽掉该主机,不再路由SQL给他,直到它复制延迟小于所设阈值。

查看监控日志

ProxySQL中使用日志表记录监控信息,执行show tables from monitor;可看的这些表。

1234567891011
mysql> show tables from monitor;+------------------------------------+| tables                             |+------------------------------------+| mysql_server_connect_log           || mysql_server_group_replication_log || mysql_server_ping_log              || mysql_server_read_only_log         || mysql_server_replication_lag_log   |+------------------------------------+5 rows in set (0.00 sec)

  • mysql_server_connect_log 记录连接后台mysql的日志,成功/失败
  • mysql_server_ping_log 记录ping后台实例的日志。当失败此时超过变量mysql-monitor_ping_max_failures所设的值时,通知MySQL_Hostgroups_Manager kill掉该实例的连接。
  • mysql_server_replication_lag_log 检查Seconds_Behind_Master,并将结果信息记录到该表中。如果Seconds_Behind_Master > max_replication_lag 则该节点会被屏蔽,直到Seconds_Behind_Master < max_replication_lag。
  • mysql_server_read_only_log 检查表mysql_replication_hostgroups配置的所有主机mysql的read_only属性,并将结果记录到该表中。如果read_only=1该主机会被复制/移动到reader_hostgroup中,否则复制/移动到writer_hostgroup中。

ProxySQL的这一特性可与后端mysql自动failover工具(MHA, mysqlfailover等)相结合,使得failover发生时,无须执行ip_failover通知上层,ProxySQL 会自动检测MySQL的主从架构变化,并调整读写hostgroup中的主机。使整个failover过程更加默契。但在ProxySQL层又存在了新的高可用问题,一台proxy实例挂了,优雅地通知上层应用连接另一台?(vip ? DNS ? zookeeper ?)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!