MySQL · 2016-12-25 0

MySQL中间件之ProxySQL_配置系统

1.再来闲扯几句
proxysql有一个完备的配置系统,Proxysql研发已经替DBA考虑到线上变更不容易,所以将配置系统做的非常完备,方便DBA做变更。整个配置系统分三层设计,每次想到分层设计,我就想到linux的VFS和MySQL的插件式存储引擎。是的,作为MySQL DBA就要这样子,随时随地想到MySQL的先天优势。


2.漫谈proxysql的配置系统体系结构
作者将配置系统分为三层的目的有三个:
(1).自动更新
(2).尽可能的不重启proxysql就可以修改配置
(3).方便回滚错误配置
整个配置系统分为三层,如下所示:

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

首先我们要明白的一个问题就是,proxysql的每一个配置项在三层中都存在,但是这三层是独立的,也就是说,proxysql可以同时拥有三份配置,每层都是独立的,可能三份都不一样,可能三份都一样。
RUNTIME这个顶级层,就是proxysql运行过程中实际采用的那一份配置,这一份配置就是要影响实际生产的,所以将你的配置加进RUNTIME层时需要三思而行。
MEMORY这个中间层,上面接着生产配置项RUNTIME,下面接着持久化层DISK,CONFIG FILE。MEMORY也是我们修改proxysql的唯一正常入口(如果你要显示你技术多么牛逼,直接修改RUNTIME和DISK也未尝不可)。一般的,我们修改一个配置,先改Memory,确认无误后再接入生产(RUNTIME),和持久化到磁盘(DISK).也就是说memeory里面的配置随便改,不影响生产,也不影响磁盘中保存的数据。
DISK和CONFIG FILE这一层是持久化层,我们做的任何配置更改,如果不持久化下来,重启后,配置都将丢失。持久化层主要将数据存储在sqlite(`$(DATADIR)/proxysql.db`.)数据库中和文件中(/etc/proxysql.cnf)。


3.proxysql启动
当proxysql启动时,首先读取配置文件CONFIG FILE(/etc/proxysql.cnf),然后从该配置文件中获取datadir,datadir中存储的是sqlite的数据目录。如果该目录存在,且sqlite数据文件存在,那么正常启动,将sqlite中的配置项读进内存,并且加载进RUNTIME,用于初始化proxysql的运行。如果datadir目录下没有周到sqlite的数据文件,proxysql就会使用config file中的配置来初始化proxysql,并且将这些配置保存至数据库。


4.如何修改配置
说了这么多,我们来看看我们如何实际修改一些配置。我们一般需要修改的如下这一些配置。

mysql> show tables;
+-------------------+
| tables            |
+-------------------+
| mysql_servers     |
| mysql_users       |
| mysql_query_rules |
| global_variables  |
| mysql_collations  |
| debug_levels      |
+-------------------+
6 rows in set (0.01 sec)

这里我们以mysql_servers中的配置为例。该表中存储的是Proxysql后端的数据库实例信息,这也是整个proxysql做路由转发的核心配置表。
(1).将修改后的配置(在memory层)用到实际生产

LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME

(2).将生产配置拉一份到memory中

SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME

(3).将磁盘中持久化的配置拉一份到memory中来

LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK

(4).将memoery中的配置保存到磁盘中去

SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK

(5).将配置文件中的配置加载到memeory中

LOAD MYSQL SERVERS FROM CONFIG