备注:文章编写时间201904-201905期间,后续官方在github的更新没有被写入mysql
~
~git
ProxySQL具备复杂且易于使用的配置系统,适合知足如下需求:github
~
~
3层配置体系以下所示:sql
+------------------------+ | 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-->表明配置文件。后端
~
~服务器
在正常启动时,ProxySQL首先将读取它的配置文件来肯定数据目录位置(datadir)[其余配置信息暂时不读取];然后根据数据库(SQLite3)文件
是否存在来决定后面的动做。数据结构
备注:
1)在ProxySQL 1.4.4时引入了2个通用参数,它们只能从配置文件值获取:restart_on_missing_heartbeats和execute_on_exit_failure;
2)在ProxySQL 2.0.0时又引入了1个通用参数,该参数也只能从配置文件值获取:errorlog;架构
~
~ide
在初始启动模式下,内存和运行时配置信息将用配置文件来填充;而后这些配置信息将固化到ProxySQL自带的SQLite数据库中。
经过使用--initial选项运行ProxySQL能够强制从新进行初始配置,这会将SQLite数据库文件重置为原始状态(即配置文件中定义的状态)
并重命名现有的SQLite数据库文件,以便往后回退(若是须要回退能够检查数据目录中的旧文件)。
~
~
若是使用--reload选项执行proxysql,它会尝试将配置文件中的配置与数据库文件的内容合并。而后,再执行常规启动程序。
但要注意,这里不保证再2个配置内容冲突时ProxySQL能够正确的合并内容;所以,这时须要人为的进行确认合并是否达到预期。
~
~
使用MySQL客户端连入ProxySQL(6032)后,经过查询、更新各个ProxySQL配置相关的表便可实现动态的修改配置。
配置得相关的表都有明确的名称:
mysql_servers、mysql_users、mysql_query_rules、global_variables、debug_levels(仅用于调试ProxySQL时手动构建)
以上各表的内容,参看文章第一段的‘多层次配置系统’。
~
~
为了让配置信息持久化到磁盘或载入到runtime层,有一系列的管理命令能够被使用。这些命令须要对应'3层配置体系'图来理解。
如下给出相关的命令,命令即变化对应'3层配置体系'图中的编号:
~
~
3层配置体系以下所示:
+------------------------+ | RUNTIME | +-------------------------+ /|\ | | | [1] | [2] | | \|/ +-------------------------+ | MEMORY | +-------------------------+ /|\ | |\ | | \ [3] | [4] | \ [5] | \|/ \ +-------------------------+ +-------------------------+ | DISK | | CONFIG FILE | +-------------------------+ +-------------------------+
[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层的数据库中。
[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层的数据库中。
~
~
[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层的数据库中。
~
~
[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层的数据库中。
~
~
[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
~
~
到此为止,已经基本了解了系统是如何工做的了,下面给出一些经常使用的命令;它们与如何激活更改后的配置(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;
~
~
特别注意:只有在将参数值加载到RUNTIME层时才会进行最终的验证。
你能够设置一个值,该值在保存到MEMORY层时不会引起任何类型的警告或错误,甚至能够保存到DISK。
可是,当执行加载到RUNTIME层时,参数值却恢复到了先前保存的状态;若是发生这种状况,就应该检查定义的错误日志。
例如:
[WARNING] Impossible to set variable monitor_read_only_interval with value "0".
解决办法:从新设置monitor_read_only_interval的值。
~~完毕!