ProxySQL的服务发现机制

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

配置监控账户

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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。这个表中每一行都代表一个复制组。

1
2
3
4
5大专栏  ProxySQL的服务发现机制an>
6
7
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相关联。

1
2
3
4
5
6
7
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;可看的这些表。

1
2
3
4
5
6
7
8
9
10
11
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 ?)

猜你喜欢

转载自www.cnblogs.com/liuzhongrong/p/11961105.html