mysql的proxy机制_ProxySQL 基础知识梳理 - 运维小结 (完整版)

ProxySQL是灵活强大的MySQL代理层, 是一个能实实在在用在生产环境的MySQL中间件,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行 cache,支持动态加载配置、故障切换和一些 SQL的过滤功能。还有一些同类产品比如 DBproxy、MyCAT、OneProxy 等。但经过反复对比和测试之后,还是觉得ProxySQL是一款性能不谙,靠谱稳定的MySQL 中间件产品 !

ProxySQL的亮点所在

-  几乎所有的配置均可在线更改(其配置数据基于SQLite存储),无需重启proxysql

-  基于正则和client_addr的强大和灵活的路由规则

-  详细的状态统计,统计结果和pt-query-digest对慢日志的分析结果类似,相当于有了统一的查看sql性能和sql语句统计的入口(Designed by a DBA for DBAs)

-  自动重连和重新执行机制(auto-reconnect and automatic re-execution of queries using it’s Connections Pool ): 若一个请求在链接或执行过程中意外中断,proxysql会根据其内部机制重新执行该操作

-  query cache功能:比mysql自带QC更灵活,可在mysql_query_rules表中依据digest,match_pattern,client_addr等维度控制哪类语句可以缓存

-  支持连接池(connection pool)并且支持multiplexing,区别于atlas之流的连接池实现。

ProxySQL的特点

-  将所有配置保存写入到SQLit表中。

-  支持动态加载配置,即一般可以在线修改配置,但有少部分参数还是需要重启来生效。

-  支持query cache。

-  支持对query的路由,可以针对某个语句进行分配去哪个实例执行。

-  故障切换。

-  过滤危险的SQL。

-  不支持分表,可以分库,但是利用规则配置实现分表。

ProxySQL的管理配置 (有三层配置)

-  runtime:运行中使用的配置文件

-  memory:提供用户动态修改配置文件

-  disk:将修改的配置保存到磁盘SQLit表中(即:proxysql.db)

-  config:一般不使用它(即:proxysql.cnf)

三层配置图如下:

20190128130741196481.png

简单说就是配置proxysql分为三个级别,RUNTIME是即时生效的,MEMORY是保存在内存中但并不立即生效的,DISK|CONFIG FILE是持久化或写在配置文件中的。

这三个级别的配置文件互不干扰,在某个层级修改了配置文件,想要加载或保存到另一个层级,需要额外的LOAD或SAVE操作:LOAD xx_config FROM xx_level | LOAD xx_config TO xx_level | SAVE xx_config TO xx_level | SAVE xx_config FROM xx_level,达到加载配置或者持久化配置的目的。

-  RUNTIME层级的配置时在proxysql管理库(sqlite)的main库中以runtime_开头的表,这些表的数据库无法直接修改,只能从其他层级加载;

-  MEMORY层级的配置在main库中以mysql_开头的表以及global_variables表,这些表的数据可以直接修改;

-  DISK|CONFIG FILR层级的配置在磁盘上的sqlite库或配置文件里。

配置文件的修改流程一般是:

-  启动时:先修改必要的CONFIG FILE配置,比如管理端口,然后启动;

-  其他配置:修改MEMORY中的表,然后加载到RUNTIME并持久化。

需要注意:

RUNTIME: 代表 ProxySQL 当前生效的正在使用的配置,无法直接修改这里的配置,必须要从下一层 "load" 进来。

MEMORY: MEMORY这一层上面连接 RUNTIME 层,下面连接持久化层。在这层可以正常操作 ProxySQL 配置,随便修改,不会影响生产环境。修改一个配置一般都是先在 MEMORY 层完成,然后确认正常之后再加载到 RUNTIME 和持久化到磁盘上。

DISK 和 CONFIG FILE: 持久化配置信息,重启后内存中的配置信息会丢失,所以需要将配置信息保留在磁盘中。重启时,可以从磁盘快速加载回来。

ProxySQL具有一个复杂但易于使用的配置系统,可以满足以下需求:

-  允许轻松动态更新配置(这是为了让ProxySQL用户可以在需要零宕机时间配置的大型基础架构中使用它)。与MySQL兼容的管理界面可用于此目的。

-  允许尽可能多的配置项目动态修改,而不需要重新启动ProxySQL进程

-  可以毫不费力地回滚无效配置

-  这是通过多级配置系统实现的,其中设置从运行时移到内存,并根据需要持久保存到磁盘。

一般,修改的配置都是在memory层。可以load到runtime,使配置在不用重启proxysql的情况下也可以生效,也可以save到disk,将对配置的修改持久化

[1] LOAD MYSQL USERS FROM MEMORY 或 LOAD MYSQL USERS TO RUNTIME

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

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

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

[5] LOAD MYSQL USERS FROM CONFIG

一、 proxysql 安装 (两种方式)

1) 采用yum方式安装

[root@mysql-proxy ~]# vim /etc/yum.repos.d/proxysql.repo

[proxysql_repo]

name= ProxySQL YUM repository

baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever

gpgcheck=1

gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key

执行安装

[root@mysql-proxy ~]# yum clean all

[root@mysql-proxy ~]# yum makecache

[root@mysql-proxy ~]# yum -y install proxysql

[root@mysql-proxy ~]# proxysql --version

ProxySQL version 1.4.13-15-g69d4207, codename Truls

启动ProxySQL

[root@mysql-proxy ~]# chkconfig proxysql on

[root@mysql-proxy ~]# systemctl start proxysql

[root@mysql-proxy ~]# systemctl status proxysql

启动后会监听两个端口,

默认为6032和6033。6032端口是ProxySQL的管理端口,6033是ProxySQL对外提供服务的端口 (即连接到转发后端的真正数据库的转发端口)。

[root@mysql-proxy ~]# netstat -tunlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

tcp 0 0 0.0.0.0:6032 0.0.0.0:* LISTEN 23940/proxysql

tcp 0 0 0.0.0.0:6033 0.0.0.0:* LISTEN 23940/proxysql

2)采用rpm包方式安装

proxysql的rpm包下载地址: https://pan.baidu.com/s/1S1_b5DKVCpZSOUNmtCXrrg

提取密码: 5t1c

[root@mysql-proxy ~]# wget https://github.com/sysown/proxysql/releases/download/v1.4.8/proxysql-1.4.8-1-centos7.x86_64.rpm

[root@mysql-proxy ~]# rpm -ivh proxysql-1.4.8-1-centos7.x86_64.rpm --force

[root@mysql-proxy ~]# /etc/init.d/proxysql start

Starting ProxySQL: DONE!

[root@mysql-proxy ~]# ss -lntup|grep proxy

tcp LISTEN 0 128 *:6032 *:* users:(("proxysql",pid=2943,fd=24))

tcp LISTEN 0 128 *:6033 *:* users:(("proxysql",pid=2943,fd=22))

tcp LISTEN 0 128 *:6033 *:* users:(("proxysql",pid=2943,fd=21))

tcp LISTEN 0 128 *:6033 *:* users:(("proxysql",pid=2943,fd=20))

tcp LISTEN 0 128 *:6033 *:* users:(("proxysql",pid=2943,fd=19))

如上可以看出转发端口6033是启动了四个线程

==============================================================

以上两种方式采用任何一种都可以顺利安装proxysql插件。

另外,记得在proxysql服务器上安装mysql客户端,用于在本机连接到ProxySQL的管理接口

[root@mysql-proxy ~]# vim /etc/yum.repos.d/mariadb.repo

[mariadb]

name = MariaDB

baseurl = http://yum.mariadb.org/10.3.5/centos6-amd64

gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1

安装mysql-clinet客户端

[root@mysql-proxy ~]# yum install -y MariaDB-client

--------------------------------------------------------------------------------------------------------------------------------------------------------

如果遇到报错:

Error: MariaDB-compat conflicts with 1:mariadb-libs-5.5.60-1.el7_5.x86_64

You could try using --skip-broken to work around the problem

You could try running: rpm -Va --nofiles --nodigest

解决办法:

[root@mysql-proxy ~]# rpm -qa|grep mariadb*

mariadb-libs-5.5.56-2.el7.x86_64

[root@mysql-proxy ~]# rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps

[root@mysql-proxy ~]# yum install -y MariaDB-client

proxysql配置文件

[root@mysql-proxy ~]# egrep -v "^#|^$" /etc/proxysql.cnf

datadir="/var/lib/proxysql" #数据目录

admin_variables=

{

admin_credentials="admin:admin" #连接管理端的用户名与密码

mysql_ifaces="0.0.0.0:6032" #管理端口,用来连接proxysql的管理数据库

}

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" #指定转发端口,用于连接后端mysql数据库的,相当于代理作用

default_schema="information_schema"

stacksize=1048576

server_version="5.5.30" #指定后端mysql的版本

connect_timeout_server=3000

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

}

mysql_servers =

(

)

mysql_users:

(

)

mysql_query_rules:

(

)

scheduler=

(

)

mysql_replication_hostgroups=

(

)

proxysql的数据目录

[root@mysql-proxy ~]# ll /var/lib/proxysql/

total 1014052

-rw------- 1 root root 122880 Jan 25 14:33 proxysql.db

-rw------- 1 root root 1023288179 Jan 28 12:30 proxysql.log

-rw-r--r-- 1 root root 6 Jan 25 14:20 proxysql.pid

-rw------- 1 root root 1736704 Jan 28 12:29 proxysql_stats.db

proxysql管理接口的端口是6032,账号密码是admin(可以动态修改),允许客户端连接, 客户端接口的端口是6033,账号密码通过管理接口去设置。在mysql-proxy本机使用mysql客户端连接到ProxySQL的管理接口(admin interface), 该接口的默认管理员用户和密码都是admin。其中ip配置为0.0.0.0表示不限制ip,但是出于安全考虑,admin用户无论怎么设置都只能在本机登录!下面是通过管理端口6032去连接的(注意, 下面连接命令中后面的--prompt ‘admin‘字段可以不加,也是可以登录进去的)

[root@mysql-proxy ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1 --prompt ‘admin> ‘

Welcome to the MariaDB monitor. Commands end with ; or \g.

Your MySQL connection id is 33

Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

admin> 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.000 sec)

admin>

ProxySQL提供了几个库,每个库都有各自的意义;

-  main 内存配置数据库,表里存放后端db实例、用户验证、路由规则等信息。表名以 runtime_开头的表示proxysql当前运行的配置内容,

不能通过dml语句修改,只能修改对应的不以 runtime_ 开头的(在内存)里的表,然后 LOAD 使其生效, SAVE 使其存到硬盘以供下次重启加载。

-  disk 是持久化到硬盘的配置,sqlite数据文件。

-  stats 是proxysql运行抓取的统计信息,包括到后端各命令的执行次数、流量、processlist、查询种类汇总/执行时间等等。

-  monitor 库存储 monitor 模块收集的信息,主要是对后端db的健康/延迟检查。

另外重点注意main和monitor数据库中的表

admin> show tables from main;

+--------------------------------------------+

| tables |

+--------------------------------------------+

| global_variables |

| mysql_collations |

| mysql_group_replication_hostgroups |

| mysql_query_rules |

| mysql_query_rules_fast_routing |

| mysql_replication_hostgroups |

| mysql_servers |

| mysql_users |

| proxysql_servers |

| runtime_checksums_values |

| runtime_global_variables |

| runtime_mysql_group_replication_hostgroups |

| runtime_mysql_query_rules |

| runtime_mysql_query_rules_fast_routing |

| runtime_mysql_replication_hostgroups |

| runtime_mysql_servers |

| runtime_mysql_users |

| runtime_proxysql_servers |

| runtime_scheduler |

| scheduler |

+--------------------------------------------+

20 rows in set (0.001 sec)

几个重要字段含义:

global_variables 设置变量,包括监听的端口、管理账号等。

mysql_collations 相关字符集和校验规则。

mysql_query_rules 定义查询路由规则。

admin> show tables from monitor;

+------------------------------------+

| tables |

+------------------------------------+

| mysql_server_connect_log |

| mysql_server_group_replication_log |

| mysql_server_ping_log |

| mysql_server_read_only_log |

| mysql_server_replication_lag_log |

+------------------------------------+

5 rows in set (0.000 sec)

runtime_开头的是运行时的配置,这些是不能修改的。要修改ProxySQL的配置,需要修改了非runtime_表,修改后必须执行LOAD ... TO RUNTIME

才能加载到RUNTIME生效,执行save ... to disk才能将配置持久化保存到磁盘。

修改proxysql管理端口6032连接时的用户名和密码 (默认是admin:admin)


版权声明:本文为weixin_29831325原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。