1.前言
最近和搞中间件的同事聊了聊,他感叹了几句,如今最大的难处在于中间件太多了,不知道用哪个。社区有几款不错的中间件,mycat算是影响力比较大的吧(以前听一位哥们儿说他认为mycat是java写的,效率很低,然后就对mycat狂轰滥炸),oneproxy是我们楼教主的扛鼎巨著,还有mariadb社区那个延迟开源的收费软件maxscale。好咯,今天我们不讲这些高大上的中间件,今天我们说的这个中间件是percona现在主推的一款中间件:ProxySQL。
可能很多同志没有听过ProxySQL,我们也很难在中文社区看到他的一些资料。首先我不得不说的是ProxySQL几个优点,首先它足够的轻量化,其次性能也足够满足常规需求。他可以干哪些事情呢,基本上社区中间件可以做的事情,它都可以做,什么读写分离啊,故障容错啊,分库分表啊。
2.安装部署
2.1安装包下载
安装包有两个地方可以下载,
https://www.percona.com/downloads/proxysql/
https://github.com/sysown/ProxySQL
选择适合自己操作系统以及相关版本吧,这里我们选择ProxySQL-1.2.2-1.x86_64.rpm。rpm包直接装好了。
2.2安装
直接使用rpm安装即可:
[root@hpc01 ~]# rpm -ivh ProxySQL-1.2.2-1.x86_64.rpm
2.3启动ProxySQL
[root@hpc01 ~]# sudo service ProxySQL start Starting ProxySQL: DONE!
2.4ProxySQL相关文件
[root@hpc01 ProxySQL]# pwd /var/lib/ProxySQL [root@hpc01 ProxySQL]# ls -l total 604 -rw-------. 1 root root 32768 Dec 24 23:25 ProxySQL.db -rw-------. 1 root root 571154 Dec 24 23:29 ProxySQL.log -rw-r--r--. 1 root root 5 Dec 24 23:25 ProxySQL.pid [root@hpc01 ProxySQL]# ls -l /etc/ProxySQL.cnf -rw-------. 1 root root 3588 Aug 4 21:37 /etc/ProxySQL.cnf
ProxySQL.db是SQLITE的数据文件,Proxysql很多东西是存储在这个迷你数据库里面的。ProxySQL.log是日志文件,排查问题好地方。ProxySQL.pid这个pid文件不多说了。ProxySQL.cnf是ProxySQL的一些静态配置项,比如一些启动选项,sqlite的数据目录等等。
2.5 ProxySQL的相关进程
[root@hpc01 ProxySQL]# ps -ef|grep ProxySQL root 1575 1 0 23:25 ? 00:00:00 ProxySQL -c /etc/ProxySQL.cnf -D /var/lib/ProxySQL root 1576 1575 0 23:25 ? 00:00:02 ProxySQL -c /etc/ProxySQL.cnf -D /var/lib/ProxySQL
细心的同学可能发现了进程有些奇怪哦,1575的父进程号居然是1,1576的父进程号是1575,他们不就是父子关系咯。这是不是很熟悉呢,和MySQL的很相似,我们启动一个进程,然后fork出一个子进程,父进程负责监控子进程运行状况如果挂了则拉起来,子进程负责执行真正的任务。
3.登录ProxySQL
ProxySQL初体验,第一次登录中间件是不是好鸡冻。
使用MySQL客户端工具登录。
[MySQL@hpc01 ~]$ MySQL -u admin -padmin -h 127.0.0.1 -P6032 MySQL: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 0 Server version: 5.5.30 (ProxySQL Admin Module) Copyright (c) 2009-2016 Percona LLC and/or its affiliates Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. admin@127.0.0.1 [(none)] 11:53:11>>>
很多同学可能已经蒙逼,这不是进入了MySQL数据库了吗?哈哈。笔者第一次玩这个的时候也陷入了这种尴尬的局面,以为特么的搞错了。其实这事ProxySQL作者的一番用意,他使用MySQL客户端作为用户和ProxySQL之间的交换工具,让MySQL的DBA有一种亲切感和熟悉感,我们做DBA的用起来上手更快,不用花时间学习,熟悉,适应,直接上手用。如果以上的prompt有点不一样,请设置环境变量
export MYSQL_PS1=”\\u@\\h [\\d] \\r:\\m:\\s>>>”
既然使用MySQL客户端登录,那我们来尝试执行我们常用的MySQL命令,看看啥效果。
admin@127.0.0.1 [(none)] 11:58:13>>>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) admin@127.0.0.1 [(none)] 11:58:18>>>show tables; +--------------------------------------+ | 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_scheduler | | scheduler | +--------------------------------------+ 12 rows in set (0.00 sec) admin@127.0.0.1 [(none)] 11:58:21>>>
厉害了,word哥。这些命令居然可以用,只是显示的东西有些不一样对吧。哈哈。里面这些配置什么的,详细信息我们后续再详细解释哦。
4.ProxySQL小试牛刀
ProxySQL既然是中间件嘛,就是我们访问数据库主机的一个代理嘛,这里我就给大家一个最简单的demo,我们不直接登录数据库,而是使用ProxySQL来登录数据库。
我们就在安装ProxySQL的本机上安装一个MySQL,然后通过ProxySQL来登录数据库。(很多同学可能不乐意,这有什么鸟用。可是同学,复杂总是从简单开始的嘛)
4.1 初始化数据库
/opt/percona-server-5.7.13-6/bin/MySQLd --initialize-insecure --basedir=/opt/percona-server-5.7.13-6 --datadir=/data/px_MySQL
4.2数据库配置文件
[MySQLd] # server configuration datadir=/data/px_MySQL basedir=/opt/percona-server-5.7.13-6 port=24801 socket=/data/px_MySQL/px_MySQL.sock server_id=1 gtid_mode=ON enforce_gtid_consistency=ON master_info_repository=TABLE relay_log_info_repository=TABLE binlog_checksum=NONE log_slave_updates=ON log_bin=binlog binlog_format=ROW gtid_mode = ON enforce_gtid_consistency = 1 log_bin=/data/px_MySQL/MySQL-bin relay-log=/data/px_MySQL/relay_binary_log
4.3启动数据库
./bin/MySQLd_safe --defaults-file=/data/conf/px_MySQL.cnf &
4.4 在数据库端创建监控ProxySQL的监控用户和业务用户
CREATE USER 'ProxySQL'@'%' IDENTIFIED BY 'ProxySQLPa55'; GRANT USAGE ON *.* TO 'ProxySQL'@'%'; CREATE USER 'sbuser'@'%' IDENTIFIED BY 'sbpass'; GRANT ALL ON * . * TO 'sbuser'@'%'; FLUSH PRIVILEGES;
注意:这是在MySQL数据库中执行的SQL命令
4.5ProxySQL配置
将数据库和数据库相关用户配置进ProxySQL。
这些命令是在ProxySQL中执行的。
INSERT INTO MySQL_servers(hostgroup_id, hostname, port) VALUES (0,'10.25.7.48',24801); INSERT INTO MySQL_users(username,password,default_hostgroup) VALUES ('sbuser','sbpass',0); UPDATE global_variables SET variable_value='ProxySQL' WHERE variable_name='MySQL-monitor_username'; UPDATE global_variables SET variable_value='ProxySQLPa55' WHERE variable_name='MySQL-monitor_password';
最后还要讲配置生效。下面命令也在ProxySQL中执行。
LOAD MYSQL SERVERS TO RUNTIME; LOAD MYSQL USERS TO RUNTIME; SAVEMYSQL SERVERS TO DISK; SAVEMYSQL USERS TO DISK;
关于配置生效,后面详解,ProxySQL配置是三层架构。
4.6 通过ProxySQL登录MySQL
[MySQL@hpc01 ~]$ MySQL -u sbuser -psbpass -h 127.0.0.1 -P 6033 -e "select @@hostname" MySQL: [Warning] Using a password on the command line interface can be insecure. +------------+ | @@hostname | +------------+ | hpc01 | +------------+ [MySQL@hpc01 ~]$ MySQL -u sbuser -psbpass -h 127.0.0.1 -P 6033 MySQL: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.5.30 (ProxySQL) Copyright (c) 2009-2016 Percona LLC and/or its affiliates Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. sbuser@127.0.0.1 [(none)] 12:26:14>>>show variables like '%port%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | extra_port | 0 | | innodb_support_xa | ON | | large_files_support | ON | | port | 24801 | | report_host | | | report_password | | | report_port | 24801 | | report_user | | | require_secure_transport | OFF | +--------------------------+-------+ 9 rows in set (0.01 sec)
厉害了,word哥。终于通过proxy登录数据库了,是不是有不一样的feel呢。哈哈。后面再续ProxySQL的其他特性,包括查询重写,读写分离,防火墙,query cache等功能。
麻烦请教一下。proxysql支持存储过程吗
很不错的一篇入门文章
远程竟然连不上ProxySQL,该怎么配置呢?
mycat性能并不低,再者cobar这种没人维护的项目,很多公司任然在用的…
兄台所言极是