1.ProxySQL Error: connection is locked to hostgroup 2 but trying to reach hostgroup 1

解决方案:登上proxysql的管理端执行以下命令

set mysql-set_query_lock_on_hostgroup=0;

#修改后,需要加载到RUNTIME,并保存到disk
load mysql variables to runtime;
save mysql variables to disk; # 也可以在安装后尚未启动时修改配置文件,增加上这个参数:
mysql_variables=
{
......
set_query_lock_on_hostgroup=0
}

2.java.sql.SQLException: Unknown system variable query_cache_size

解决方案:proxysql 2.4.1版本目前内置的mysql版本也才是5.5.30的,所以如果你的数据库是8.0及以上的,一定要记得修改proxysql内置mysql的版本号,登上proxysql的管理端执行以下命令

update global_variables set variable_value="8.0.29" where variable_name='mysql-server_version';

#修改后,需要加载到RUNTIME,并保存到disk
load mysql variables to runtime;
save mysql variables to disk; # 也可以在安装后尚未启动时修改配置文件,更新这个参数:
mysql_variables=
{
......
server_version="8.0.29"
}

3.配置文件中添加如下参数,启动失败,报语法错误

mysql_variables=
{
......
default_charset='utf8mb4'
default_collation_connection='utf8mb4_general_ci'
} 5月 25 17:28:45 k8s-develop-manager systemd[1]: Starting High Performance Advanced Proxy for MySQL...
5月 25 17:28:45 k8s-develop-manager proxysql[14792]: Parse error at /etc/proxysql.cnf:87 - syntax error
5月 25 17:28:45 k8s-develop-manager systemd[1]: proxysql.service: control process exited, code=exited status=1
5月 25 17:28:45 k8s-develop-manager systemd[1]: Failed to start High Performance Advanced Proxy for MySQL.
5月 25 17:28:45 k8s-develop-manager systemd[1]: Unit proxysql.service entered failed state.
5月 25 17:28:45 k8s-develop-manager systemd[1]: proxysql.service failed.

解决办法:

这俩变量的值默认是
mysql> select * from global_variables;
+----------------------------------------------------------------------+--------------------------------------------+
| variable_name | variable_value |
+----------------------------------------------------------------------+--------------------------------------------+
| mysql-default_charset | utf8 |
| mysql-default_collation_connection | utf8_general_ci | 启动之前配置文件中先不添加的,等程序启动后,手动修改 set mysql-default_charset='utf8mb4';
set mysql-default_collation_connection='utf8mb4_general_ci'; load mysql variables to runtime;
save mysql variables to disk; mysql> select * from global_variables;
+----------------------------------------------------------------------+--------------------------------------------+
| variable_name | variable_value |
+----------------------------------------------------------------------+--------------------------------------------+
| mysql-default_charset | utf8mb4 |
| mysql-default_collation_connection | utf8mb4_general_ci |

4.查看proxySQL ping日志,发现监控账户连接数据库失败,报错如下:

mysql> select * from mysql_server_ping_log;
+---------------+------+------------------+----------------------+---------------------------------------------------------------------------------------------------------------------------+
| hostname | port | time_start_us | ping_success_time_us | ping_error |
+---------------+------+------------------+----------------------+---------------------------------------------------------------------------------------------------------------------------+
| 192.168.0.218 | 3306 | 1653471251681522 | 0 | Aborted connection 2616 to db: 'unconnected' user: 'proxysql_monitor' host: '192.168.0.218' (init_connect command failed) |
| 192.168.0.36 | 3306 | 1653471251826419 | 0 | Aborted connection 429 to db: 'unconnected' user: 'proxysql_monitor' host: '192.168.0.218' (init_connect command failed) |

解决方案:

根据报错信息:init_connect command failed进行排查,发现是后端MySQL数据库配置文件中有个参数:init_connect=’SET NAMES utf8mb4’,使用的单引号符号不对才导致连接报错的
修改该参数配置为:init_connect='SET NAMES utf8mb4',重启MySQL,proxySQL ping日志就不会再报错了

自动回避复制延迟较大的节点

查看proxysql运行日志,会有如下信息

2022-05-27 15:53:41 MySQL_Monitor.cpp:2375:monitor_replication_lag_thread(): [ERROR] Replication lag on server 192.168.20.200:3306 is NULL, using the value 60 (mysql-monitor_slave_lag_when_null)

原因分析:

proxyql的mysql_servers表中设置了主库max_replication_lag的值,但是主库中没有show slave status中的Seconds_Behind_Master字段值,因此会报主库拖后腿,其实主库不需要设置max_replication_lag的值

Monitor模块会监控后端主机组中各slave的数据是否延迟于master,这个延迟行为称为replication lag,俗称拖后腿。

如果某个slave节点上的数据比master落后很多(临界值见下文),表示这个slave节点处理速度慢,数据较旧。ProxySQL采用一种称为自动避开(automatic shunned)的方式,临时避开这个落后的节点。当ProxySQL避开某节点后,ProxySQL不会把SQL语句路由给这个节点。

ProxySQL有几种情况可能会触发自动避开节点的行为:

  • 和后端的连接断开。
  • slave落后于master过多。
  • 和后端建立连接时,错误次数过多。
  • second_behind_master=null时,即slave的SQL线程未运行,或者slave未连接到master。(不过这种自动避开的情况是可控的,见全局变量mysql-monitor_slave_lag_when_null)

Monitor模块会每隔一段时间(mysql-monitor_replication_lag_interval)去检查一次拖后腿情况,检测的方式是获取show slave status中的Seconds_Behind_Master字段值,然后和mysql_servers表中max_replication_lag字段的值比较:

mysql> select * from global_variables where variable_name like 'mysql-monitor%lag%';
+-----------------------------------------------------+----------------+
| variable_name | variable_value |
+-----------------------------------------------------+----------------+
| mysql-monitor_replication_lag_group_by_host | false |
| mysql-monitor_replication_lag_interval | 10000 |
| mysql-monitor_replication_lag_timeout | 1000 |
| mysql-monitor_replication_lag_count | 1 |
| mysql-monitor_replication_lag_use_percona_heartbeat | |
| mysql-monitor_slave_lag_when_null | 60 |
+-----------------------------------------------------+----------------+
6 rows in set (0.01 sec)
  • Seconds_Behind_Master < max_replication_lag:表示落后程度尚在允许范围内。
  • Seconds_Behind_Master > max_replication_lag:表示落后太多,这样的节点应该避开。

只有传统复制结构的slave节点才需要设置max_replication_lag字段,master无需设置,组复制和galera也无需设置,因为这两种复制结构中show slave status的结果为空。例如,将读组中的所有节点都设置最多落后于master 10秒钟。

update mysql_servers set max_replication_lag=10 where hostgroup_id=20 and hostname="192.168.20.201"; # 确保条件限定从库
load mysql servers to runtime;
save mysql servers to disk; select hostgroup_id,hostname,port,max_replication_lag from mysql_servers;

需要注意的是,Seconds_Behind_Master的值并不总是可靠的,见 https://dev.mysql.com/doc/refman/5.7/en/show-slave-status.html

意思是说主从数据库中,从库执行命令:show slave status的结果中有个参数:Seconds_Behind_Master

proxysql中mysql_servers表中有个字段max_replication_lag,这俩值相比较。

监控模块负责对后端进行一系列检查。它目前支持 4 种类型的检查:

1)connect ==> 它连接到所有后端 MySQL 服务,成功 / 失败将记录在表 mysql_server_connect_log 中;

2)ping ==> 它 ping 到所有后端的 MySQL 服务,并在表 mysql_server_ping_log 中记录成功 / 失败。如果丢失心跳的次数超过 mysql-monitor_ping_max_failures 值,则向 MySQL_Hostgroups_Manager 发送信号以终止所有连接;

3)replication lag ==> 它将检查配置了 max_replication_lag 大于 0 的所有后端 MySQL 的 Seconds_Behind_Master 值,并将检查结果记录在表 mysql_server_replication_lag_log 中。如果 Seconds_Behind_Master > max_replication_lag 则服务器被忽略,直到 Seconds_Behind_Master < max_replication_lag;

4)read only ==> 它检查表 mysql_replication_hostgroups 内记录的主机组中所有主机的 read_only 参数值,并将检查结果在记录表 mysql_server_read_only_log 中。

解决办法:

1.上述报错是因为主库也设置了max_replication_lag的值,更新为0。

2.修改proxysql中mysql_servers表中的从库Mmax_replication_lag的值为10.

最终效果

mysql> select hostgroup_id,hostname,port,max_replication_lag from mysql_servers;
+--------------+----------------+------+---------------------+
| hostgroup_id | hostname | port | max_replication_lag |
+--------------+----------------+------+---------------------+
| 100 | 192.168.20.200 | 3306 | 0 | # 主库
| 1000 | 192.168.20.201 | 3306 | 60 | # 从库
| 1000 | 192.168.20.200 | 3306 | 0 | # 主库
+--------------+----------------+------+---------------------+
3 rows in set (0.00 sec)

ProxySQL 使用情况报错问题汇总及解决办法的更多相关文章

  1. MySQL server has gone away报错原因分析及解决办法

    原因1. MySQL 服务宕了 判断是否属于这个原因的方法很简单,执行以下命令,查看mysql的运行时长 $ mysql -uroot -p -e "show global status l ...

  2. cooking构建工具报错MSBUILD :error MSB4132解决办法

    最近学习cooking构建工具的时候,在自己的笔记本上运行的好好的,项目在公司电脑上clone下来的时候,发现构建报错,逐条查错,试了好多方法也不行 最后在github上找到了答案,只是之前一直没找到 ...

  3. mysql 报错 session halted的解决办法,实际工作中的结论。

    写后台程序,发现执行到sql语句时就报错session halted,如下图: 也上网搜过蛮多方法,都不能解决我的问题.后来自己发现了症结所在,其实很简单:执行insert的语句没有包含not nul ...

  4. 微信授权、获取用户openid-纯前端实现——jsonp跨域访问返回json数据会报错的纯前端解决办法

    近来,倒霉的后台跟我说让我拿个openid做微信支付使用,寻思很简单,开始干活. 首先引导用户打开如下链接,只需要将appid修改为自己的就可以,redirect_url写你的重定向url https ...

  5. Cobbler 登录web界面提示报错“Internal Server Error”解决办法

    Cobbler登录web页面报错 查看httpd日志/etc/httpd/logs/ssl_error_log 查看cobbler的py配置文件 sed -n '38,41p' /usr/share/ ...

  6. Eclipse 配置spring boot pom.xml第1行报错的两种解决办法

    现象 通过spring boot项目导入eclipse后,pom.xml文件的第一行总是报错.这里使用的spring版本是2.1.5,2.1.4以前的版本等其他版本的spring没有这个问题. 解决办 ...

  7. node-sass 安装失败报错的原因及解决办法(整理)

    npm install 时偶尔遇到报错:没有安装python或node-sass 安装失败的问题,百度之后发现是被墙了,但根据百度的方法换了淘宝镜像和用了vpn都安装失败,最后发现原来是因为没有卸载之 ...

  8. 报错:net::err_unknown_url_scheme的解决办法

    在项目中设置了api请求和web页面请求的地址,如下图: 控制台报错,如下图: 问题是:没有加入"http://"这个头,因此访问不到. 解决办法: 再次访问正常

  9. java 重载父类报错 Remove '@override' annotation解决办法

    Remove '@override' annotation解决办法      最近刚刚配置了新机器,将原来的代码放在eclipse上执行,总会出现Remove '@override' annotati ...

随机推荐

  1. 如何学习Vim

    如果你是Linux用户,学习Vim会有很大的好处. 如果你是windows用户,个人建议还是使用vscode. 准备大约40min的学习时间,打开终端,输入下面命令开启自带教程 vimtutor 按操 ...

  2. 如何用 银行卡OCR 接口进行快速开发

    最近公司项目有一个银行卡识别的小需求,想着如果用现成的API就可以大大提高开发效率,在网上的API商店搜索了一番,发现了 APISpace,它里面的银行卡OCR非常符合我的开发需求.   银行卡OCR ...

  3. 从零开始手写Cartographer(1): 开端

    写在前面的话 我做SLAM已经三年了.读书时初学SLAM,一开始无从下手,直到读了高博士的博客,茅塞顿开,渐入佳境.后来又买了他的<视觉SLAM十四讲>,常伴手边,直至毕业.几个月前找工作 ...

  4. led跑马灯(模糊时钟ambiguous color,非法字符 non printable character,寄存器初值,计数器计数注意事项)

    1.设计定义 让8个led以100ns的速度循环闪烁. 2.设计输入 循环闪烁,还是周期问题,用时钟驱动,所以需要一个时钟信号clk.再给一个复位输入reset,八个输出led信号. 每100ns只有 ...

  5. Centos7借助docker部署mysql,提供远程链接服务

    Centos7 借助docker部署mysql,并提供远程连接服务 安装docker 运行docker 注意安装docker和运行docker的步骤很简单,可以参考我学习docker的笔记 docke ...

  6. Dubbo源码(二) - SPI源码

    前情提要 假设你已经知道Dubbo SPI的使用方式,不知道的请出门左转: Dubbo源码(一) - SPI使用 Dubbo源码地址: apache/dubbo 本文使用版本:2.6.x 测试Demo ...

  7. 并发刺客(False Sharing)——并发程序的隐藏杀手

    并发刺客(False Sharing)--并发程序的隐藏杀手 前言 前段时间在各种社交平台"雪糕刺客"这个词比较火,简单的来说就是雪糕的价格非常高!其实在并发程序当中也有一个刺客, ...

  8. Auto.js 特殊定位控件方法 不能在ui线程执行阻塞操作,请使用setTimeout代替

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! Auto.js 特殊定位控件方法 操作环 ...

  9. #万答10:mysqldump 是如何实现一致性备份的

    万答10:mysqldump 是如何实现一致性备份的 实验场景 MySQL 8.0.25 InnoDB 实验步骤: 先开启 general_log 观察导出执行过程的变化 set global gen ...

  10. 基于webgl(threejs)的路面编辑

    楔子 在很多应用中,特别是一些园区类的应用. 都需要对园区的地面 环境进行展示,路面就是地面的一部分. 通常的做法是,都是建模的时候把相关的元素都建好,然后导入到展示系统中进行展示. 不过有些情况下, ...