时间:2021-07-01 10:21:17 帮助过:23人阅读
在美团点评DBProxy读写分离使用说明文章中已经说明了使用目的,本文介绍ProxySQL的使用方法以及和DBProxy的性能差异。具体的介绍可以看官网的相关说明,并且这个中间件也是percona推的一款中间件。其特性和其他读写分离的中间件差距不大,具体的会在文中介绍。本文大致简单的介绍在使用过程中的一些说明,也可以看官方的wiki获得使用帮助。
Distributor ID: Ubuntu Description: Ubuntu 14.04.5 LTS Release: 14.04 Codename: trusty
percona站点:
https://www.percona.com/downloads/proxysql/
github/官网:
https://github.com/sysown/proxysql/releases
1)编译安装:
1:下载 wget https://github.com/sysown/proxysql/archive/v1.3.6.tar.gz 2:安装依赖包 apt-get install automake bzip2 cmake make g++ gcc git openssl debconf-utils 3:解压、编译 make make install ... Adding system startup for /etc/init.d/proxysql ... /etc/rc0.d/K20proxysql -> ../init.d/proxysql /etc/rc1.d/K20proxysql -> ../init.d/proxysql /etc/rc6.d/K20proxysql -> ../init.d/proxysql /etc/rc2.d/S20proxysql -> ../init.d/proxysql /etc/rc3.d/S20proxysql -> ../init.d/proxysql /etc/rc4.d/S20proxysql -> ../init.d/proxysql /etc/rc5.d/S20proxysql -> ../init.d/proxysql 4:修改非root启动 添加用户: useradd proxysql 修改相关文件权限: cd /var/lib/ chown -R proxysql.proxysql proxysql/ cd /etc/ chown -R proxysql.proxysql proxysql.cnf 修改启动命令 vi /etc/init.d/proxysql ->75行 proxysql $OPTS 改成 sudo -u proxysql /usr/bin/proxysql $OPTS 5:启动&关闭 /etc/init.d/proxysql start /etc/init.d/proxysql stop
2)deb包安装:
1:下载 wget https://github.com/sysown/proxysql/releases/download/v1.3.6/proxysql_1.3.6-dbg-ubuntu14_amd64.deb 2:安装 dpkg -i proxysql_1.3.5-1.1.trusty_amd64.deb 3:非root用户启动,参考编译安装部分。
通过启动文件 /etc/init.d/proxysql里可以知道ProxySQL安装好的数据目录在 /var/lib/proxysql/,配置文件目录在 /etc/proxysql.cnf。
root@proxysql:/var/lib/proxysql# pwd /var/lib/proxysql root@proxysql:/var/lib/proxysql# ls -lh total 48K -rw------- 1 proxysql proxysql 33K 5月 9 11:52 proxysql.db -rw------- 1 proxysql proxysql 7.4K 5月 9 11:56 proxysql.log root@proxysql:~# ls -lh /etc/proxysql.cnf -rw------- 1 proxysql proxysql 4.2K 5月 9 11:45 /etc/proxysql.cnf
启动之后,可以看到这些文件:proxysql.db是SQLITE的数据文件,proxysql配置,如后端数据库的账号、密码、路由等存储在这个数据库里面,proxysql.log是日志文件。proxysql.pid这个pid文件。proxysql.cnf是ProxySQL的一些静态配置项,比如一些启动选项,sqlite的数据目录等等。配置文件只在第一次启动的时候读取进行初始化,后面只读取db文件。
root@proxysql:~# ps -ef | grep proxysql proxysql 35740 1 0 12:20 ? 00:00:00 /usr/bin/proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql proxysql 35741 35740 0 12:20 ? 00:00:00 /usr/bin/proxysql -c /etc/proxysql.cnf -D /var/lib/proxysql
和MySQL的很相似,我们启动一个进程,然后fork出一个子进程,父进程负责监控子进程运行状况如果挂了则拉起来,子进程负责执行真正的任务。
和DBProxy一样,ProxySQL也是有管理接口和客户端接口,通过配置文件/etc/proxysql.cnf可以看到管理和客户端接口的信息:
admin_variables= { admin_credentials="admin:admin" mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock" # refresh_interval=2000 # debug=true } mysql_variables= { ...
... interfaces="0.0.0.0:6033;/tmp/proxysql.sock" default_schema="information_schema" ...
... }
看到管理接口的端口是6032,账号密码是admin(可以动态修改)只能通过本地连接,客户端接口的端口是6033,账号密码通过管理接口去设置。
通过管理接口登录,需要先装好mysql客户端,并且设置prompt
[client]
prompt = \\u@\\h : \\d \\r:\\m:\\s>
通过管理接口进入ProxySQL
root@proxysql:~# mysql -uadmin -padmin -h127.0.0.1 -P6032 ... ... admin@127.0.0.1 : (none) 12:43:08>show databases; +-----+---------+-------------------------------+ | seq | name | file | +-----+---------+-------------------------------+ | 0 | main | | | 2 | disk | /var/lib/proxysql/proxysql.db | | 3 | stats | | | 4 | monitor | | +-----+---------+-------------------------------+ 4 rows in set (0.00 sec)
main
内存配置数据库,表里存放后端db实例、用户验证、路由规则等信息。表名以 runtime_
开头的表示proxysql当前运行的配置内容,不能通过dml语句修改,只能修改对应的不以 runtime_ 开头的(在内存)里的表,然后 LOAD
使其生效, SAVE
使其存到硬盘以供下次重启加载。disk
是持久化到硬盘的配置,sqlite数据文件。stats
是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间等等。monitor
库存储 monitor 模块收集的信息,主要是对后端db的健康/延迟检查。1)main库:
admin@127.0.0.1 : (none) 02:01:54>show tables from main; +--------------------------------------+ | tables | +--------------------------------------+ | global_variables | | mysql_collations | | mysql_query_rules | | mysql_replication_hostgroups | | mysql_servers | | mysql_users | | runtime_global_variables | | runtime_mysql_query_rules | | runtime_mysql_replication_hostgroups | | runtime_mysql_servers | | runtime_mysql_users | | runtime_scheduler | | scheduler | +--------------------------------------+ 13 rows in set (0.00 sec)
global_variables
设置变量,包括监听的端口、管理账号等,详细可参考 https://github.com/sysown/proxysql/wiki/Global-variables。通过set来设置,如:
set mysql-monitor_ping_interval =10001;
mysql_collations:相关字符集和校验规则。
mysql_query_rules:定义查询路由规则。
CREATE TABLE mysql_query_rules ( rule_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 0, username VARCHAR, schemaname VARCHAR, flagIN INT NOT NULL DEFAULT 0, client_addr VARCHAR, proxy_addr VARCHAR, proxy_port INT, digest VARCHAR, match_digest VARCHAR, match_pattern VARCHAR, negate_match_pattern INT CHECK (negate_match_pattern IN (0,1)) NOT NULL DEFAULT 0, flagOUT INT, replace_pattern VARCHAR, destination_hostgroup INT DEFAULT NULL, cache_ttl INT CHECK(cache_ttl > 0), reconnect INT CHECK (reconnect IN (0,1)) DEFAULT NULL, timeout INT UNSIGNED, retries INT CHECK (retries>=0 AND retries <=1000), delay INT UNSIGNED, mirror_flagOUT INT UNSIGNED, mirror_hostgroup INT UNSIGNED, error_msg VARCHAR, log INT CHECK (log IN (0,1)), apply INT CHECK(apply IN (0,1)) NOT NULL DEFAULT 0, comment VARCHAR)
mysql_replication_hostgroups:监视指定主机组中所有服务器的read_only值,并且根据read_only的值将服务器分配给写入器或读取器主机组
CREATE TABLE mysql_replication_hostgroups ( writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY, reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>0), comment VARCHAR, UNIQUE (reader_hostgroup))
定义 hostgroup 的主从关系。ProxySQL monitor 模块会监控 HG 后端所有servers 的 read_only
变量,如果发现从库的 read_only 变为0、主库变为1,则认为角色互换了,自动改写 mysql_servers 表里面 hostgroup 关系,达到自动 Failover 效果。
mysql_servers:设置后端MySQL的表
CREATE TABLE mysql_servers ( hostgroup_id INT NOT NULL DEFAULT 0, hostname VARCHAR NOT NULL, port INT NOT NULL DEFAULT 3306, status VARCHAR CHECK (UPPER(status) IN (‘ONLINE‘,‘SHUNNED‘,‘OFFLINE_SOFT‘, ‘OFFLINE_HARD‘)) NOT NULL DEFAULT ‘ONLINE‘, weight INT CHECK (weight >= 0) NOT NULL DEFAULT 1, compression INT CHECK (compression >=0 AND compression <= 102400) NOT NULL DEFAULT 0, max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 1000, max_replication_lag INT CHECK (max_replication_lag >= 0 AND max_replication_lag <= 126144000) NOT NULL DEFAULT 0, use_ssl INT CHECK (use_ssl IN(0,1)) NOT NULL DEFAULT 0, max_latency_ms INT UNSIGNED CHECK (max_latency_ms>=0) NOT NULL DEFAULT 0, comment VARCHAR NOT NULL DEFAULT ‘‘, PRIMARY KEY (hostgroup_id, hostname, port) )
mysql_users:配置后端数据库的账号和监控的账号
CREATE TABLE mysql_users ( username VARCHAR NOT NULL, password VARCHAR, active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1, use_ssl INT CHECK (use_ssl IN (0,1)) NOT NULL DEFAULT 0, default_hostgroup INT NOT NULL DEFAULT 0, default_schema VARCHAR, schema_locked INT CHECK (schema_locked IN (0,1)) NOT NULL DEFAULT 0, transaction_persistent INT CHECK (transaction_persistent IN (0,1)) NOT NULL DEFAULT 0, fast_forward INT CHECK (fast_forward IN (0,1)) NOT NULL DEFAULT 0, backend INT CHECK (backend IN (0,1)) NOT NULL DEFAULT 1, frontend INT CHECK (frontend IN (0,1)) NOT NULL DEFAULT 1, max_connections INT CHECK (max_connections >=0) NOT NULL DEFAULT 10000, PRIMARY KEY (username, backend), UNIQUE (username, frontend))
scheduler:调度器是一个类似于cron的实现,集成在ProxySQL中,具有毫秒的粒度。通过脚本检测来设置ProxySQL。
CREATE TABLE scheduler ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, active INT CHECK (active IN (0,1)) NOT NULL DEFAULT 1, interval_ms INTEGER CHECK (interval_ms>=100 AND interval_ms<=100000000) NOT NULL, filename VARCHAR NOT NULL, arg1 VARCHAR, arg2 VARCHAR, arg3 VARCHAR, arg4 VARCHAR, arg5 VARCHAR, comment VARCHAR NOT NULL DEFAULT ‘‘)
关于main库下的表的说明可以看这篇文章的说明:http://seanlook.com/2017/04/10/mysql-proxysql-install-config/
2)disk库:
show tables from disk; +------------------------------+ | tables | +------------------------------+ | global_variables | | mysql_collations | | mysql_query_rules | | mysql_replication_hostgroups | | mysql_servers | | mysql_users | | scheduler | +------------------------------+ 7 rows in set (0.00 sec)
和上面介绍的main库一样。
3)stats库:
stats_mysql_commands_counters:统计各种SQL类型的执行次数和时间,通过参数mysql-commands_stats控制开关,默认是ture。
CREATE TABLE stats_mysql_commands_counters ( Command VARCHAR NOT NULL PRIMARY KEY, Total_Time_us INT NOT NULL, Total_cnt INT NOT NULL, cnt_100us INT NOT NULL, cnt_500us INT NOT NULL, cnt_1ms INT NOT NULL, cnt_5ms INT NOT NULL, cnt_10ms INT NOT NULL, cnt_50ms INT NOT NULL, cnt_100ms INT NOT NULL, cnt_500ms INT NOT NULL, cnt_1s INT NOT NULL, cnt_5s INT NOT NULL, cnt_10s INT NOT NULL, cnt_INFs)
stats_mysql_connection_pool:连接后端MySQL的连接信息。
CREATE TABLE stats_mysql_connection_pool ( hostgroup VARCHAR, srv_host VARCHAR, srv_port VARCHAR, status VARCHAR, ConnUsed INT, ConnFree INT, ConnOK INT, ConnERR INT, Queries INT, Bytes_data_sent INT, Bytes_data_recv INT, Latency_us INT)
stats_mysql_global:代表与MySQL相关的代理级别的全局统计,如:
stats_mysql_processlist:类似MySQL的show processlist的命令,查看各线程的状态。
CREATE TABLE stats_mysql_processlist ( ThreadID INT NOT NULL, SessionID INTEGER PRIMARY KEY, user VARCHAR, db VARCHAR, cli_host VARCHAR, cli_port VARCHAR, hostgroup VARCHAR, l_srv_host VARCHAR, l_srv_port VARCHAR, srv_host VARCHAR, srv_port VARCHAR, command VARCHAR, time_ms INT NOT NULL, info VARCHAR)
stats_mysql_query_digest:表示SQL的执行次数、时间消耗等。通过变量mysql-query_digests控制开关,默认是开。
stats_mysql_query_digest Create Table: CREATE TABLE stats_mysql_query_digest ( hostgroup INT, schemaname VARCHAR NOT NULL, username VARCHAR NOT NULL, digest VARCHAR NOT NULL, digest_text VARCHAR NOT NULL, count_star INTEGER NOT NULL, first_seen INTEGER NOT NULL, last_seen INTEGER NOT NULL, sum_time INTEGER NOT NULL, min_time INTEGER NOT NULL, max_time INTEGER NOT NULL, PRIMARY KEY(hostgroup, schemaname, username, digest))
stats_mysql_query_digest_reset和stats_mysql_query_digest结构一样,stats_mysql_query_digest_reset可以清空stats_mysql_query_digest的数据,如执行:
select * from stats_mysql_query_digest_reset; show create table stats.stats_mysql_query_digest_reset;
执行上面的任意一条就可以清空stats_mysql_query_digest表。
stats_mysql_query_rules:路由命中次数统计。
CREATE TABLE stats_mysql_query_rules ( rule_id INTEGER PRIMARY KEY, hits INT NOT NULL)
4)monitor库: 对后端MySQL的健康检查。由变量mysql-monitor_enabled来确定是否开启Monitor模块。
mysql-monitor_connect_interval来控制其检测
的时间间隔,由参数mysql-monitor_connect_timeout控制连接是否超时(默认200毫秒)。
mysql_server_ping/mysql_server_ping_log:使用mysql_ping API ping后端MySQL服务器检查它们是否可用,该表用来存放ping的日志。由变量mysql-monitor_ping_interval控制ping的时间间隔,默认值:10000(毫秒,相当于10秒)。ProxySQL有一个完备的配置系统,持配置修改之后的在线保存、应用,不需要重启之后生效。整个配置系统分三层设计。配置系统分为三层的目的有三个:
(1).自动更新
(2).尽可能的不重启proxysql就可以修改配置
(3).方便回滚错误配置
整个配置系统分为三层,如下所示:
+-------------------------+ | RUNTIME | +-------------------------+ /|\ | | | [1] | [2] | | \|/ +-------------------------+ | MEMORY | +-------------------------+ _ /|\ | | | | [3] | [4] | \ [5] | \|/ +-------------------------+ +-------------------------+ |