ProxySQL有一个完备的配置系统,配置ProxySQL是基于sql命令的方式完成的。ProxySQL支持配置修改以后的在线保存、应用,不须要重启便可生效。整个配置系统分三层设计。
整个配置系统分为三层,以下图所示:mysql
配置系统分为三层的目的有三个:
(1).自动更新
(2).尽量的不重启proxysql就能够修改配置
(3).方便回滚错误配置linux
每层的功能与含义以下:sql
RUNTIME层 表明的是ProxySQL当前生效的正在使用的配置,包括global_variables, mysql_servers, mysql_users, mysql_query_rules表。没法直接修改这里的配置,必需要从下一层load进来。也就是说RUNTIME这个顶级层,是proxysql运行过程当中实际使用的那一份配置,这一份配置会直接影响到生产环境的,因此要将配置加载进RUNTIME层时须要三思而行。 MEMORY层 用户能够经过MySQL客户端链接到此接口(admin接口),而后能够在mysql命令行查询不一样的表和数据库,并修改各类配置,能够认为是SQLite数据库在内存的镜像。也就是说MEMORY这个中间层,上面接着生产环境层RUNTIME,下面接着持久化层DISK和CONFIG FILE。 MEMORY层 是咱们修改proxysql的惟一正常入口。通常来讲在修改一个配置时,首先修改Memory层,确认无误后再接入RUNTIME层,最后持久化到DISK和CONFIG FILE层。也就是说memeory层里面的配置随便改,不影响生产,也不影响磁盘中保存的数据。经过admin接口能够修改mysql_servers、mysql_users、mysql_query_rules、global_variables等表的数据。 DISK/CONFIG FILE层 表示持久存储的那份配置,持久层对应的磁盘文件是$(DATADIR)/proxysql.db,在重启ProxySQL的时候,会从proxysql.db文件中加载信息。而 /etc/proxysql.cnf文件只在第一次初始化的时候使用,以后若是要修改配置,就须要在管理端口的SQL命令行里进行修改,而后再save到硬盘。 也就是说DISK和CONFIG FILE这一层是持久化层,咱们作的任何配置更改,若是不持久化下来,重启后,配置都将丢失。
须要注意的是:proxysql的每个配置项在三层中都存在,可是这三层是互相独立的,也就是说,proxysql能够同时拥有三份配置,每层都是独立的,可能三份配置都不同,也可能三份都同样。数据库
下面总结下proxysql的启动过程:架构
当proxysql启动时,首先读取配置文件CONFIG FILE(/etc/proxysql.cnf),而后从该配置文件中获取datadir,datadir中配置的是sqlite的数据目录。若是该目录存在,且sqlite数据文件存在,那么正常启动,将sqlite中的配置项读进内存,而且加载进RUNTIME,用于初始化proxysql的运行。若是datadir目录下没有sqlite的数据文件,proxysql就会使用config file中的配置来初始化proxysql,而且将这些配置保存至数据库。sqlite数据文件能够不存在,/etc/proxysql.cnf文件也能够为空,但/etc/proxysql.cnf配置文件必须存在,不然,proxysql没法启动。ide
须要添加配置时,直接操做的是MEMORAY,例如:添加一个程序用户,在mysql_users表中执行一个插入操做:阿里云
MySQL [(none)]> insert into mysql_users(username,password,active,default_hostgroup,transaction_persistent) values('myadmin','mypass',1,0,1);命令行
这样就完成了一个用户的添加。要让这个insert生效,还须要执行以下操做:设计
MySQL [(none)]>load mysql users to runtime;
表示将修改后的配置(MEMORY层)用到实际生产环境(RUNTIME层)代理
若是想保存这个设置永久生效,还须要执行以下操做:
MySQL [(none)]>save mysql users to disk;
表示将memoery中的配置保存到磁盘中去。
除了上面两个操做,还能够执行以下操做:
MySQL [(none)]>load mysql users to memory;
表示将磁盘中持久化的配置拉一份到memory中来。MySQL [(none)]>load mysql users from config;
表示将配置文件中的配置加载到memeory中。
以上SQL命令是对mysql_users进行的操做,同理,还能够对mysql_servers表、mysql_query_rules表、global_variables表等执行相似的操做。
如对mysql_servers表插入完成数据后,要执行保存和加载操做,可执行以下SQL命令:
MySQL [(none)]> load mysql servers to runtime;
MySQL [(none)]> save mysql servers to disk;
对mysql_query_rules表插入完成数据后,要执行保存和加载操做,可执行以下SQL命令:
MySQL [(none)]> load mysql query rules to runtime;
MySQL [(none)]> save mysql query rules to disk;
对global_variables表插入完成数据后,要执行保存和加载操做,可执行以下SQL命令:
如下命令加载或保存mysql variables(global_variables):
MySQL [(none)]>load mysql variables to runtime
MySQL [(none)]>save mysql variables to disk
如下命令加载或保存admin variables(select * from global_variables where variable_name like 'admin-%'):
MySQL [(none)]> load admin variables to runtime
MySQL [(none)]>save admin variables to disk
待续!
以为不过瘾,后续还有一些列文章在等着呢:
原新浪网、阿里云(原万网)系统架构师,Linux畅销书《按部就班linux》做者、51CTO博客博客专家博主、51CTO特级讲师,个人最新专栏: 轻松玩转ELK海量可视化日志分析系统,连载更新中,猛戳查看:
《轻松玩转ELK海量可视化日志分析系统》