为了让ProxySQL能够找到后端的MySQL节点,需要将后端的MySQL Server加入到ProxySQL中。ProxySQL的一切配置行为都是在修改main库中的对应的表,所以添加节点到ProxySQL中实际上也是通过修改相关表来实现的。
管理后端节点有几个过程:
将后端MySQL Server的主从复制结构配置好。
将后端MySQL Server节点加入到ProxySQL中。相关的表为mysql_servers。
监控后端节点。相关的表是全局变量表global_vairbles,相关的变量为mysql-monitor_开头的变量。
配置读、写组。相关的表为mysql_replication_hostgroups。
配置MySQL用户,用于发送SQL语句。相关的表为mysql_users。
几个注意点:
(1).ProxySQL是通过监控后端节点的read_only值来自动调整节点所属组的,例如read_only=1的节点会移动到读组,read_only=0的节点会移动到写组。所以,在配置读、写组之前,需要先监控后端节点。
(2).对于传统的主从复制,默认的read_only=0,所以在第一步中,各slave节点的配置文件中需要加上read_only=1。对于组复制、Galera,因为会自动强制设置非写节点的read_only=1,所以无需额外配置该属性。
(3).ProxySQL支持传统主从复制结构(即异步、半同步、gtid复制)的后端,读、写组相关的表是mysql_replication_hostgroups。还支持MySQL组复制结构的后端,相关的表是mysql_group_replication_hostgroups,还支持Galera(如percona XtraDB cluster)结构的后端,不过ProxySQL是通过scheduler调度proxysql_galera_checker.sh脚本来支持Galera的,而且目前还没有mysql_galera_hostgroups(ProxySQL 2.0才新增该表)。
本文暂时只解释mysql_servers和mysql_replication_hostgroups,组复制相关的表在在后面介绍"ProxySQL+组复制"的文章中再介绍。
完成了上面的过程后,节点就一切正常了,然后就可以去配置ProxySQL的路由规则、查询缓存、SQL语句重写等功能。这些在后面的文章会详细介绍。
在开始本文下面的配置之前,请确保已经明白如何使用Admin管理接口,以及ProxySQL的多层配置系统。
2.添加新节点:mysql_servers表假如后端有3个节点,使用的是传统的异步复制(1 master, 2 slave)。这3个节点的IP地址为:
192.168.100.22 192.168.100.23 192.168.100.24要加入3个后端MySQL节点,只需向mysql_servers表插入3行对应的记录即可。以下是使用了一大堆默认值的insert语句:
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.100.22',3306); insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.100.23',3306); insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.100.24',3306); load mysql servers to runtime; save mysql servers to disk;上面的insert语句表示将后端MySQL节点192.168.100.xx:3306加入到hostgroup_id=10的组中。
其实mysql_servers表有很多字段,很多字段都有默认值,正如上面的insert语句,除了3个字段,其它使用的全是字段的默认值。
以下是mysql_servers表的字段属性。
| 字段 | 数据类型 | 允许null | 默认值 | |---------------------|----------|-----------|--------| | hostgroup_id (pk) | int | not null | 0 | | hostname (pk) | varchar | not null | 无 | | port (pk) | int | not null | 3306 | | status | varchar | not null | online | | weight | int | not null | 1 | | compression | int | not null | 0 | | max_connections | int | not null | 1000 | | max_replication_lag | int | not null | 0 | | use_ssl | int | not null | 0 | | max_latency_ms | int | not null | 0 | | comment | varchar | not null | '' |可见,新添加一个节点时,唯一必须指定的字段就是hostname值。如果不指定hostgroup_id,那么节点将自动加入到hostgroup_id=0的组中。
各字段的意义如下:
hostgroup_id:该后端MySQL实例所在的主机组。注意,同一MySQL节点可属于多个主机组。
hostname,port:后端MySQL监听的地址和端口。就是默认3306端口的意义
status:
ONLINE:该后端MySQL节点完全正常。
SHUNNED:该后端MySQL节点将暂时被ProxySQL自动避开(忽略),原因可能是一个较短时间内发生了大量连接错误,也可能是该slave与master的数据延迟太大(replication lag)。
OFFLINE_SOFT:当某后端MySQL被设置为 OFFLINE_SOFT 时,ProxySQL将不会向它发送新的请求,但该节点正在执行的事务会继续执行,直到所有事务执行完毕后会进入非激活状态。也就是说,和该后端的连接会保持到事务执行完毕。这可以实现后端节点的graceful停止、重启。
OFFLINE_HARD:当某后端MySQL被设置为 OFFLINE_HARD 时,ProxySQL将不会向它发送新的请求,该节点正在执行的事务也会立即中断。也就是直接将该后端杀掉。等价于删除该节点,或临时将其移除出组(例如出于维护的目的)。
weight:节点在组中的权重值越高,ProxySQL会发送越多请求给它们。
compression:如果该字段的值设置为大于0,ProxySQL和该后端新建的连接中,ProxySQL将会先压缩数据再传输。