当前位置: 首页 > news >正文

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

前言

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

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

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

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

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

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

 

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

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 为 3sconnectTimeout 设置的是 客户端 和 服务端 创建 tcp连接 的超时时间socketTimeout 设置的是 客户端 和 服务端 tcp 数据交互的超时时间DriverManager.loginTimeout 设置的是登录认证期间 客户端 和 服务端 tcp 数据交互的超时时间登录认证期间 客户端 和 服务端 tcp 数据交互的超时时间 是 socketTimeout 和 (DriverManager.loginTimeout - connect本身会损失一部分时间) 的较小者在 登录 tcp请求 之后, 将 客户端 和 服务端 tcp 数据交互的超时时间 设置为了 socketTimeout

 

创建 dataSource 的地方 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6JOd6aOOOQ==,size_20,color_FFFFFF,t_70,g_se,x_16

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

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6JOd6aOOOQ==,size_20,color_FFFFFF,t_70,g_se,x_16  

 

普通的客户端 比如 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.cdate./Test09GetHostByAddrdate执行 build 脚本root@ubuntu:~/docker/mysql/GetHostByAddr# ./build.shThu Feb 24 23:21:46 PST 2022./build.sh: line 5: 39782 Segmentation fault      ./Test09GetHostByAddrThu Feb 24 23:21:56 PST 2022

 

 

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

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

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

84be4d7e30344cbdb66c8f17243db3e3.png

 

然后 本文中提到的 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 住 

c7e921af6b2c4d89af7be7071777c958.png

 

 

 

 

完 

 

 

 

相关文章:

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

前言 呵呵 最近再一次 环境部署的过程中碰到了这样的一个问题 我基于 docker 启动了一个 mysql 服务, 然后 挂载出了 数据目录 和 配置目录, 没有手动复制配置目录出来, 所以配置目录是空的 然后 我基于 docker 启动了一个 nacos, 配置数据库设置为上面的这个 mysql 然后 启…...

GO GC

GO GC 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行。 Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可…...

ECharts配合Node.js爬虫实现数据可视化

数据可视化简介 可视化技术是将数据和信息以图形化的方式展示出来,以便更好地理解和分析。可视化技术通常使用各种图表、图形、动画和交互式效果来呈现数据。可视化技术有以下几个基本概念: 数据:可视化技术的基础是数据。数据可以是数字、文…...

[Linux] C获取键盘,鼠标数据

键盘检测指令:cat /dev/input/event1 | hexdump 鼠标检测指令:cat /dev/input/event2 | hexdump 当键盘/鼠标有输入时,会有对应的一堆16进制输出。它其实对应着input_event结构体【24字节】。 struct input_event {struct timeval time;_…...

户外跑步用什么耳机、户外运动耳机推荐

跑步是一项简单的运动,只需要交替迈左右腿就可以进行。然而,跑步有时可能变得单调乏味。即使是意志坚定、热爱跑步的人,在这个漫长的过程中也会感到乏味,更不用说像你我这样的普通跑者了。音乐能够让跑步变得更加有趣,…...

ubuntu设置系统代理

安装trojan等代理工具并配置启动,得到端口号 例如 10.10.1.10:8080系统代理设置 我们将在/etc/profile.d/proxy.sh下添加一个shell脚本文件,这将确保设置适用于所有已登录的用户: sudo vim /etc/profile.d/proxy.sh将以下内容写到文档中&…...

java定时任务如何取消

java定时任务如何取消,并比如,我之前想每周二晚上6点自动生成一条devops流水线,现在我想停掉 答案: 在Java中,可以使用ScheduledExecutorService类来创建定时任务。要取消定时任务,可以调用ScheduledFutur…...

gitlab 9.05 版本获取合并请求的API接口报错404是为什么

gitlab 9.05 版本获取合并请求的API接口报错404是为什么 答案: 出现404错误表示请求的资源未找到。在这种情况下,可能有以下几个原因导致API接口报错404: 版本不匹配:请确保你使用的是GitLab 9.05版本的API接口,如果使…...

微服务(多级缓存)

目录 多级缓存 1.什么是多级缓存 2.JVM进程缓存 2.2.初识Caffeine 2.3.实现JVM进程缓存 2.3.1.需求 2.3.2.实现 3.Lua语法入门 3.1.初识Lua 3.1.HelloWorld 3.2.变量和循环 3.2.1.Lua的数据类型 3.2.2.声明变量 3.2.3.循环 3.3.条件控制、函数 3.3.1.函数 3.3.…...

阿里云配置MySQL-server 8.0远程登录

Ubuntu 22.04 LTS 安装MySQL-Server 8.0 # apt search mysql-server # apt install mysql-server重建服务 # service mysql stop # vi /etc/mysql/mysql.conf.d/mysqld.cnf ... bind-address 0.0.0.0 ... # service mysql start # lsof -i:3306 COMMAND PID USER FD …...

清洁能源使用的社会发展意义

应用清洁能源是转变经济增加途径的有效手段,能够在减少污染物、降低企业经营成本的同时,提高企业经济效益和社会经济效益。 应用清洁能源是保护环境的最佳方式和必然选择,改变末端治理的现状,采取以预防为主的环境保护与发展理…...

针对论坛系统进行功能测试和性能测试

项目链接:飞鸽论坛 目录 一. 项目背景 二. 项目功能 三. 功能测试 注册: 登录: 更改用户信息: 发布帖子: 更新帖子信息: 点赞: 评论: 发送私信: 测试报告 四. 性能测试 Virtual User Generator Controller Analysis 测试报告: 一. 项目背景 该论坛系统采用前…...

Android App的设计规范

Android App 设计规范是为开发者和设计师提供的一系列准则和建议,以确保应用在 Android 设备上的外观、交互和用户体验保持一致。以下是一些常见的 Android App 设计规范要点,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开…...

paddleclas ImportError: cannot import name ‘Identity‘ from ‘paddle.nn‘

使用paddlepaddle的 paddleclas 官方demos时 ,报错如图 ImportError: cannot import name ‘Identity’ from ‘paddle.nn’ 解决方案很简单: 找到调用 Identity 的位置: 注释掉就解决啦 !!! 搞定!!!…...

Debezium系列之:深入理解Debezium Server Operator和实际应用Debezium Server Operator案例详解

Debezium系列之:深入理解Debezium Server Operator和实际应用Debezium Server Operator案例详解 一、认识Debezium Server Operator二、深入理解Debezium Server和Debezium Server实际应用案例详解三、Debezium Server Operator安装步骤四、Debezium Operator使用案例五、post…...

ansible批量创建crontab文件并添加到定时任务

Ansible 来修改 crontab 文件并添加计划任务。用于将你提供的 cron 行添加到特定用户的 crontab 中: --- - name: Add cron job to users crontabhosts: your_target_hosttasks:- name: Add cron jobcron:name: "ntpdate_job"minute: "0"hour:…...

什么是 API ?

一、API 的定义:数据共享模式定义 4 大种类 作为互联网从业人员,API 这个词我耳朵都听起茧子了,那么 API 究竟是什么呢? API 即应用程序接口(API:Application Program Interface),…...

CSS实现内凹圆角,从而实现圆角边框

1、代码 <!DOCTYPE html> <html><head><style>.uu {position: relative;width: 400px;height: 300px;}img {width: 100%;height: 100%;z-index: 1;}.box_right_top {background-image: radial-gradient(circle at left bottom, transparent 50px, whi…...

Spring中的自定义注解

在Spring中&#xff0c;注解是一种非常使用的工具。 因其强大的功能&#xff0c;极大的提高了我们开发效率。 但是当遇到一些特殊业务时&#xff0c;框架自有的注解已经不能满足我们的需求了&#xff0c;这时我们就可以添加自定义注解来满足我们的业务需求。 我们用interfac…...

前端需要理解的设计模式知识

设计模式的原则&#xff1a;1. 单一职责原则&#xff08;一个对象或方法只做一件事&#xff09; 2. 最少知识原则&#xff08;尽可能少的实体或对象间互相作用&#xff09; 3. 开放封闭原则&#xff08;软件实体具有可扩展且不可修改&#xff09; 设计模式是通过代码设计经验总…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...