一、ProxySQL介绍
ProxySQL 是一个高性能的SQL 代理。ProxySQL有一个高级多核体系结构。支持数十万并发连接,可以多路复用到后端服务器上。
作为守护进程运行。而且有一个进程监视这个守护进程,并在守护进程崩溃时重启守护进程,以减少停机时间。这个守护进程接受来自MySQL客户端的请求,并将其转发到后端的MySQL服务器上。
ProxySQL被设计为可以连续运行而且不需要重启。大多数配置可以在运行时使用类似SQL语句的查询完成。
二、ProxySQL三层配置介绍
ProxySQL有一个复杂但易于使用的配置系统,该系统主要分三个层次,三层配置有以下好处:
允许使用管理接口对配置进行简单的自动更新;
允许在运行时修改尽可能多的配置项,而不重新启动守护进程;
允许简单地回滚错误的配置;
ProxySQL配置通过一个多层配置系统实现的,其中的设置从一个层移动到另一个层。配置系统的三层如下图所示:
+-------------------------+
| RUNTIME |
+-------------------------+
/|\ |
| |
[1] | [2] |
| \|/
+-------------------------+
| MEMORY |
+-------------------------+ _
/|\ | |\
| | \
[3] | [4] | \ [5]
| \|/ \
+-------------------------+ +-------------------------+
| DISK | | CONFIG FILE |
+-------------------------+ +-------------------------+
RUNTIME: 代表的是ProxySQL当前生效的正在使用的配置。我们无法直接修改这里的配置,必须要从下一层LOAD进来。RUNTIME这个层级,就是ProxySQL运行中正在使用的配置,所以我们把修改的配置Load到RUNTIME层时,一定要慎重操作。
MEMORY: 可以认为是SQLite数据库在内存中的镜像。该数据库通过与mysql兼容的接口,用户可以使用MySQL客户端通过admin接口连接到这里来修改的 main 里头配置。MEMORY这个中间层,上面接着生产配置项RUNTIME,下面接着持久化层DISK,CONFIG FILE。MEMORY也是我们修改ProxySQL的唯一正常入口。我们平时修改一个配置,先改MEMORY,确认无误后再LOAD到生产(RUNTIME),并且持久化到磁盘(DISK)。MEMORY里面的配置随便改,不影响生产,也不影响磁盘中保存的数据。
DISK / CONFIG FILE:DISK和CONFIG FILE这一层是持久层。配置SAVE到这里表示进行了持久存储,保存到SQLITE数据库中,默认保存路径$(DATADIR)/proxysql.db,在重启的时候会从硬盘里加载。 /etc/proxysql.cnf文件只在第一次初始化的时候用到,完了后,如果要修改监听端口,还是需要在管理命令行里修改,再 save 到硬盘。在重启ProxySQL时,如果内存中的配置未进行持久存储到硬盘,那么内存中配置将会丢失,因此将配置持久化到磁盘是很重要的事情。
说明:ProxySQL配置系统,三层都是互相独立的,proxysql的每一个配置项在三层中都存在。可能三份配置都一样,也可能三份配置都不一样。 当ProxySQL启动时,首先读取配置文件
CONFIG FILE(/etc/proxysql.cnf)
,然后从该配置文件中获取datadir
,datadir
中存储的是SQLITE的数据目录。如果该目录存在,且SQLITE数据文件存在,就正常启动,并将SQLITE数据库中的配置项读进内存,并且加载进RUNTIME,用于初始化ProxySQL的运行。如果datadir
目录下没有SQLITE的数据文件,ProxySQL就会使用/etc/proxysql.cnf
中的配置来初始化ProxySQL,并且将这些配置保存至SQLITE数据库。
我们一定要清楚,修改配置时我们是直接操作的 MEMORAY(main)
下面我们使用操作mysql_users来解释一下三层的操作。(序号对应上图)
[1] LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME
loads MySQL users from the in-memory database to the runtime data structures
[2] SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME
persists the MySQL users from the runtime data structures to the in-memory database
[3] LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK
loads MySQL users from the on-disk database to the in-memory database
[4] SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK
persists the MySQL users from the in-memory database to the on-disk database
[5] LOAD MYSQL USERS FROM CONFIG
loads from the configuration file the users into the in-memory database
具体可以看官方文档,解释特别详细 https://github.com/sysown/proxysql/blob/master/doc/configuration_system.md 其实总的规则就是两条: 想要配置生效(active)必须load进RUNTIME中:
LOAD MYSQL USERS TO RUNTIME
要持久化,必需SAVE进DISK:
LOAD MYSQL USERS TO RUNTIME
三、安装ProxySQL
1.下载安装
# wget https://github.com/sysown/proxysql/releases/download/v1.4.9/proxysql-1.4.9-1-centos7.x86_64.rpm
# rpm -ivh proxysql-1.4.9-1-centos7.x86_64.rpm
启动:
# systemctl start proxysql.service
# systemctl status proxysql.service
● proxysql.service - LSB: High Performance Advanced Proxy for MySQL
Loaded: loaded (/etc/rc.d/init.d/proxysql; bad; vendor preset: disabled)
Active: active (running) since Fri 2018-07-13 17:37:19 CST; 6s ago
Docs: man:systemd-sysv-generator(8)
Process: 3137 ExecStart=/etc/rc.d/init.d/proxysql start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/proxysql.service
├─3141 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql
└─3142 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql
Jul 13 17:37:19 db-node4 systemd[1]: Starting LSB: High Performance Advanced Proxy for MySQL...
Jul 13 17:37:19 db-node4 proxysql[3137]: Starting ProxySQL: DONE!
Jul 13 17:37:19 db-node4 systemd[1]: Started LSB: High Performance Advanced Proxy for MySQL.
2.ProxySQL文件说明
通过查看状态信息,可以知道数据目录在/var/lib/proxysql/,配置文件为:/etc/proxysql.cnf
# ll /var/lib//proxysql/
total 392
-rw------- 1 root root 122880 Jul 13 17:37 proxysql.db
-rw------- 1 root root 3514 Jul 13 17:37 proxysql.log
-rw-r--r-- 1 root root 5 Jul 13 17:37 proxysql.pid
-rw------- 1 root root 110592 Jul 13 17:39 proxysql_stats.db
# ll /etc/proxysql.cnf
-rw-r--r-- 1 root root 4517 May 30 18:31 /etc/proxysql.cnf
3.ProxySQL进程说明
# ps -ef|grep proxysql
root 3141 1 0 Jul13 ? 00:00:00 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql
root 3142 3141 0 Jul13 ? 00:01:06 proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql
PID为3141的进程,是3142进程的父进程,父进程负责监控子进程,如果子进程挂了,那么父进程会把子进程启动。子进程负责处理正在的任务。
4.ProxySQL接口说明
ProxySQL是有管理接口和客户端接口,通过配置文件/etc/proxysql.cnf可以看到管理和客户端
ProxySQL管理接口
admin_variables=
{
admin_credentials="admin:admin"
# mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
mysql_ifaces="0.0.0.0:6032"
# refresh_interval=2000
# debug=true
}
ProxySQL客户端操作MySQL接口
mysql_variables=
{
threads=4
max_connections=2048
default_query_delay=0
default_query_timeout=36000000
have_compress=true
poll_timeout=2000
# interfaces="0.0.0.0:6033;/tmp/proxysql.sock"
interfaces="0.0.0.0:6033"
default_schema="information_schema"
stacksize=1048576
server_version="5.5.30"
connect_timeout_server=3000
# make sure to configure monitor username and password
# https://github.com/sysown/proxysql/wiki/Global-variables#mysql-monitor_username-mysql-monitor_password
monitor_username="monitor"
monitor_password="monitor"
monitor_history=600000
monitor_connect_interval=60000
monitor_ping_interval=10000
monitor_read_only_interval=1500
monitor_read_only_timeout=500
ping_interval_server_msec=120000
ping_timeout_server=500
commands_stats=true
sessions_sort=true
connect_retries_on_failure=10
}
通过上面的信息可以看到管理接口的端口是6032,账号密码是admin(可以动态修改)只能通过本地连接。客户端接口的端口是6033,账号密码通过管理接口去设置。
参考文档
https://github.com/sysown/proxysql/wiki
http://www.proxysql.com/
https://github.com/sysown/proxysql/tree/master/doc
http://www.proxysql.com/blog/proxysql-gtid-causal-reads
https://www.percona.com/doc/percona-xtradb-cluster/LATEST/howtos/proxysql.html
http://seanlook.com/2017/04/10/mysql-proxysql-install-config/
http://www.fordba.com/mysql_proxysql.html
http://www.fordba.com/mysql_proxysql_rw_split.html
本文出自 “运维特工” 博客,转载请务必保留原文链接 和 http://www.unixfbi.com




