MySQL · 2016-12-25 5

MySQL中间件之ProxySQL安装部署篇

1.前言


最近和搞中间件的同事聊了聊,他感叹了几句,如今最大的难处在于中间件太多了,不知道用哪个。社区有几款不错的中间件,mycat算是影响力比较大的吧(以前听一位哥们儿说他认为mycat是java写的,效率很低,然后就对mycat狂轰滥炸),oneproxy是我们楼教主的扛鼎巨著,还有mariadb社区那个延迟开源的收费软件maxscale。好咯,今天我们不讲这些高大上的中间件,今天我们说的这个中间件是percona现在主推的一款中间件:ProxySQL。

可能很多同志没有听过ProxySQL,我们也很难在中文社区看到他的一些资料。首先我不得不说的是ProxySQL几个优点,首先它足够的轻量化,其次性能也足够满足常规需求。他可以干哪些事情呢,基本上社区中间件可以做的事情,它都可以做,什么读写分离啊,故障容错啊,分库分表啊。

2.安装部署


2.1安装包下载

安装包有两个地方可以下载,

  • percona站点:
  • https://www.percona.com/downloads/proxysql/

  • github:
  • 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来登录数据库。QQ图片20161225000518
    我们就在安装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等功能。