02_ProxySQL配置概述

备注:文章编写时间201904-201905期间,后续官方在github的更新没有被写入

~ ~

一、多层次配置系统[Multi layer configuration system]

ProxySQL具有复杂且易于使用的配置系统,适合满足以下需求:

  • 允许对配置进行简单的动态更新(以便适用于零停机要求的大型架构);
  • 允许动态修改尽可能多的配置项,而无需重启ProxySQL进程;
  • 允许轻松回滚无效配置;

~ ~ 3层配置体系如下所示:

+------------------------+
|    RUNTIME    |
+-------------------------+
    /|\        |
     |         |
 [1] |     [2] |
     |        \|/
+-------------------------+
|    MEMORY     |
+-------------------------+
    /|\    |    |\
     |     |      \
 [3] | [4] |       \ [5]
     |    \|/       \
+-------------------------+  +-------------------------+
|      DISK     | |  CONFIG FILE  |
+-------------------------+  +-------------------------+

说明: RUNTIME ==>表示处理请求的线程使用的ProxySQL在内存中的数据结构。 它包含如下参数: 1)在全局参数(admin_variables)中定义的实际值; 2)在主机组(hostgroup)中包含的后端服务; 3)可以连接到代理的MySQL用户列表; 备注:不能直接修改RUNTIME配置部分的内容,因为这些是靠近底层的信息; ~ ~ MEMORY ==>它有时也被称为main;代表了可以通过MySQL兼容接口使用的内存中的数据库(proxysql实例)。用户可以使用MySQL客户端 连接到此接口,并查询各种ProxySQL配置表/数据库。 ~ ~ 通过该接口,可用使用的参数表包括: 1)mysql_servers-->保存ProxySQL可连接的后端服务器的列表; 2)mysql_users -->保存可以连接到ProxySQL的用户及其凭据列表;注意:ProxySQL也将使用这些凭证去连接后端服务; 3)mysql_query_rules-->保存将流量路由到各个后端服务器时依据的查询规则列表; 4)global_variables -->保存ProxySQL配置的可被动态调整的全局参数;比如下面这些:

Admin>select * from global_variables limit 3;
+--------------------------------+----------------+
| variable_name                  | variable_value |
+--------------------------------+----------------+
| mysql-shun_on_failures         | 5              |
| mysql-shun_recovery_time_sec   | 10             |
| mysql-query_retries_on_failure | 1              |
+--------------------------------+----------------+
3 rows in set (0.01 sec)

5)mysql_collations -->保存可供ProxySQL使用的MySQL排序规则的列表。这些是直接从客户端库中提取的。 6)debug_levels -->保存ProxySQL在debug输出信息时可被输出的debug语句的类型列表。可以根据debug来动态配置, 并将结果输出到日志中。注意:这类参数只能在调试时使用,因为影响性能! ~ ~ DISK和CONFIG FILE DISK -->代表在磁盘上的SQLite3类型的数据库,默认位置为$(DATADIR)/proxysql.db。由于在重启时,内存中未保存的配置将会丢失。 因而由它来将这些配置保存到磁盘。 CONFIG FILE-->代表配置文件。

~ ~

二、启动[Startup]

在正常启动时,ProxySQL首先将读取它的配置文件来确定数据目录位置(datadir)[其他配置信息暂时不读取];而后根据数据库(SQLite3)文件 是否存在来决定后面的动作。

  • 如果数据库文件存在,则ProxySQL以此初始化内存、加载配置信息,
  • 如果数据库文件存不在,但是配置文件还存在,则ProxySQL将解析配置文件内容,加载到内存中的数据库中;并将这些配置信息保存到磁盘 数据库(SQLite3)文件中。特别注意:如果在datadir中找到SQLite3文件,则不会解析配置文件!!

备注: 1)在ProxySQL 1.4.4时引入了2个通用参数,它们只能从配置文件值获取:restart_on_missing_heartbeats和execute_on_exit_failure; 2)在ProxySQL 2.0.0时又引入了1个通用参数,该参数也只能从配置文件值获取:errorlog;

~ ~

三、初始启动[Initial startup (or --initial flag)]

在初始启动模式下,内存和运行时配置信息将用配置文件来填充;然后这些配置信息将固化到ProxySQL自带的SQLite数据库中。 通过使用--initial选项运行ProxySQL可以强制重新进行初始配置,这会将SQLite数据库文件重置为原始状态(即配置文件中定义的状态) 并重命名现有的SQLite数据库文件,以便日后回退(如果需要回退可以检查数据目录中的旧文件)。

~ ~

四、重载启动[Reload startup (or --reload flag)]

如果使用--reload选项执行proxysql,它会尝试将配置文件中的配置与数据库文件的内容合并。然后,再执行常规启动程序。 但要注意,这里不保证再2个配置内容冲突时ProxySQL可以正确的合并内容;因此,这时需要人为的进行确认合并是否达到预期。

~ ~

五、运行时修改配置[Modifying config at runtime]

使用MySQL客户端连入ProxySQL(6032)后,通过查询、更新各个ProxySQL配置相关的表即可实现动态的修改配置。 配置得相关的表都有明确的名称: mysql_servers、mysql_users、mysql_query_rules、global_variables、debug_levels(仅用于调试ProxySQL时手动构建) 以上各表的内容,参看文章第一段的‘多层次配置系统’。

~ ~

六、不同层间配置信息的流动[Moving config between layers]

为了让配置信息持久化到磁盘或载入到runtime层,有一系列的管理命令可以被使用。这些命令需要对应'3层配置体系'图来理解。 以下给出相关的命令,命令即变化对应'3层配置体系'图中的编号: ~ ~ 3层配置体系如下所示:

+------------------------+
|    RUNTIME    |
+-------------------------+
    /|\        |
     |         |
 [1] |     [2] |
     |        \|/
+-------------------------+
|    MEMORY     |
+-------------------------+
    /|\    |    |\
     |     |      \
 [3] | [4] |       \ [5]
     |    \|/       \
+-------------------------+  +-------------------------+
|      DISK     | |  CONFIG FILE  |
+-------------------------+  +-------------------------+

1、用于重新配置MySQL用户

[1] LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME 作用:将MEMORY层数据库中的MySQL用户配置载入到RUNTIME层。 ~ [2] SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME 作用:将RUNTIME层中的MySQL用户配置写入到MEMORY层的数据库中。 ~ [3] LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK 作用:将DISK数据库文件中的MySQL用户配置载入到MEMORY层的数据库中。 ~ [4] SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK 作用:将MEMORY层数据库中的MySQL用户配置写入DISK的数据库文件进行持久化。 ~ [5] LOAD MYSQL USERS FROM CONFIG 作用:从CONFIG FILE(配置文件)中加载用户到MEMORY层的数据库中。

2、用于处理MySQL服务器

[1] LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME 作用:将MEMORY层数据库中的MySQL服务器配置载入到RUNTIME层。 ~ [2] SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME 作用:将RUNTIME层中的MySQL服务器配置写入到MEMORY层的数据库中。 ~ [3] LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK 作用:将DISK数据库文件中的MySQL服务器配置载入到MEMORY层的数据库中。 ~ [4] SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK 作用:将MEMORY层数据库中的MySQL服务器配置写入DISK的数据库文件进行持久化。 ~ [5] LOAD MYSQL SERVERS FROM CONFIG 作用:从CONFIG FILE(配置文件)中加载MySQL服务器配置到MEMORY层的数据库中。

~ ~

3、用于处理MySQL查询规则

[1] LOAD MYSQL QUERY RULES FROM MEMORY / LOAD MYSQL QUERY RULES TO RUNTIME 作用:将MEMORY层数据库中的MySQL查询规则配置载入到RUNTIME层。 ~ [2] SAVE MYSQL QUERY RULES TO MEMORY / SAVE MYSQL QUERY RULES FROM RUNTIME 作用:将RUNTIME层中的MySQL查询规则配置写入到MEMORY层的数据库中。 ~ [3] LOAD MYSQL QUERY RULES TO MEMORY / LOAD MYSQL QUERY RULES FROM DISK 作用:将DISK数据库文件中的MySQL查询规则配置载入到MEMORY层的数据库中。 ~ [4] SAVE MYSQL QUERY RULES FROM MEMORY / SAVE MYSQL QUERY RULES TO DISK 作用:将MEMORY层数据库中的MySQL查询规则配置写入DISK的数据库文件进行持久化。 ~ [5] LOAD MYSQL QUERY RULES FROM CONFIG 作用:从CONFIG FILE(配置文件)中加载MySQL查询规则配置到MEMORY层的数据库中。

~ ~

4、用于处理MySQL变量

[1] LOAD MYSQL VARIABLES FROM MEMORY / LOAD MYSQL VARIABLES TO RUNTIME 作用:将MEMORY层数据库中的MySQL参数配置载入到RUNTIME层。 ~ [2] SAVE MYSQL VARIABLES TO MEMORY / SAVE MYSQL VARIABLES FROM RUNTIME 作用:将RUNTIME层中的MySQL参数配置写入到MEMORY层的数据库中。 ~ [3] LOAD MYSQL VARIABLES TO MEMORY / LOAD MYSQL VARIABLES FROM DISK 作用:将DISK数据库文件中的MySQL参数配置载入到MEMORY层的数据库中。 ~ [4] SAVE MYSQL VARIABLES FROM MEMORY / SAVE MYSQL VARIABLES TO DISK 作用:将MEMORY层数据库中的MySQL参数配置写入DISK的数据库文件进行持久化。 ~ [5] LOAD MYSQL VARIABLES FROM CONFIG 作用:从CONFIG FILE(配置文件)中加载MySQL参数配置到MEMORY层的数据库中。

~ ~

5、用于处理admin(ProxySQL)变量

[1] LOAD ADMIN VARIABLES FROM MEMORY / LOAD ADMIN VARIABLES TO RUNTIME 作用:将MEMORY层数据库中的admin参数配置载入到RUNTIME层。 ~ [2] SAVE ADMIN VARIABLES TO MEMORY / SAVE ADMIN VARIABLES FROM RUNTIME 作用:将RUNTIME层中的admin参数配置写入到MEMORY层的数据库中。 ~ [3] LOAD ADMIN VARIABLES TO MEMORY / LOAD ADMIN VARIABLES FROM DISK 作用:将DISK数据库文件中的admin参数配置载入到MEMORY层的数据库中。 ~ [4] SAVE ADMIN VARIABLES FROM MEMORY / SAVE ADMIN VARIABLES TO DISK 作用:将MEMORY层数据库中的admin参数配置写入DISK的数据库文件进行持久化。 ~ [5] LOAD ADMIN VARIABLES FROM CONFIG 作用:从CONFIG FILE(配置文件)中加载admin参数配置到MEMORY层的数据库中。 ~ 备注:以上的命令支持以下简写方式: MEM <==> MEMORY RUN <==> RUNTIME

~ ~

七、总结[Summary]

到此为止,已经基本了解了系统是如何工作的了,下面给出一些常用的命令;它们与如何激活更改后的配置(RUNTIME) 以及如何将配置永久保存到磁盘(DISK)有关。特别注意:在将配置加载到RUNTIME层之前,不会激活任何更改。

LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;

~ ~

八、问题分析[Troubleshooting]

特别注意:只有在将参数值加载到RUNTIME层时才会进行最终的验证。

你可以设置一个值,该值在保存到MEMORY层时不会引发任何类型的警告或错误,甚至可以保存到DISK。 但是,当执行加载到RUNTIME层时,参数值却恢复到了先前保存的状态;如果发生这种情况,就应该检查定义的错误日志。

例如: [WARNING] Impossible to set variable monitor_read_only_interval with value "0". 解决办法:重新设置monitor_read_only_interval的值。

~ ~ 完毕!