07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s

这篇具有很好参考价值的文章主要介绍了07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

呵呵 最近再一次 环境部署的过程中碰到了这样的一个问题

我基于 docker 启动了一个 mysql 服务, 然后 挂载出了 数据目录 和 配置目录, 没有手动复制配置目录出来, 所以配置目录是空的

然后 我基于 docker 启动了一个 nacos, 配置数据库设置为上面的这个 mysql

然后 启动 nacos, 启动日志中老是会发现 nacos 连接 mysql 出现问题, mysql server 没有返回数据包 给客户端 什么的, 呵呵 这个问题 还是挺有意思的, 继续往下看

然后 我调整了 nacos 的 socketTimeout 的配置, 更新为 20s, 重新启动 nacos 呵呵 效果还是一样

然后 在普通的客户端 比如 navicate, 或者 jdbcTemplate 中建立连接到查询 也还是需要差不多是 10s 左右的时间, 这个很固定

 文章来源地址https://www.toymoban.com/news/detail-664270.html

总结一下 这里面存在两个问题

1. 为什么我 nacos 连接配置了 socoketTimeout, 为什么 客户端 和 mysql 服务器交互还是失败了?

2. 普通的客户端 比如 navicate, 或者 jdbcTemplate 中建立连接到查询 也还是需要差不多是 10s 左右的时间, 这个很固定, 这个 10s 到底是什么? mysql 服务器到底在干嘛?

 

 

为什么我 nacos 连接配置了 socoketTimeout, 为什么 客户端 和 mysql 服务器交互还是失败了?

这个涉及到几个概念, connectionTimeout, socketTimeout, loginTimeout 

在这个场景里面主要涉及到的是 socketTimeout, loginTimeout 

ExternalDataSourceProperties 中设置了 connectionTimeout 为 3s, 进而设置了  DriverManager.loginTimeout 为 3s 

而这个配置是写死的, 因此 除了修改 nacos 代码之外的办法, 就是处理 mysql 服务器出现连接超时的问题了 

 

客户端 和 服务器 的交互流程大致如下 

1. 客户端 和 服务器 建立 tcp 连接请求 

2. 服务器 发送 ServerGreeting 给客户端 

3. 客户端拿到 ServerGreeting 之后发送 认证请求给服务器 

4. 服务端的认证, 以及之后的流程 

我们这里客户端是在 流程2 这里出现的问题, 设置的读取超时时间为 socketTimeout 和 loginTimeout 二者的较小者, 然后服务器那边 由于一些因素一直没有发送 ServerGreeting 给客户端, 因此 导致的超时 

    build:89, ExternalDataSourceProperties (com.alibaba.nacos.config.server.service.datasource) 中写死的配置 connectionTimeout 为 3s
    connectTimeout 设置的是 客户端 和 服务端 创建 tcp连接 的超时时间
    socketTimeout 设置的是 客户端 和 服务端 tcp 数据交互的超时时间
    DriverManager.loginTimeout 设置的是登录认证期间 客户端 和 服务端 tcp 数据交互的超时时间
    登录认证期间 客户端 和 服务端 tcp 数据交互的超时时间 是 socketTimeout 和 (DriverManager.loginTimeout - connect本身会损失一部分时间) 的较小者
    在 登录 tcp请求 之后, 将 客户端 和 服务端 tcp 数据交互的超时时间 设置为了 socketTimeout

 

创建 dataSource 的地方 

07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s,12 mysql,docker,mysql,nacos

获取连接的时候设置 loginTimeout 的地方

07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s,12 mysql,docker,mysql,nacos  

 

普通的客户端 比如 navicate, 或者 jdbcTemplate 中建立连接到查询 也还是需要差不多是 10s 左右的时间, 这个很固定, 这个 10s 到底是什么? mysql 服务器到底在干嘛?

本问题中服务器这边的处理, 客户端这边连接了之后, 服务端处理连接请求, 完整的 stacktrace 是 thd_prepare_connection - login_connection - check_connection - ip_to_hostname 

是位于 客户端 和 服务端 建立 tcp 连接之后, 服务端 向 客户端 发送 ServerGreeting 之前 

最终调用的 glibc 库函数 gethostbyaddr, 这个库函数根据 客户端ip 查询 客户端主机名 的时候, 向 dns 查询, 没有查询到 有 10s 的超时时间

    #0  0x00007ff9a20fc819 in poll () from target:/lib/x86_64-linux-gnu/libc.so.6
    #0  0x00007ff9a20fc819 in poll () from target:/lib/x86_64-linux-gnu/libc.so.6
    #1  0x00007ff98001e207 in ?? () from target:/lib/x86_64-linux-gnu/libresolv.so.2
    #2  0x00007ff98001bc43 in __res_context_query () from target:/lib/x86_64-linux-gnu/libresolv.so.2
    #3  0x00007ff99800b536 in _nss_dns_gethostbyaddr2_r () from target:/lib/x86_64-linux-gnu/libnss_dns.so.2
    #4  0x00007ff99800b823 in _nss_dns_gethostbyaddr_r () from target:/lib/x86_64-linux-gnu/libnss_dns.so.2
    #5  0x00007ff9a2118ee2 in gethostbyaddr_r () from target:/lib/x86_64-linux-gnu/libc.so.6
    #6  0x00007ff9a21217d5 in getnameinfo () from target:/lib/x86_64-linux-gnu/libc.so.6
    #7  0x000056048ea2e800 in vio_getnameinfo ()
    #8  0x000056048de9606f in ip_to_hostname(sockaddr_storage*, char const*, char**, unsigned int*) ()
    #9  0x000056048e2c8569 in ?? ()
    #10 0x000056048e2c95d3 in thd_prepare_connection(THD*) ()
    #11 0x000056048e3c103e in handle_connection ()
    #12 0x000056048e9cfcd7 in pfs_spawn_thread ()
    #13 0x00007ff9a255ffa3 in start_thread () from target:/lib/x86_64-linux-gnu/libpthread.so.0
    #14 0x00007ff9a21074cf in clone () from target:/lib/x86_64-linux-gnu/libc.so.6

 

新增测试用例, 在宿主机上面跑一下, 并且在 mysql 所在的容器跑一下 

    新增测试用例 Test09GetHostByAddr.c
        /**
        * Test09GetHostByAddr.c
        */
        #include "stdio.h"
        #include "netdb.h"
        #include "stdlib.h"
        #include "arpa/inet.h"
        #include "string.h"
        int main(int argc, char **argv) {
            struct hostent *host;
            const char *add = "10.60.50.16";
            char p[30];
            inet_pton(AF_INET, add, p);
            host = gethostbyaddr(p, strlen(p), AF_INET);
            printf("hostname : %s", host->h_name);
            return 0;
        }

 

新增 build 脚本, 并执行, 观察 执行情况 

    新增 build 的测试脚本
        gcc -g -o Test09GetHostByAddr Test09GetHostByAddr.c
        date
        ./Test09GetHostByAddr
        date
    执行 build 脚本
    root@ubuntu:~/docker/mysql/GetHostByAddr# ./build.sh
    Thu Feb 24 23:21:46 PST 2022
    ./build.sh: line 5: 39782 Segmentation fault      ./Test09GetHostByAddr
    Thu Feb 24 23:21:56 PST 2022

 

 

skip-name-resolve 的影响 - 添加于 2023.08.15

这里是服务器 在尝试根据 ip信息 解析客户端的 主机名 信息

核心的调用链如下, 关键的调用是 glibc 的 gethostbyaddr_r

07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s,12 mysql,docker,mysql,nacos

 

然后 本文中提到的 config 目录中, 影响这个问题更关键的是 skip-name-resolve 的这个配置, 更新之后的配置有这个 skip-name-resolve, 然后 mysql 服务器解析 主机名信息的时候 就 hang 住了, 这里是 10s

root@ubuntu:~/docker/mysql# cat config/conf.d/docker.cnf
[mysqld]
skip-host-cache
skip-name-resolve

 

在 my.cnf 中增加了 skip_name_resolve=ON 之后情况如下 

更新之后, 就不会解析 主机信息, 进而防止了 gethostbyaddr_r 的 hang 住 

07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s,12 mysql,docker,mysql,nacos

 

 

 

 

完 

 

 

 

到了这里,关于07 mysql5.6.x docker 启动, 无 config 目录导致客户端连接认证需要 10s的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL5.7数据目录结构

    以CentOS7为例,数据目录为 /var/lib/mysql/ ,其内容如下: 其中 mysql 、 sys 等为数据库,即一个数据库对应的一个目录。 ibdata1 存放的是 InnoDB 的元数据、变更缓冲区、双写缓冲区和撤销日志。 ib_logfile0 和 ib_logfile1 存放普通日志。 ib_buffer_pool 存放缓存池信息。 以 test 数据库为例

    2024年02月12日
    浏览(28)
  • 在M1芯片的Macbook上使用docker-compose启动mysql,并利用 NaviCat Premium 客户端进行连接

    在M1芯片的Macbook上使用docker-compose启动mysql,并利用 NaviCat Premium 客户端进行连接   先打开控制台,使用 uname -m 来查看自己CPU芯片的架构   苹果的M系列芯片使用的是ARM64架构,因此,需要安装相应版本的一些列工具。         因为我是M1芯片,所以安装docker desktop时候,当

    2024年02月12日
    浏览(40)
  • Spring Cloud【Config客户端配置与测试、Config客户端之动态刷新 、什么是Spring Cloud Bus、Docker安装RabbitMQ】(十)

      目录 分布式配置中心_Config客户端配置与测试 为什么要引入bootstrap 

    2024年02月15日
    浏览(26)
  • 错误记录——mysql5.7连接失败,服务无法启动

    上周安装完mysql后,成功新建了数据库,一切都是正常的,于是就先搁置一旁。今天周一过来,却突然发现无法连接mysql了。 第一反应是服务没有启动,毕竟重启了电脑,说不定是服务没有自动启动,于是打开了服务管理器,却发现没有mysql对应的服务。既然没有,那我就自己

    2024年02月08日
    浏览(27)
  • Docker运行MySQL5.7

    步骤如下: 1.获取镜像: 2.创建挂载目录: 3.先启动docker把配置文件拷贝出来: 这里需要另外起一个终端,来拷贝文件: 4.启动docker 参数说明: (1)-d:后台启动 (2)-p:端口映射 (3)-v:目录挂载,一共挂载了日志、数据文件、配置三种文件。 (4)--name:容器名字 (

    2024年02月15日
    浏览(29)
  • docker 安装 MySQL5.7

    1、拉取镜像 2、创建容器 3、/var/docker/mysql/conf 目录新建 my.cnf 通过容器卷同步给mysql容器实例 写入内容: 进入容器实例  进入 mysql   查看MySQL字符集

    2024年02月10日
    浏览(28)
  • Docker 安装 MySQL5.7 和 MySQL8

    拉下来镜像后 执行 docker images 此时我们已经有这个镜像了。 在根目录下创建 app , 在 app 目录下创建 mysql57 文件夹。 命令如下: 参数说明 : -d :将容器在后台运行(以分离模式运行)。 -p 3306:3306 :将宿主机的 3306 端口映射到容器的 3306 端口,这样可以通过宿主机的 3306

    2024年02月04日
    浏览(36)
  • docker下安装mysql5.7教程

    准备好Linux系统机器,并安装好docker,阅读这篇文章前请先了解清楚docker的基本知识并且会熟悉运用docker的常用命令。学习docker基础知识可以参考这篇博文 安装好并启动docker后就可以开始安装mysql了 执行以下命令直接下载mysql5.7版本镜像 安装好后再执行 docker images命令,查看

    2024年02月05日
    浏览(32)
  • docker 安装 mysql5.7(全网最详细)

    安装,以MySql5.7版本为例子。 docker默认的仓库比较慢,可以参考以下文章 第五标题 设置阿里云镜像仓库。 docker (简介、dcoker详细安装步骤、容器常用命令)一站打包- day01-CSDN博客 一、拉去mysql镜像 如下安装完成   查看本地镜像仓库拉去好的mysql,确认版本号 如下:  二、

    2024年04月10日
    浏览(34)
  • 【Docker 】Docker 客户端,容器使用,启动容器,启动已停止运行的容器,停止一个容器,进入容器

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。 可以通过命令 dock

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包