0
点赞
收藏
分享

微信扫一扫

mysql进阶1——proxysql中间件

梦为马 2023-07-30 阅读 64

文章目录

一、基本了解

二、安装部署

主机版本主机名IP要安装的服务
CentOS7proxysql192.168.161.129proxysql
mysql客户端
CentOS7master192.168.161.130mysql主
CentOS7slave192.168.161.131mysql从

1.下载安装。

wget https://github.com/sysown/proxysql/releases/download/v2.5.4/proxysql-2.5.4-1-centos7.x86_64.rpm
yum -y  localinstall proxysql-2.5.4-1-centos7.x86_64.rpm

2.启动服务。

systemctl enable --now proxysql

在这里插入图片描述
3.连接proxysql服务,通过mysql客户端连接,默认账号/密码:admin/admin。

yum -y install mariadb
mysql -uadmin -padmin -P6032 -h127.0.0.1

在这里插入图片描述

三、proxysql管理配置

3.1 内置库

库名作用备注
main最重要的库,是一个内存数据库系统。
用于存放后端db实例、用户认证、路由规则等信息。
修改main库中的配置后,必须将其持久化到disk上才能永久保存。
disk磁盘数据库,该数据库结构和内存数据库完全一致。
当持久化内存数据库中的配置时,其实就是写入到disk库中。
磁盘数据库的默认路径为 $DATADIR/proxysql.db
stats统计信息库。包括到后端各命令的执行次数、流量、processlist、查询各类汇总、执行时间等。这个库中的数据一般是在检索其内数据时临时填充的,它保存在内存中。<>br因为没有相关的配置项,所以无需持久化
monitor是监控后端MySQL节点相关的库,主要是对后端db的健康、延迟检查。该库中只有几个log类的表,
监控模块收集到的监控信息全都存放到对应的log表中
stats_history是1.4.4版新增的库,用于存放历史统计数据。默认路径为 $DATADIR/proxysql_stats.db

3.1.1 main库表

表名作用
runtime_global_variablesglobal_variables的运行时版本
runtime_mysql_group_replication_hostgroupsmysql_group_replication_hostgroups的运行时版本
runtime_mysql_query_rulesmysql_query_rules的运行时版本
runtime_mysql_replication_hostgroupsmysql_replication_hostsgroups的运行时版本
runtime_mysql_serversmysql_servers的运行时版本
runtime_mysql_usersmysql_users的运行时版本
runtime_schedulerscheduler调度程序的运行时版本
mysql_replication_hostgroups定义hostgroup的主从关系。
mysql_server表字段释义
hostgroup_idProxySQL通过hostgroup的形式组织后端db实例,一个hostgroup代表同属于一个角色。
表的主键是(hostgroup_id, hostname, port),以hostname:port在多个hostgroup中存在。
一个hostgroup可以有多个实例,即是多个从库,可能通过weight分配权重。
hostgroup_id 0是一个特殊的hostgroup,路由查询的时候,没有匹配到规则则默认选择hostgroup 0。
statusONLINE:当前后端实例状态正常。
SHUNNED:临时被剔除,可能因为后端too many connection error,或者超过了max_replication_lag。
OFFLINE_SOFT:软离线状态,不再接受新的连接,但已建立的连接会等待活跃事务完成。
OFFLINE_HARD:硬离线状态,不再接受新的连接,已建立的连接或被强制中断,当后端实例宕机或网络不可达,会出现。
max_connections允许连接到该后端实例的最大连接数,不能大于MySQL的max_connections。
如果后端实例hostname:port在多个hostgroup里,以较大者为准,而不是各自独立允许的最大连接数。
max_replication_lag允许的最大延迟,主库不受影响,默认为0。
如果>0,monitor模块监控主从延迟大于阈值时,会临时把它的状态变更为SHUNNED。
max_latency_msmysql_ping响应时间,大于这个阈值会把它从连接池剔除,即使是ONLINE。
comment备注,不建设为空。
mysql_users表字段释义
username、password连接到后端MySQL或ProxySQL实例的凭证,参考密码管理。
密码可插入明文,也可通过PASSWORD()插入密文,proxysql以*开头判断插入是否是密文。
但是runtime_mysql_users里统一是密文,所以明文插入,再SAVE MYSQL USERS TO MEM,此时看到的也是HASH密文。
active是否生效该用户,active=0的用户将在数据库中被跟踪,但不会加载到内存中的数据结构中。
default_hostgroup这个用户的请求没有匹配到规则时,默认发到hostgroup,默认0。
default_schema这个用户连接时没有指定schema时,默认使用的schema。
默认为NULL,实际上受变量mysql-default_schema的影响,默认为information_schema。
transaction_persistent如果设置为1,连接上ProxySQL的会话后,若在一个hostgroup上开启了事务,那么后续的sql都继续维持在这个hostgroup上,不论是否会匹配上其它路由规则,直到事务结束。
frontend如果设置为1,则用户名、密码对ProxySQL进行身份验证。
backend如果设置为1,则用户名、密码根据任何主机组向mysqld服务器进行身份验证。
mysql_query_rules查询规则表释义
rule_id表主键,自增,规则处理是以rule_id为顺序进行。
active只有active=1时的规则才会参与匹配。
username过滤匹配用户名的条件,如果是非空值,则仅当连接使用正确的用户名时,查询才匹配。
schemaname匹配schemaname的过滤条件,如果是非空值,则仅当连接schemaname用作默认模式时,查询才匹配。
flagIN,flagOUT,apply用来定义路由链chains of rules。
首先会检查flagIN=0的规则,以rule_id的顺序;如果没有匹配上,则走这个用户的default_hostgroup。
当匹配一条规则后,会检查flagOUT。
如果不为NULL,并且flagIN!=flagOUT,则进入以flagIN为上一个flagOUT值的新规则链。
如果不为NULL,并且flagIN=flagOUT,则应用这条规则。
如果为NULL,或者apply=1,则结束,应用这条规则。
如果最终没有匹配到,则找到这个用户的default_hostgroup。
client_addr匹配客户端来源IP。
proxy_addr,proxy_port匹配本地proxysql的ip、端口。
digest精确匹配的查询。
match_digest正则匹配查询。query,digest是指对查询去掉具体值后进行”模糊化“后的查询,类似pt-query-digest的效果。
match_pattern正则匹配查询。
negate_match_pattern反向匹配,相当于对match_digest/match_pattern的匹配取反。
re_modifiers修改正则匹配的参数,比如默认的:忽略大小写CASELESS、禁用GLOBAL。
replace_pattern查询重写,默认为空。
destination_hostgroup路由查询到这个hostgroup,当然如果用户显式start transaction且transaction_persistent=1,
那么即使匹配到了,也依然按照事务里第一条sql的路由规则去走的。
cache_ttl查询结果缓存的毫秒数。
timeout这一类查询执行的的最大时间(毫秒),超时则自动kill。后端DB的保护机制
retries语句在执行失败时,重试次数。默认由mysql-query_retries_on_failure变量指定,为1。建议不要重试,有风险。
delay查询延迟执行,这是ProxySQL提供的限流机制,会让其它的查询优先执行。
默认值mysql-default_query_delay为0。
mirror_flagOUT,mirror_hostgroup与镜像相关的设置。
error_msg默认为NULL,如果指定了则这个查询直接被block掉,将error_msg返回给客户端。
multiplex连接是否利用,请参考文章。
log是否记录查询日志,可以看到log是否记录的对象是根据规则。
scheduler调度表释义
id调度程序作业的唯一标识符。
active如果设置为1,则作业处于活动状态。
interval_ms工作的开始频率(以毫秒为单位),最小interval_ms为100毫秒
filename可执行文件的完整路径。
arg1-arg5传递作业的参数。最多5个。
comment注释。

3.1.2 stats库表

stats_mysql_commands_counters表释义
command已执行的SQL命令的类型,如FLUSH、INSERT、KILL、SELECT FOR UPDATE等。
Total_Time_us执行该类型命令的总时间(以毫秒为单位)。
Total_cnt执行该类型的命令的总数。
cnt_100us-cnt_INFs在指定的时间限制内执行的给定类型的命令总数和前一个命令的总数。
stats_mysql_connection_pool表释义
hostgroup后端服务器所属的主机组,单个后端服务器可以属于多个主机组。
srv_host,srv_portmysqld后端服务器正在侦听连接的TCP端点的IP和Port。
status后端服务器的状态。可以有ONLINE,SHUNNED,OFFLINE_SOFT,OFFLINE_HARD。
ConnUsedProxySQL当前使用多少个连接来向后端服务器发送查询。
ConnFree目前有多少个连接是空闲。
ConnOK成功建立了多少个连接。
ConnERR没有成功建立多少个连接。
Queries路由到此特定后端服务器的查询数。
Bytes_data_sent发送到后端的数据量。
Bytes_data_recv从后端接收的数据量。
Latency_ms从Monitor报告的当前ping以毫秒为单位的延迟时间。
stats_mysql_global表释义
Variable_Name代表与MySQL相关的代理级别的全局统计。
如Client_Connections_aborted:由于无效凭据或max_connections而导致的前端连接数已达到。
如Client_Connections_connected:当前连接的前端连接数。
如Client_Connections_created:到目前为止创建的前端连接数。等等。
Variable_Value统计所对应的值。
stats_mysql_processlist表释义
ThreadIDProxySQL线程的内部ID。
SessionIDProxySQL会话ID,通过这个ID可以进行kill操作。
user与MySQL客户端连接到ProxySQL的用户。
db当前选择的数据库。
cli_host,cli_port连接ProxySQL的IP和TCP端口。
hostgroup当前主机组。如果正在处理查询,则是查询已被路由或将要路由的主机组,或默认主机组。
可以通过这个查看该SQL到底是到哪个HG里。
l_srv_host,l_srv_portProxySQL的IP和TCP端口。
srv_host,srv_port后端MySQL服务器的IP和端口。
command正在执行的MySQL查询的类型。
time_ms命令执行的时间(以毫秒为单位)。
info正在执行的SQL。
stats_mysql_query_digest表释义
hostgroup发送查询的主机组。值-1表示查询查询缓存。
schemaname查询的数据库。
user连接ProxySQL的用户名。
digest一个十六进制散列,表示其参数剥离的SQL。
digest_text参数剥离的实际SQL文本
count_star执行查询的总次数(参数的值不同)。
first_seenunix时间戳,是通过代理路由查询的第一时刻。
last_seenunix时间戳,当查询通过代理路由时的最后一刻(到目前为止)。
sum_time执行此类查询的总时间(以微秒为单位)。
min_time,max_time -执行此类查询时期望的持续时间范围。
min_time是到目前为止所看到的最小执行时间。
max_time表示最大执行时间,以微秒为单位。
stats_mysql_query_rules表释义
rule_id路由规则的ID与main.mysql_query_rules的id对应。
hits此路由规则的匹配总数。 如果当前传入的查询符合规则,则会记录一次命中。

3.1.3 monitor库

表名作用
mysql_server_connect/mysql_server_connect_log连接到所有MySQL服务器以检查它们是否可用,该表用来存放检测连接的日志。
由变量mysql-monitor_connect_interval来控制其检测的时间间隔,
由参数mysql-monitor_connect_timeout控制连接是否超时(默认200毫秒)。
mysql_server_ping/mysql_server_ping_log使用mysql_ping API ping后端MySQL服务器检查它们是否可用,该表用来存放ping的日志。
由变量mysql-monitor_ping_interval控制ping的时间间隔,默认值:10000(毫秒,相当于10秒)。
mysql_server_replication_lag_log后端MySQL服务主从延迟的检测。
由参数mysql-monitor_replication_lag_interval控制检测间隔时间, 如果复制滞后太大,可以暂时关闭从。
由mysql_servers.max_replication_lag列控制。默认值:10000(毫秒,相当于10秒)。

3.2 常用管理变量

3.2.1 添加管理用户

1.连接本地proxysql,查看当前用户密码。

mysql -uadmin -padmin -P6032 -h127.0.0.1
select @@admin-admin_credentials;

2.添加新管理员帐户qingjun/citms。

set admin-admin_credentials='admin:admin;qingjun:citms';

//刷新,保存到磁盘。
load admin variables to runtime;
save admin variables to disk;

3.其他服务器连接prosysql。

mysql -uqingjun -pcitms -P6032 -h192.168.161.129

在这里插入图片描述
4.查看proxysql用户表。

//根据表的字段来查看,与mysql语法相同。
select * from global_variables where variable_name='admin-admin_credentials';  


//根据proxysql语法查看。
select @@admin-admin_credentials;

在这里插入图片描述

3.2.2 添加普通用户

1.只能查看到monitor、main库的内容。

mysql -ustats -pstats -P6032 -h127.0.0.1

在这里插入图片描述
2.设置远程连接用户。

set admin-stats_credentials='stats:stats;baimu:123456'; 
load admin variables to runtime;
save admin variables to disk;

在这里插入图片描述
3.使用远程用户在其他机器上登录proxysql。

mysql -ubaimu -p123456 -h192.168.161.129 -P6032

在这里插入图片描述

3.2.3 修改监听套接字

1.默认的监听套接字是0.0.0.0:6032。

select @@admin-mysql_ifaces;

在这里插入图片描述
2.修改监听端口。

//修改监听端口为8888,之后连接proxysql就是用8888连接。
set admin-mysql_ifaces='0.0.0.0:8888';
load admin variables to runtime;
save admin variables to disk;

在这里插入图片描述
3.去除-h参数登录。

//创建默认套接字存放目录。
mkdir /var/lib/mysql/
chown -R proxysql.proxysql /var/lib/mysql/


//使用管理员用户修改。
mysql -uadmin -padmin -P8888 -h127.0.0.1
set admin-mysql_ifaces='0.0.0.0:8888;/var/lib/mysql/mysql.sock'; 
load admin variables to runtime;
save admin variables to disk;

在这里插入图片描述

四、多层配置系统

4.1 系统结构

       +-------------------------+
       |         RUNTIME         |
       +-------------------------+
              /|\          |
               |           |
           [1] |       [2] |
               |          \|/
       +-------------------------+
       |         MEMORY          |
       +-------------------------+ _
              /|\          |      |\
               |           |        \
           [3] |       [4] |         \ [5]
               |          \|/         \
       +-------------------------+  +---------------+
       |          DISK           |  |  CONFIG FILE  |
       +-------------------------+  +---------------+


序号[1] :将内存数据库中的配置加载到RUNTIME数据结构中
          LOAD XXX FROM MEMORY
          LOAD XXX TO RUNTIME  (常用)

序号[2] :将RUNTIME数据结构中的配置持久化到内存数据库中
          SAVE XXX FROM RUNTIME
          SAVE XXX TO MEMORY
  
序号[3] :将磁盘数据库中的配置加载到内存数据库中
          LOAD XXX FROM DISK
          LOAD XXX TO MEMORY

序号[4] :将内存数据库中的配置持久化到磁盘数据库中
          SAVE XXX FROM MEMORY
          SAVE XXX TO DISK (常用)

序号[5] :从传统配置文件中读取配置加载到内存数据库中
          LOAD XXX FROM CONFIG


XXX表示要加载、保存的是哪类配置,目前支持一下几类:
1.mysql users
2.mysql servers
3.mysql variables
4.mysql query rules
5.admin variables
6.scheduler
7.proxysql_servers:目前ProxySQL集群功能还处于实验阶段,所以该类配置不应该去使用

4.2 修改变量加载配置

MySQL [(none)]> show tables from disk;
+------------------------------------+
| tables                             |
+------------------------------------+
| global_variables                   |  # (1)
| mysql_collations                   |  # (N)
| mysql_group_replication_hostgroups |  # (2)
| mysql_query_rules                  |  # (3)
| mysql_query_rules_fast_routing     |  # (4)
| mysql_replication_hostgroups       |  # (5)
| mysql_servers                      |  # (6)
| mysql_users                        |  # (7)
| proxysql_servers                   |  # (8)
| scheduler                          |  # (9)
+------------------------------------+


(1)中包含两类变量,以amdin-开头的使用admin variables修改;以mysql-开头的使用mysql variables修改。
(2,5,6)使用mysql servers修改。
(3,4)使用mysql query rules修改。
(7)使用mysql users修改。
(9)使用scheduler修改。
(N)只是一张表,保存的是ProxySQL支持的字符集和排序规则,它是不用修改的
(8)是ProxySQL的集群配置表,该功能目前还处于实验阶段。如果想要配置该功能,则load/save proxysql_servers to/from ...

4.3 启动加载流程

1.proxysql服务已启动,已生成在proxysql.db文件,连接mysql服务器的端口是默认的6033。


2.将proxysql.db删除或移走,修改主配置文件,重启服务,6033变成3306

mv /var/lib/proxysql/proxysql.db  /opt/
vim /etc/proxysql.cnf 
......
interfaces="0.0.0.0:3306"    //将6033修改成3306

systemctl restart proxysql

在这里插入图片描述
3.此时不移走proxysql.db文件,在修改主配置文件该参数为3307,重启服务,发现依然是3306。是因为此时读取的是proxysql.db文件里的参数配置。

vim /etc/proxysql.cnf 
......
interfaces="0.0.0.0:3307"    //将3306改成3307

systemctl restart proxysql

在这里插入图片描述

举报

相关推荐

0 条评论