对mysql_servers表中所有配置了max_replication_lag的后端slave节点都检查复制延迟,通过show slave status返回结果中的Seconds_Behind_Master字段,判断slave和master之间的延迟程度,并记录到mysql_server_replication_lag_log表中。
如果Seconds_Behind_Master > max_replication_lag,表示该slave延迟很严重,ProxySQL会自动避开这种slave节点,直到Seconds_Behind_Master < max_replication_lag。
Monitor监控上述指标时,会使用MySQL节点上的用户连接到后端节点,所以,需要先在后端节点上创建负责监控的用户。监控connect、ping和read_only这3项指标时,该用户只需具有USAGE权限,如果要监控replication lag指标,则需要replication client权限。
3.2 配置connect和ping监控首先,在后端节点上创建用于监控的用户,顺便为其授予replication client权限。只需在一个写节点(例如master)上创建即可,它会复制到其它节点上。
create user monitor@'192.168.100.%' identified by 'P@ssword1!'; grant replication client on *.* to monitor@'192.168.100.%';然后,在ProxySQL上配置这个监控用户,配置方式是修改全局变量。
set mysql-monitor_username='monitor'; set mysql-monitor_password='P@ssword1!';由于ProxySQL上所有的配置修改都是在修改main库中对应的表,上面的变量在main.global_variables中,所以上面两个set语句和下面两个update语句是等价的。
update global_variables set variable_value='monitor' where variable_name='mysql-monitor_username'; update global_variables set variable_value='P@ssword1!' where variable_name='mysql-monitor_password';在将配置load到runtime之前,可以先查看下connect和ping对应的log表。
admin> select * from mysql_server_connect_log; +----------------+------+------------------+-------------------------+---------------+ | hostname | port | time_start_us | connect_success_time_us | connect_error | +----------------+------+------------------+-------------------------+---------------+ | 192.168.100.22 | 3306 | 1530968712977867 | 4174 | NULL | | 192.168.100.23 | 3306 | 1530968712988986 | 4908 | NULL | | 192.168.100.24 | 3306 | 1530968713000074 | 3044 | NULL | | 192.168.100.22 | 3306 | 1530968772978982 | 3407 | NULL | | 192.168.100.23 | 3306 | 1530968772989627 | 3404 | NULL | | 192.168.100.24 | 3306 | 1530968773000778 | 3444 | NULL | +----------------+------+------------------+-------------------------+---------------+ admin> select * from mysql_server_ping_log; +----------------+------+------------------+----------------------+-------------+ | hostname | port | time_start_us | ping_success_time_us | ping_error | +----------------+------+------------------+----------------------+-------------+ | 192.168.100.22 | 3306 | 1530968712666540 | 452 | NULL | | 192.168.100.23 | 3306 | 1530968712668779 | 458 | NULL | | 192.168.100.24 | 3306 | 1530968712671541 | 324 | NULL | | 192.168.100.22 | 3306 | 1530968722667071 | 1190 | NULL | | 192.168.100.23 | 3306 | 1530968722669574 | 1162 | NULL | | 192.168.100.24 | 3306 | 1530968722673162 | 1380 | NULL | +----------------+------+------------------+----------------------+-------------+不难发现,监控操作在load到runtime之前就已经生效了。这是有意为之的:通过这种方式,可以在节点添加到生产环境之前执行一些基本的健康检查。
监控的节点一切正常后(error=NULL),将配置load到runtime。
load mysql variables to runtime; save mysql variables to disk; 3.3 配置read_only监控和读/写组目前read_only和replication_lag的监控日志还是空。
admin> select * from mysql_server_read_only_log; Empty set (0.00 sec) admin> select * from mysql_server_replication_lag_log; Empty set (0.00 sec)这是因为还没有对ProxySQL中的节点分组:writer_hostgroup、reader_hostgroup。
设置分组信息,需要修改的是main库中的mysql_replication_hostgroups表(组复制则是mysql_group_replication_hostgroups),该表只有3个字段:第一个字段名为writer_hostgroup,第二个字段为reader_hostgroup,第三个字段为注释字段,可随意写。
例如,指定写组的id为10,读组的id为20。
insert into mysql_replication_hostgroups values(10,20); admin> select * from mysql_replication_hostgroups; +------------------+------------------+----------+ | writer_hostgroup | reader_hostgroup | comment | +------------------+------------------+----------+ | 10 | 20 | cluster1 | +------------------+------------------+----------+在该配置加载到RUNTIME生效之前,先查看下各mysql server所在的组。
admin> select hostgroup_id,hostname,port,status,weight from mysql_servers; +--------------+----------------+------+--------+--------+ | hostgroup_id | hostname | port | status | weight | +--------------+----------------+------+--------+--------+ | 10 | 192.168.100.22 | 3306 | ONLINE | 1 | | 10 | 192.168.100.23 | 3306 | ONLINE | 1 | | 10 | 192.168.100.24 | 3306 | ONLINE | 1 | +--------------+----------------+------+--------+--------+3个节点都在hostgroup_id=10的组中。
现在,将刚才mysql_replication_hostgroups表的修改加载到RUNTIME生效。
load mysql servers to runtime; save mysql servers to disk;一加载,Monitor模块就会开始监控后端的read_only值,当监控到read_only值后,就会按照read_only的值将某些节点自动移动到读/写组。