MySql

ProxySQL管理专题

2021-10-07  本文已影响0人  这货不是王马勺

管理参考:
https://www.cnblogs.com/kevingrace/p/10329714.html
https://www.dazhuanlan.com/singlezeus/topics/959248
https://www.cnblogs.com/f-ck-need-u/p/9300829.html

一.ProxySQL多层管理

1.ProxySQL多层管理配置

(有三层配置)

2.ProxySQL配置系统分为三层的目的

  1. 自动更新;
  2. 尽可能的不重启proxysql就可以修改配置;
  3. 方便回滚错误配置;
    简单说就是配置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",达到加载配置或者持久化配置的目的。

3.每层的功能与含义

4.总结

  1. ProxySQL每一个配置项在三层中都存在,但是这三层是互相独立的,也就是说proxysql可以同时拥有三份配置,每层都是独立的,可能三份配置都不一样,也可能三份都一样。
  2. RUNTIME层代表 ProxySQL 当前生效的正在使用的配置,无法直接修改这里的配置,必须要从下一层 "load" 进来。
  3. MEMORY这一层上面连接 RUNTIME 层,下面连接持久化层。在这层可以正常操作 ProxySQL 配置,随便修改,不会影响生产环境。修改一个配置一般都是先在 MEMORY 层完成,然后确认正常之后再加载到 RUNTIME 和持久化到磁盘上。
  4. DISK 和 CONFIG FILE层持久化配置信息,重启后内存中的配置信息会丢失,所以需要将配置信息保留在磁盘中。重启时,可以从磁盘快速加载回来。

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

二.ProxySQL的库说明

1.ProxySQL库概述

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

2.main库和disk库常用表

(disk库的表字段和main一样,只是对应了不同层级)

3.stats库常用表

4.monitor库常用表

三.常用表说明

1.mysql_servers

2.mysql_users

3.mysql_replication_hostgroups

定义 hostgroup 的主从关系。ProxySQL monitor 模块会监控 HG 后端所有servers 的 read_only 变量,如果发现从库的 read_only 变为0、主库变为1,则认为角色互换了,自动改写 mysql_servers 表里面 hostgroup 关系,达到自动 Failover 效果。
注:ProxySQL配置后端DB server两种方式

  1. 一种是在往mysql_servers表中添加server时就为其划分好hostgroup_id(例如0表示写组,1表示读组)
  2. 另一种往mysql_servers表中添加server时不区分hostgroup_id(例如全部设为0),然后通过mysql_replication_hostgroups表中的值,
    根据proxysql检测到的各server的read_only变量值来自动为后端server设置hostgroup_id
    这里推荐用第一种方式,因为第一种是完全由我们控制的;而第二种假如我们误将读server的read_only属性设置为0,则proxysql会将其重新分配到写组,这绝对是不期望的。

4.mysql_query_rules

mysql_query_rules 是ProxySQL非常核心一个表,定义查询路由规则

问题汇总

【问题1】

spring用jdbc实现事务时会set autocommit = 0; 加入一个session中开头是select关键字,则整个session的内容都会被路由到只读组,导致session中的其他增删改的DML回滚。
之前在github上看到过一个问题:https://github.com/sysown/proxysql/issues/1256
和我遇到的问题极其相似,SQL如下:

set autocommit = 0;
select version from t where version = xx;
delete from t where version = xx;
commit;

另外mysql-forward_autocommit 已经设置为 1,
(变量释义参考官网:https://proxysql.com/documentation/global-variables/mysql-variables/
在 mysql_users 表中该用户transaction_persistent值为 1 ( transaction_persistent: 如果设置为1,连接上ProxySQL的会话后,如果在一个hostgroup上开启了事务,那么后续的sql都继续维持在这个hostgroup上,无论是否会匹配上其它路由规则,直到事务结束。)

下面回复表示:
“autocommit=0不会启动事务,因此proxysql“不将autocommit=0视为事务”在技术上是正确的,因为还没有事务。”
新版本中添加了新变量mysql-autocommit_false_is_transaction,如果设置成true(默认为false),则autocommit=0的连接将被视为事务。如果forward_autocommit=true(默认为false),则同样的行为也适用。

但是在我的测试中,mysql-autocommit_false_is_transaction和forward_autocommit均设置为true,且load mysql variables to runtime时,对jdbc的set autocommit = 0仍然不起效果,仍然被路由到只读组。

到官网查看了相关变量的具体释义(图省事机翻):
【mysql-autocommit_false_is_transaction】
如果mysql-autocommit_false_is_transaction=true(默认为false),则autocommit=0的连接将被视为事务,并且不会返回到连接池。也就是说,autocommit=0将禁用多路复用。
请注意,autocommit=0不足以启动事务:在数据库级别,当对事务表执行查询时,事务将启动。
建议不要更改此变量。
【mysql-forward_autocommit】
当mysql-forward_autocommit=false(默认值)时,ProxySQL将跟踪(并记住)客户端需要的autocommit值,并根据需要更改后端连接上的autocommit。例如,如果客户机发送set autocommit=0,ProxySQL将只回复OK。当客户端发送DDL时,ProxySQL将获得到目标主机组的连接,并在运行DDL之前更改自动提交。
如果mysql-forward_autocommit=true,则将SET autocommit=0转发到后端。SET autocommit=0不会启动任何事务,连接是在连接池中设置的,查询可能会在不同的连接上执行。如果设置mysql-forward_autocommit=true,那么还应该设置mysql-autocommit_false_not_reusible=true,以防止连接返回到连接池。换句话说,设置mysql-forward_autocommit=false将防止这种行为,因为自动提交状态是跟踪的。
【mysql-autocommit_false_not_reusible】
当设置为true时,autocommit=0的连接不会被重新使用,并且在连接返回到连接池时会被销毁。
建议不要更改此变量。

下一步准备测试mysql_user表中transaction_persistent置为0,mysql-forward_autocommit=true,mysql-autocommit_false_not_reusable=true,且可以尝试mysql_query_rules中按flagin和flagout设置规则链,看看这种情况下是否可以达到目的。
2021-10-09更新:目前按此设置可以正常转发,测试成功。
但这也引发一个问题,就是start transaction开启的事务也会被拆分,导致事务回滚。因此set autocommit = 0 和正常开启事务能否实现共存,目前还没有找到完全的解决办法。

【问题2】

在mysql存储过程中,定义了输入输出参数的情况下,OUTPUT的参数无法返回给应用,经查找stats_mysql_query_digest中的记录发现了问题:


SQL记录

其中call调用存错过程被分到了写组,而OUTPUT参数返回给了读组。
目前将mysql_query_rules增加了一条^select @开头的被分配到写组,有待进一步验证。

【问题3】

应用端返回报错,got a packet bigger than 'max_allowed_packet' bytes
而我检查了mysql端的对应参数,max_allowed_packet我设置了64M,理论上是够用的;于是联想到是否和用户验证一样,在proxySQL层也做了一次过滤,转而查看proxySQL是否有相关参数做了二次限制:
发现果然有mysql-max_allowed_packet这个参数,将此参数设置为64M后问题解决。

【问题4】

应用端返回报错,查看stats_mysql_query_digest发现实现事务如果用了start transaction时,将transaction_persistent置为0,会事务中的语句分散,导致回滚;因此需要改为1

附默认global variables值

MySQL [main]> select * from global_variables;
+-----------------------------------------------------+---------------------------+
| variable_name                                       | variable_value            |
+-----------------------------------------------------+---------------------------+
| mysql-shun_on_failures                              | 5                         |
| mysql-shun_recovery_time_sec                        | 10                        |
| mysql-query_retries_on_failure                      | 1                         |
| mysql-connect_retries_delay                         | 1                         |
| mysql-connection_delay_multiplex_ms                 | 0                         |
| mysql-connection_max_age_ms                         | 0                         |
| mysql-connect_timeout_server_max                    | 10000                     |
| mysql-eventslog_filename                            |                           |
| mysql-eventslog_filesize                            | 104857600                 |
| mysql-default_charset                               | utf8                      |
| mysql-free_connections_pct                          | 10                        |
| mysql-session_idle_ms                               | 1000                      |
| mysql-client_found_rows                             | true                      |
| mysql-monitor_enabled                               | true                      |
| mysql-monitor_connect_timeout                       | 600                       |
| mysql-monitor_ping_max_failures                     | 3                         |
| mysql-monitor_ping_timeout                          | 1000                      |
| mysql-monitor_read_only_max_timeout_count           | 3                         |
| mysql-monitor_replication_lag_interval              | 10000                     |
| mysql-monitor_replication_lag_timeout               | 1000                      |
| mysql-monitor_groupreplication_healthcheck_interval | 5000                      |
| mysql-monitor_groupreplication_healthcheck_timeout  | 800                       |
| mysql-monitor_replication_lag_use_percona_heartbeat |                           |
| mysql-monitor_query_interval                        | 60000                     |
| mysql-monitor_query_timeout                         | 100                       |
| mysql-monitor_slave_lag_when_null                   | 60                        |
| mysql-monitor_wait_timeout                          | true                      |
| mysql-monitor_writer_is_also_reader                 | true                      |
| mysql-max_allowed_packet                            | 4194304                   |
| mysql-throttle_connections_per_sec_to_hostgroup     | 1000000                   |
| mysql-max_transaction_time                          | 14400000                  |
| mysql-multiplexing                                  | true                      |
| mysql-forward_autocommit                            | false                     |
| mysql-enforce_autocommit_on_reads                   | false                     |
| mysql-autocommit_false_not_reusable                 | false                     |
| mysql-autocommit_false_is_transaction               | false                     |
| mysql-verbose_query_error                           | false                     |
| mysql-hostgroup_manager_verbose                     | 1                         |
| mysql-threshold_query_length                        | 524288                    |
| mysql-threshold_resultset_size                      | 4194304                   |
| mysql-query_digests_max_digest_length               | 2048                      |
| mysql-query_digests_max_query_length                | 65000                     |
| mysql-wait_timeout                                  | 28800000                  |
| mysql-throttle_max_bytes_per_second_to_client       | 2147483647                |
| mysql-throttle_ratio_server_to_client               | 0                         |
| mysql-max_stmts_per_connection                      | 20                        |
| mysql-max_stmts_cache                               | 10000                     |
| mysql-mirror_max_concurrency                        | 16                        |
| mysql-mirror_max_queue_length                       | 32000                     |
| mysql-default_max_latency_ms                        | 1000                      |
| mysql-query_processor_iterations                    | 0                         |
| mysql-query_processor_regex                         | 1                         |
| mysql-long_query_time                               | 1000                      |
| mysql-query_cache_size_MB                           | 256                       |
| mysql-poll_timeout_on_failure                       | 100                       |
| mysql-server_capabilities                           | 45578                     |
| mysql-session_idle_show_processlist                 | true                      |
| mysql-query_digests                                 | true                      |
| mysql-query_digests_lowercase                       | false                     |
| mysql-servers_stats                                 | true                      |
| mysql-default_reconnect                             | true                      |
| mysql-ssl_p2s_ca                                    |                           |
| mysql-ssl_p2s_cert                                  |                           |
| mysql-ssl_p2s_key                                   |                           |
| mysql-ssl_p2s_cipher                                |                           |
| mysql-init_connect                                  |                           |
| mysql-default_sql_mode                              |                           |
| mysql-default_time_zone                             | SYSTEM                    |
| mysql-connpoll_reset_queue_length                   | 50                        |
| mysql-stats_time_backend_query                      | false                     |
| mysql-stats_time_query_processor                    | false                     |
| mysql-threads                                       | 4                         |
| mysql-max_connections                               | 2048                      |
| mysql-default_query_delay                           | 0                         |
| mysql-default_query_timeout                         | 36000000                  |
| mysql-have_compress                                 | true                      |
| mysql-poll_timeout                                  | 2000                      |
| mysql-interfaces                                    | 0.0.0.0:6033              |
| mysql-default_schema                                | information_schema        |
| mysql-stacksize                                     | 1048576                   |
| mysql-server_version                                | 5.5.30                    |
| mysql-connect_timeout_server                        | 3000                      |
| mysql-monitor_username                              | proxysql                  |
| mysql-monitor_password                              | proxysql                  |
| mysql-monitor_history                               | 600000                    |
| mysql-monitor_connect_interval                      | 60000                     |
| mysql-monitor_ping_interval                         | 10000                     |
| mysql-monitor_read_only_interval                    | 1500                      |
| mysql-monitor_read_only_timeout                     | 500                       |
| mysql-ping_interval_server_msec                     | 120000                    |
| mysql-ping_timeout_server                           | 500                       |
| mysql-commands_stats                                | true                      |
| mysql-sessions_sort                                 | true                      |
| mysql-connect_retries_on_failure                    | 10                        |
| admin-stats_credentials                             | stats:stats               |
| admin-stats_mysql_connections                       | 60                        |
| admin-stats_mysql_connection_pool                   | 60                        |
| admin-stats_mysql_query_cache                       | 60                        |
| admin-stats_system_cpu                              | 60                        |
| admin-stats_system_memory                           | 60                        |
| admin-telnet_admin_ifaces                           | (null)                    |
| admin-telnet_stats_ifaces                           | (null)                    |
| admin-refresh_interval                              | 2000                      |
| admin-read_only                                     | false                     |
| admin-hash_passwords                                | true                      |
| admin-cluster_username                              |                           |
| admin-cluster_password                              |                           |
| admin-cluster_check_interval_ms                     | 1000                      |
| admin-cluster_check_status_frequency                | 10                        |
| admin-cluster_mysql_query_rules_diffs_before_sync   | 3                         |
| admin-cluster_mysql_servers_diffs_before_sync       | 3                         |
| admin-cluster_mysql_users_diffs_before_sync         | 3                         |
| admin-cluster_proxysql_servers_diffs_before_sync    | 3                         |
| admin-cluster_mysql_query_rules_save_to_disk        | true                      |
| admin-cluster_mysql_servers_save_to_disk            | true                      |
| admin-cluster_mysql_users_save_to_disk              | true                      |
| admin-cluster_proxysql_servers_save_to_disk         | true                      |
| admin-checksum_mysql_query_rules                    | true                      |
| admin-checksum_mysql_servers                        | true                      |
| admin-checksum_mysql_users                          | true                      |
| admin-web_enabled                                   | false                     |
| admin-web_port                                      | 6080                      |
| admin-admin_credentials                             | admin:admin|
| admin-mysql_ifaces                                  | 0.0.0.0:6032              |
| admin-version                                       | 1.4.8-32-g669c149         |
+-----------------------------------------------------+---------------------------+
125 rows in set (0.003 sec)

详述:
https://baijiahao.baidu.com/s?id=1675243033575644586&wfr=spider&for=pc

上一篇下一篇

猜你喜欢

热点阅读