MySQL中间件ProxySQL介绍

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: ProxySQL 是一个高性能的SQL 代理。ProxySQL有一个高级多核体系结构。支持数十万并发连接,可以多路复用到后端服务器上。作为守护进程运行。而且有一个进程监视这个守护进程,并在守护进程崩溃时重启守护进程,以减少停机时间。这个守护进程接受来自MySQL客户端的请求,并将其转发到后端的MySQL服务器上。ProxySQL被设计为可以连续运行而且不需要重启。大多数配置可以在运行时使用类似SQL语句的查询完成。
ProxySQL作为一款强大的中间件为MySQL的架构提供了有力的支持。
目前可以很好的支持 Master Slave\ MGR \ PXC等,并提供连接池、读写分离、日志记录等功能,当然还有很多其他实用功能,这里不一一列举了。
本文都是基础概念,基本出自官方文档,官方已经解释的非常清晰,我就不太多加工,汇总一些实用的分享给大家。

安装

ProxySQL安装非常简单
![图片.png](https://ucc.alicdn.com/pic/developer-ecology/bfff5d058a4d46679a53bfdb0e1bc5a1.png)

连接ProxySQL

ProxySQL默认管理端口6032,默认需要127.0.0.1来进入,进入方式和连接MySQL方式一致: 

图片.png

ProxySQL 运行机制
RUNTIME

RUNTIME表示处理请求的线程使用的ProxySQL的内存数据结构。
runtime variables 包含了:
    1.    Global variables的实际值
    2.    将后端的服务器列表分组到hostgroup中。
    3.    让MySQL 的User们可以连接proxysql

注意:runntime层数据,谁都不能直接修改,必须通过下一层来提交修改。
MEMORY

MEMORY(有时也称为main)表示通过MySQL兼容接口公开的内存数据库。 用户可以将MySQL客户端连接到此接口,并查询各种ProxySQL配置表/数据库。   
通过此接口可用的配置表是:

mysql_servers - ProxySQL连接到的后端服务器列表

mysql_users - 连接到ProxySQL的用户及其凭据列表。 请注意,ProxySQL也将使用相同的凭据连接到后端服务器!

mysql_query_rules - 将流量路由到各种后端服务器时评估的查询规则列表。 这些规则还可以重写查询,甚至可以缓存已执行查询的结果。

global_variables - 代理配置使用的全局变量列表,可在运行时调整。

DISK 和 CONFIG FILE

DISK表示磁盘上的SQLite3数据库,默认位置为$(DATADIR)/proxysql.db。 在重新启动时,未保留的内存中配置将丢失。 因此,将配置保留在DISK中非常重要。   
![图片.png](https://ucc.alicdn.com/pic/developer-ecology/f8b45541e53244bfa89abe0ca0d509aa.png)

启动过程

如果找到数据库文件(proxysql.db),ProxySQL将从proxysql.db初始化其内存中配置。 因此,磁盘被加载到MEMORY中,然后加载到RUNTIME中。 
如果找不到数据库文件(proxysql.db)且存在配置文件(proxysql.cfg),则解析配置文件并将其内容加载到内存数据库中,然后将其保存在proxysql.db中并在加载到RUNTIME。 
请务必注意,如果找到proxysql.db,则不会解析配置文件。 也就是说,在正常启动期间,ProxySQL仅从持久存储的磁盘数据库初始化其内存配置。
**配置文件有4个变量,即使存在proxysql.db,也始终会从配置文件里去解析:**
    1.    datadir:

           定义了ProxySQL datadir的路径,其中存储了数据库文件,日志和其他文件

    2.    restart_on_missing_heartbeats(1.4.4中的新增内容):

           如果MySQL线程错过了restart_on_missing_heartbeats心跳,则proxysql将引发SIGABRT信号并重新启动。 默认值为10。 

            详情请见:https://github.com/sysown/proxysql/wiki/Watchdog。

    3.    execute_on_exit_failure(1.4.4中的新增内容):

           如果设置,ProxySQL父进程将在每次ProxySQL崩溃时执行定义的脚本。 建议使用此设置生成警报或记录事件。 

            请注意,在崩溃的情况下,proxysql能够在几毫秒内重新启动,因此其他监视工具可能无法检测到正常故障。

    4.    errorlog(2.0.0中的新增内容):

           如果设置,ProxySQL将使用定义的文件作为错误日志。 如果未传递此类变量,则errolog将位于datadir / proxysql.log中

初始化启动过程(或--initial)

在初始启动时,将从配置文件中填充内存和运行时配置。 此后,配置将保留在ProxySQL的嵌入式SQLite数据库中。 
通过使用--initial标志运行proxysql可以强制重新发生初始配置,这会将SQLite数据库文件重置为其原始状态(即配置文件中定义的状态)并重命名现有的SQLite数据库文件 
如果需要回滚(如果需要,检查已定义的数据目录中的旧文件)。

重新加载启动(或--reload)

如果使用--reload标志执行proxysql,它会尝试将配置文件中的配置与数据库文件的内容合并。 之后,ProxySQL将继续启动程序。

如果配置文件和数据库文件的参数存在冲突,则无法保证ProxySQL将成功管理合并,用户应始终验证合并结果是否符合预期。

核心配置表

在运行时修改配置是通过ProxySQL的MySQL管理端口(默认为6032)完成的。 
连接到它后,您将看到一个与MySQL兼容的接口,用于查询各种与ProxySQL相关的表:
  
mysql> show tables;
+-------------------+
| tables            |
+-------------------+
| mysql_servers     |
| mysql_users       |
| mysql_query_rules |
| global_variables  |
| mysql_collations  |
| debug_levels      |
+-------------------+  ```




 

    每个这样的表都有明确的定义:

        mysql_servers:        包含要连接的ProxySQL的后端服务器列表

        mysql_users:           包含ProxySQL将用于向后端服务器进行身份验证的用户列表

        mysql_query_rules:    包含用于缓存,路由或重写发送到ProxySQL的SQL查询的规则

        global_variables:        包含在服务器初始配置期间定义的MySQL变量和管理变量

        debug_levels:             仅用于调试ProxySQL的手动构建

 
**在不同层级间移动配置信息**
    为了将配置持久化到磁盘或将配置加载到运行时,可以使用一组不同的管理命令,这些命令可以通过管理界面执行。 
    一旦理解了三层中的每一层的使用方式,语义都应该清楚。 
    连同每个命令的说明,每个命令旁边都有一个编号选项。 该数字对应于下图中列出的箭头
    
 ![图片.png](https://ucc.alicdn.com/pic/developer-ecology/eee0b30319814f8da364451167480fa3.png)


    
要重新配置MySQL用户,请执行以下命令之一:
 
[1]    LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME

    将MySQL用户从MEMORY加载到RUNTIME数据结构,反之亦然

 

[2]    SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME

    将MySQL用户从RUNTIME保存到MEMORY

 

[3]    LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK

    将持久化的MySQL用户从磁盘数据库加载到MEMORY

 

[4]    SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK

    将MySQL用户从MEMORY中保存到DISK

 

[5]    LOAD MYSQL USERS FROM CONFIG

    从配置文件加载用户到MEMORY

    常用的命令参考:

LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;

LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;

注意:关键字MEMORY/RUNTIME 都支持缩写:
MEM for MEMORY
RUN for 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

   }
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
关系型数据库 MySQL 中间件
企业实战(10)基于Maxscale中间件实现Mysql读写分离实战
企业实战(10)基于Maxscale中间件实现Mysql读写分离实战
|
6月前
|
消息中间件 NoSQL 关系型数据库
【Kubernetes部署Shardingsphere、Mycat、Mysql、Redis、中间件Rocketmq、Rabbitmq、Nacos】
【Kubernetes部署Shardingsphere、Mycat、Mysql、Redis、中间件Rocketmq、Rabbitmq、Nacos】
129 0
|
6月前
|
关系型数据库 MySQL 中间件
MySQL实现分库分表代码实战(Mango中间件)
MySQL实现分库分表代码实战(Mango中间件)
|
9月前
|
关系型数据库 MySQL 中间件
mysql 中间件 mycat2 的详细安装及配置步骤
右上角下载里面有个文件下载服务,点进去发现无法访问
|
10月前
|
SQL 负载均衡 安全
MySQL-中间件mycat(三)
MySQL-中间件mycat(三)
208 0
|
10月前
|
存储 算法 中间件
MySQL-中间件mycat(二)(2)
MySQL-中间件mycat(二)
|
10月前
|
负载均衡 关系型数据库 MySQL
MySQL-中间件mycat(二)(1)
MySQL-中间件mycat(二)
|
10月前
|
存储 SQL cobar
MySQL-中间件mycat(一)
MySQL-中间件mycat(一)
332 0
|
SQL JSON JavaScript
Node.js(三)路由器、中间件、MySQL模块、RESTful接口
Node.js(三)路由器、中间件、MySQL模块、RESTful接口
211 0
Node.js(三)路由器、中间件、MySQL模块、RESTful接口
|
数据采集 Prometheus 监控
使用云监控来监控线下IDC(及其它云)的Mongodb,Redis,Mysql等中间件
背景当前很多用户的服务部署在混合环境中,比如同时使用多个云厂商,或者云加线下IDC等。而对于线下IDC的监控主要是使用开源的系统来自建。带来的问题就是需要花费较大精力来维护自建监控系统并且和云上的监控数据也无法打通。针对这种混合云环境,云监控推出了企业版监控服务,可以实现在阿里云上对下线IDC或其它云服务上部署的中间件进行监控。线下IDC中间件监控实现在云监控上对下线IDC的中间件进行监控,主要实
520 0
使用云监控来监控线下IDC(及其它云)的Mongodb,Redis,Mysql等中间件