例如,此处所有节点都在id=10的写组,slave1和slave2都是slave,它们的read_only=1,这两个节点将会移动到id=20的组。如果一开始这3节点都在id=20的读组,那么移动的将是Master节点,会移动到id=10的写组。
看结果:
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 | | 20 | 192.168.100.23 | 3306 | ONLINE | 1 | | 20 | 192.168.100.24 | 3306 | ONLINE | 1 | +--------------+----------------+------+--------+--------+配置好read_only的监控后,Monitor模块会每隔一段时间监控一次read_only值。
admin> select * from mysql_server_read_only_log; +----------------+------+------------------+-----------------+-----------+--------+ | hostname | port | time_start_us | success_time_us | read_only | error | +----------------+------+------------------+-----------------+-----------+--------+ | 192.168.100.22 | 3306 | 1530970372197917 | 8487 | 0 | NULL | | 192.168.100.23 | 3306 | 1530970372198992 | 7907 | 1 | NULL | | 192.168.100.24 | 3306 | 1530970372199835 | 8064 | 1 | NULL | | 192.168.100.22 | 3306 | 1530970373698824 | 10078 | 0 | NULL | | 192.168.100.23 | 3306 | 1530970373699825 | 9845 | 1 | NULL | | 192.168.100.24 | 3306 | 1530970373700786 | 10745 | 1 | NULL | +----------------+------+------------------+-----------------+-----------+--------+ 3.4 配置replication lag监控Monitor模块会监控后端主机组中各slave的数据是否延迟于master,这个延迟行为称为replication lag,俗称拖后腿。
如果某个slave节点上的数据比master落后很多(临界值见下文),表示这个slave节点处理速度慢,数据较旧。ProxySQL采用一种称为自动避开(automatic shunned)的方式,临时避开这个落后的节点。当ProxySQL避开某节点后,ProxySQL不会把SQL语句路由给这个节点。
ProxySQL有几种情况可能会触发自动避开节点的行为:
和后端的连接断开。
slave落后于master过多。
和后端建立连接时,错误次数过多。
second_behind_master=null时,即slave的SQL线程未运行,或者slave未连接到master。(不过这种自动避开的情况是可控的,见全局变量
本文介绍关于replication lag的内容。
Monitor模块会每隔一段时间(mysql-monitor_replication_lag_interval)去检查一次拖后腿情况,检测的方式是获取show slave status中的Seconds_Behind_Master字段值,然后和mysql_servers表中max_replication_lag字段的值比较:
Seconds_Behind_Master < max_replication_lag:表示落后程度尚在允许范围内。
Seconds_Behind_Master > max_replication_lag:表示落后太多,这样的节点应该避开。
只有传统复制结构的slave节点才需要设置max_replication_lag字段,master无需设置,组复制和galera也无需设置,因为这两种复制结构中show slave status的结果为空。例如,将读组中的所有节点都设置最多落后于master 10秒钟。
update mysql_servers set max_replication_lag=10 where hostgroup_id=20; load mysql servers to runtime; save mysql servers to disk;需要注意的是,Seconds_Behind_Master的值并不总是可靠的,见 https://dev.mysql.com/doc/refman/5.7/en/show-slave-status.html 。
4.向ProxySQL添加MySQL用户:mysql_users表配置好后端MySQL节点、监控、分组后,接下来要配置的是MySQL的用户。
需要注意,ProxySQL中有3套用户:
连接Admin管理接口(默认6032端口)使用一套用户名/密码。
分为管理员和普通用户,管理员用户具有写权限,能配置ProxySQL,普通用户只有几个库的读权限。
管理员用户/密码通过变量admin-admin_credentials设置,普通用户/密码通过变量admin-stats_credentials设置。
这部分用户名不能出现在mysql_users表中。
Monitor模块监控后端时,需要使用一个MySQL用户连接后端进行监控。
需要先在后端MySQL组中创建好这个用户监控的用户。
监控connect、ping和read_only时,只需USAGE权限,监控replication lag时需要replication client权限。
通过变量mysql-monitor_username和mysql-monitor_password将监控用户加入到ProxySQL中。
前端连接ProxySQL(默认6033端口)、ProxySQL连接后端MySQL时使用一套用户名/密码。