• 运维特工,战胜心魔!!
  • 有些事情其实没有那么难,只是我们感觉难,走出第一步!
  • 你所浪费的今天,是昨天死去的人奢望的明天!!!
  • 欢迎访问 unixfbi.com 运维特工社区http://unixfbi.com/
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧
  • 运维特工:http://www.unixfbi.com
  • 人生没有白走的路,每一步都算数!!
  • 空杯心态,沉淀自己!

MySQL中间件ProxySQL介绍

MySQL unixfbi 1年前 (2018-07-15) 2802次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

一、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),然后从该配置文件中获取datadirdatadir中存储的是 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,账号密码通过管理接口去设置。

5.登录 ProxySQL

根据/etc/proxysql.cnf配置文件中 admin_variables 配置段中

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
}

从上面的信息我们可以知道,账号密码是admin:admin ,监听地址和端口为:mysql_ifaces="0.0.0.0:6032",知道了这些信息,我们登录一下看看吧。
先设置一下环境变量:

# echo 'export MYSQL_PS1="\\u@\\h [\\d] \\R:\\m:\\s >"' >> /etc/profile
# source /etc/profile

登录:

# mysql -uadmin -padmin -h127.0.0.1 -P6032        
admin@127.0.0.1 [(none)] 17:25:03 >show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.00 sec)

这些数据是存放在 ProxySQL 自己的 SQLITE 数据库中。

参考文档

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


UnixFBI 运维特工 , 版权所有丨如未注明 , 均为原创丨 转载请务必注明原文链接http://www.unixfbi.com/528.html
喜欢 (0)
[支付宝]
分享 (0)
unixfbi
关于作者:
运维工程师一枚,做有价值的事情!
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址