mysql-router8.0.29之后的版本链接不释放问题

1、使用mysql-router8.0.32版本,发现空闲的连接不释放,导致连接数一直上升最终超出默认设置的mysql-router连接数
2、使用mysql-router8.0.28版本没有此问题,>=8.0.29的版本都有连接不释放并且存在连接CLOSE_WAIT的情况
3、本地mysqlrouter.conf如下,请指导解决,感谢

img

img

换个mysql版本

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: mysql-router配置中的 查看 mysqlrouter 配置文件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    # tree ./3306
    ./3306
    ├── data
    │   ├── keyring
    │   └── state.json
    ├── log
    │   └── mysqlrouter.log
    ├── mysqlro.sock
    ├── mysqlrouter.conf
    ├── mysqlrouter.key
    ├── mysql.sock
    ├── mysqlxro.sock
    ├── mysqlx.sock
    ├── run
    ├── start.sh
    └── stop.sh
    
    # cat /usr/local/mysql-router-8.0.18-linux-glibc2.12-x86_64/3306/mysqlrouter.conf
    
    # File automatically generated during MySQL Router bootstrap
    [DEFAULT]
    user=root
    logging_folder=/usr/local/mysql-router-8.0.18-linux-glibc2.12-x86_64/3306/log
    runtime_folder=/usr/local/mysql-router-8.0.18-linux-glibc2.12-x86_64/3306/run
    data_folder=/usr/local/mysql-router-8.0.18-linux-glibc2.12-x86_64/3306/data
    keyring_path=/usr/local/mysql-router-8.0.18-linux-glibc2.12-x86_64/3306/data/keyring
    master_key_path=/usr/local/mysql-router-8.0.18-linux-glibc2.12-x86_64/3306/mysqlrouter.key
    connect_timeout=15
    read_timeout=30
    dynamic_state=/usr/local/mysql-router-8.0.18-linux-glibc2.12-x86_64/3306/data/state.json
    
    [logger]
    level = INFO
    
    [metadata_cache:production]
    router_id=1
    user=mysql_router1_fucrtwhosizh
    metadata_cluster=production
    ttl=0.5
    use_gr_notifications=0
    
    [routing:production_default_rw]
    bind_address=0.0.0.0
    bind_port=6446
    socket=/usr/local/mysql-router-8.0.18-linux-glibc2.12-x86_64/3306/mysql.sock
    destinations=metadata-cache://production/default?role=PRIMARY
    routing_strategy=first-available
    protocol=classic
    
    [routing:production_default_ro]
    bind_address=0.0.0.0
    bind_port=6447
    socket=/usr/local/mysql-router-8.0.18-linux-glibc2.12-x86_64/3306/mysqlro.sock
    destinations=metadata-cache://production/default?role=SECONDARY
    routing_strategy=round-robin-with-fallback
    protocol=classic
    
    [routing:production_default_x_rw]
    bind_address=0.0.0.0
    bind_port=64460
    socket=/usr/local/mysql-router-8.0.18-linux-glibc2.12-x86_64/3306/mysqlx.sock
    destinations=metadata-cache://production/default?role=PRIMARY
    routing_strategy=first-available
    protocol=x
    
    [routing:production_default_x_ro]
    bind_address=0.0.0.0
    bind_port=64470
    socket=/usr/local/mysql-router-8.0.18-linux-glibc2.12-x86_64/3306/mysqlxro.sock
    destinations=metadata-cache://production/default?role=SECONDARY
    routing_strategy=round-robin-with-fallback
    protocol=x
    
    

    注意最后几个配置块 role=PRIMARY ,role=SECONDARY


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

是的,跟版本有关系。经过测试发现 8.0.29 和 8.0.30 版本的 router 都会有此问题。8.0.28 和 8.0.21 版本的 router 经过测试是不存在此问题的。因此可以考虑使用8.0.28 以下的版本来解决你遇到的问题。或者你可以监控disconnection事件,使用普通的连接,最好不使用连接池。

在MySQL Router 8.0.29之后的版本中,可能会遇到连接不释放的问题。这个问题可能是由于MySQL Router的一个bug引起的。为了解决这个问题,你可以尝试以下几个步骤:

  1. 升级到MySQL Router 8.0.33版本:最新的版本可能已经修复了这个bug,你可以尝试升级到最新版本来解决问题。

  2. 检查MySQL Router日志:在MySQL Router的日志中,你可以查找是否有任何错误或警告信息。这些信息可能会指示问题的根本原因。

  3. 检查MySQL Server的连接数限制:确保MySQL Server的连接数限制设置合理。如果连接数限制过低,可能会导致连接不释放的问题。

  4. 使用连接池:考虑使用连接池来管理MySQL连接。连接池可以有效地管理连接的创建和释放,避免连接不释放的问题。

  5. 提交一个bug报告:如果你确定遇到了MySQL Router的bug,你可以提交一个bug报告给MySQL的开发团队。他们会尽快修复这个问题。

希望以上提供的解决方案能够帮助你解决连接不释放的问题。如果问题仍然存在,请尝试联系MySQL的支持团队获取进一步的帮助。

连接不释放和连接CLOSE_WAIT的问题可能与MySQL Router的配置和版本有关。下面是一些可能的解决方案和建议:

  1. 升级到最新版本:首先,尝试将MySQL Router升级到最新版本。这可能包含了一些已知的修复和改进,可能会解决连接不释放的问题。确保在升级之前备份配置文件和相关数据。

  2. 检查配置文件:请确保你的配置文件中的设置是正确的,并与所需的行为相匹配。在你的配置文件中,以下是一些需要注意的部分:

    • max_total_connections:确保这个值设置得足够大,以容纳你的应用程序连接数的需求。
    • max_connections:这个值应该与你的MySQL服务器的最大连接数一致,确保MySQL Router不会超过MySQL服务器的限制。
  3. 调整连接超时时间:尝试调整连接超时时间的设置,以确保空闲连接能够及时释放。在你的配置文件中,connect_timeoutclient_connect_timeout 都可以调整。可以逐步增加这些值并观察连接释放的情况。

  4. 检查网络配置:确保MySQL Router和MySQL服务器之间的网络配置正确。网络问题可能导致连接不正常关闭或者CLOSE_WAIT状态的连接无法及时释放。检查防火墙、路由器、网络负载均衡等设置,确保网络连接稳定。

  5. 监控和调试:使用MySQL Router的监控工具和日志输出来进一步调试和分析连接释放的问题。你可以查看日志文件中是否有任何异常或错误信息,并监视连接数的变化和状态。

如果以上解决方案无法解决问题,建议向MySQL Router的官方支持渠道或相关社区寻求更详细的帮助。他们可能能够提供更具体的调试和解决方案,以解决连接不释放的问题。

根据您提供的信息,以下是对每个问题的解释和可能的解决方法:

1、关于空闲连接不释放的问题:
空闲连接不被释放可能是由于配置或设置问题引起的。检查以下几个方面可能有助于解决该问题:

  • 检查连接池的配置参数:确保连接池的最大连接数(max_connections)设置得合理,并且不会超过服务器的配置限制。
  • 检查连接池的空闲连接数目: 您可以通过配置参数(idle_connection_timeout)来设置空闲连接的超时时间。确保该参数设置能够适当地关闭空闲连接。
  • 检查数据库服务器的配置: 请检查和确认数据库服务器的连接数配置参数(例如max_connections)是否合理,并且不会限制您的应用程序。

2、关于MySQL Router版本的差异:
您提到在使用MySQL Router版本 8.0.28及之前的版本时没有出现连接不释放的问题。而在使用MySQL Router版本 8.0.29及之后的版本时出现了连接不释放和CLOSE_WAIT状态的问题。这可能是由于版本之间的更改引起的。为了解决该问题,可以尝试以下方法:

  • 更新到MySQL Router的最新版本: 目前的MySQL Router版本是8.0.32,您可以尝试更新到该版本以查看是否有相关问题修复。
  • 查看MySQL Router的发布说明和文档: 检查MySQL Router版本8.0.29及之后的发布说明和文档,以了解是否有关于连接管理的配置更改或已知问题。

3、关于本地mysqlrouter.conf配置文件:
很抱歉,您没有提供mysqlrouter.conf的具体内容。对于MySQL Router的配置,您可以注意以下几个关键配置参数:

  • max_connections: 确保该参数设置与您的数据库服务器的配置相匹配,以防止连接数超过服务器限制。
  • idle_connection_timeout: 设置合理的空闲连接超时时间,以便及时释放空闲连接。
  • metadata_cache_expiration: 检查元数据缓存的过期时间设置,以防止旧连接仍然被使用。

请检查上述配置参数,根据需要进行相应的调整。如果问题仍然存在,请参考MySQL Router的文档和社区支持,以获得更多的帮助和建议。

这个问题可能是由于 MySQL Router 8.0.29 版本引入的一个已知问题导致的。该问题导致空闲连接不会被正确释放,从而导致连接数不断增加并最终超出默认设置的连接数限制。

解决这个问题的方法是升级到 MySQL Router 8.0.33 或更高版本。在这个版本中,开发者们修复了这个问题,并确保空闲连接能够正确释放。

如果你不能立即升级到最新版本,你可以尝试以下临时解决方案:

  1. 减少连接超时时间:在 MySQL Router 的配置文件中,将 idle_connection_timeout 参数设置为一个较低的值,例如 300 秒。这样可以缩短连接空闲时间,使得空闲连接更快被释放。

  2. 使用连接池:在应用程序中使用连接池管理数据库连接。连接池可以帮助有效地管理连接的创建和释放,避免连接数不断增加导致的问题。

  3. 定期重启 MySQL Router:如果无法解决连接不释放的问题,你可以定期重启 MySQL Router。通过定期重启,可以清理无效的连接并释放资源。

以下答案参考newbing,回答由博主波罗歌编写:
根据您的描述,可能是在MySQL Router 8.0.29版本之后发生了一些改变,导致连接不被释放的问题。有几种可能的解决方案可以尝试:

  1. 更新到最新版本:首先,请确保您使用的是最新版本的MySQL Router。有时,开发者会修复旧版本中的一些问题并发布更新版本。

  2. 检查MySQL服务器配置:您应该检查MySQL服务器的配置,确保连接超时设置正确。您可以在MySQL服务器的配置文件(例如my.cnf)中查找wait_timeoutinteractive_timeout参数,并将其设置为合适的值,以确定连接在一段时间后自动关闭。

  3. 检查MySQL Router配置:MySQL Router有一些相关的配置选项可以设置连接的行为。请确保您的mysqlrouter.conf中的group_replication_connection_keepalive配置选项设置为正确的值。这个选项决定了连接在空闲一段时间后是否被关闭。您可以尝试将它设置为较短的时间(例如30秒)来测试是否解决了连接的问题。

下面是一个示例的mysqlrouter.conf文件,您可以参考:

[DEFAULT]
router_id = myrouter
group_replication_connection_keepalive = 30

[routing:primary]
bind_address = 0.0.0.0
bind_port = 6446
destinations = 127.0.0.1:3306

请根据您的实际情况调整配置项的值。

如果以上解决方案都无法解决您的问题,我建议您查看MySQL Router的官方文档,或者提交一个bug报告给MySQL开发团队,以便他们更好地理解和解决该问题。
如果我的回答解决了您的问题,请采纳!

MySQL连接不释放的主要原因是程序代码中未正确关闭数据库连接。如果代码中没有正确关闭连接,那么连接会一直存在,无法被其他用户占用。当然,也有可能是由于系统资源不足,导致连接无法释放。
解决方法:
第一步是通过try语句打开数据库连接,第二步是在finally块中关闭连接。这样就可以确保连接在代码执行完毕后被正确关闭。

除了在代码中正确地关闭连接外,还可以在MySQL中设置连接超时时间。这样,在连接空闲一段时间后,MySQL就会自动关闭连接。


SET GLOBAL wait_timeout=60;
SET GLOBAL interactive_timeout=60;

这里将连接超时时间设为60秒,可以根据需要进行调整。
注意事项
在使用MySQL时,还有一些需要注意的问题:
避免创建过多的连接,这会影响数据库性能。
使用连接池管理连接。
定期检查程序代码中是否正确关闭了数据库连接。
总的来说,MySQL连接不释放的问题是很容易解决的,只需要在程序代码中正确关闭连接即可。但是,我们也需要注意一些细节,以避免这种问题的发生。

确保你的应用程序正确释放数据库连接:在每个数据库操作完成后,都要确保显式地关闭或释放连接。这可以通过调用连接对象的close()dispose()方法来完成。确保在任何异常情况下都能正确释放连接。
检查应用程序连接池配置:如果你使用连接池来管理数据库连接,确保连接池的配置正确。这包括最大连接数、空闲连接超时等参数。检查这些配置是否与你的需求相匹配,并且没有配置错误导致连接未正确释放。
检查应用程序中的连接泄漏:连接泄漏指的是应用程序在不再使用连接时没有正确释放它们。这可能是由于代码逻辑错误、异常情况未处理或使用连接的地方太多而没有及时释放导致的。在你的应用程序中检查是否存在连接泄漏的可能性,并确保连接在不再使用时正确释放。
仔细检查应用程序的关闭逻辑:确保你的应用程序在关闭时能正确地关闭数据库连接。这包括在应用程序关闭或优雅重启时释放所有连接。确保关闭逻辑没有问题,并且所有连接都能正确关闭。
检查网络连接和防火墙设置:有时,CLOSE_WAIT状态可能是由于网络问题或防火墙设置导致连接无法正确关闭。确保网络连接稳定,并排除防火墙或网络配置问题。