本文是我在学习和验证ProxySQL的过程中,从初识(对其机制猜想或凭几次命令的结果臆断其原理),到逐渐深入(模拟各种场景测试、抓包分析、与作者交流)过程中的思路
和方法
和结论
的记录。
笔者初识proxysql的时候是1.2.1版本,现在几经演进,已经到了1.4.1版本,本文也几经修改,力求跟得上软件的最新进度。
一、亮点
- 几乎所有的配置均可在线更改(其配置数据基于SQLite存储),无需重启proxysql
- 基于正则和client_addr的强大和灵活的路由规则
- 详细的状态统计,统计结果和pt-query-digest对慢日志的分析结果类似,相当于有了统一的查看sql性能和sql语句统计的入口(Designed by a DBA for DBAs)
- 自动重连和重新执行机制(auto-reconnect and automatic re-execution of queries using it’s Connections Pool
):若一个请求在链接或执行过程中意外中断,proxysql会根据其内部机制重新执行该操作 - query cache功能:比mysql自带QC更灵活,可在
mysql_query_rules
表中依据digest
,match_pattern
,client_addr
等维度控制哪类语句可以缓存 - 支持连接池(connection pool)并且支持multiplexing,区别于atlas之流的连接池实现。文中有详细对比说明
二、安装
rpm包下载地址
https://github.com/sysown/proxysql/releases 推荐rpm形式安装
Installing from source
Make sure you have installed the equivalent for each of these packages for your operating system:
automake
bzip2
cmake
make
gcc #>4.4版本
gcc-c++
git
openssl
openssl-devel
patch
git clone https://github.com/sysown/proxysql.git
Go to the directory where you cloned the repo (or unpacked the tarball) and run:
make
sudo make install
Compilation time should be around a couple of minutes for the first time around. The configuration file will be found at /etc/proxysql.cnf afterwards.
在make这一步遇到了错误:
g++ -fPIC -c -o obj/ProxySQL_GloVars.oo ProxySQL_GloVars.cpp -std=c++11 -I../include -I../deps/jemalloc/jemalloc/include/jemalloc -I../deps/mariadb-client-library/mariadb_client/include -I../deps/libconfig/libconfig-1.4.9/lib -I../deps/re2/re2 -I../deps/sqlite3/sqlite3 -O2 -ggdb -Wall
cc1plus: 错误:无法识别的命令行选项“-std=c++11”
make[1]: *** [obj/ProxySQL_GloVars.oo] 错误 1
make[1]: Leaving directory `/usr/local/src/proxysql-master/lib'
make: *** [build_lib] 错误 2
网查是由于gcc版本低导致,centos 6的yum源(以及epel源)都只能获取到4.4.7版本
包 gcc-4.4.7-17.el6.x86_64 已安装并且是最新版本
包 gcc-c++-4.4.7-17.el6.x86_64 已安装并且是最新版本
而centos7上为4.8版本
换到centos7上,将上述软件安装/更新之后,make步骤完成,但是make install步骤又出了问题:
install -m 0755 src/proxysql /usr/local/bin
install -m 0600 etc/proxysql.cnf /etc
install -m 0755 etc/init.d/proxysql /etc/init.d
if [ ! -d /var/lib/proxysql ]; then mkdir /var/lib/proxysql ; fi
update-rc.d proxysql defaults
make: update-rc.d:命令未找到
make: *** [install] 错误 127
update-rc.d是ubuntu的自启动脚本管理软件,未成功安装不影响使用。
安装完成后,自动在/etc/init.d/proxysql增加服务管理脚本(需要把/usr/local/bin/加入$PATH或者软链至 $PATH目录下,脚本中直接用到proxysql命令)
三、配置
配置文件/etc/proxysql.cnf和配置数据库文件/var/lib/proxysql/proxysql.db,如果存在 “proxysql.db”文件,则启动过程不解析proxysql.cnf文件;配置文件只在第一次启动的时候读取
官方推荐用admin interface方式
登陆admin interface:
mysql -uadmin -padmin -P6032 -h127.0.0.1
登陆成功后,可通过对main库(默认登陆后即在此库)的global_variables表中的
admin-admin_credentials
admin-mysql_ifaces
两个变量进行更改来修改登录认证
注意:admin interface对配置的存储是基于SQLite的,SQLite支持标准的SQL语法,与mysql也基本兼容。但是无法用use语句切换数据库,作者对use语句做了兼容(不报错),但是却没有实际效果。
配置后端DB server:
两种方式,区别在于:
1. 一种是在往mysql_servers表中添加server时就为其划分好hostgroup_id(例如0表示写组,1表示读组)
2. 另一种往mysql_servers表中添加server时不区分hostgroup_id(例如全部设为0),然后通过mysql_replication_hostgroups表中的值,根据proxysql检测到的各server的read_only变量值来自动为后端server设置hostgroup_id
这里强烈推荐用第一种方式:
因为第一种是完全由我们控制的;而第二种假如我们误将读server的read_only属性设置为0,则proxysql会将其重新分配到写组,这绝对是不期望的。
四、功能测试
实验环境
MySQL [(none)]> select * from mysql_servers;
+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 0 | 192.168.1.21 | 3307 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
| 1 | 192.168.1.10 | 3306 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
| 1 | 192.168.1.4 | 3306 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | |
+--------------+--------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
#proxysql server的IP为:192.168.1.34
负载均衡测试
配置好一主(db1,hostgroup0)两从(db2和db3,hostgroup1) ,并且在’mysql_query_rules’表中增加一条路由规则
insert into mysql_query_rules (rule_id,active,match_digest,destination_hostgroup,apply) values (10,1,'^SELECT',1,1</