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 的地方

获取连接的时候设置 loginTimeout 的地方
普通的客户端 比如 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

然后 本文中提到的 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
前言 呵呵 最近再一次 环境部署的过程中碰到了这样的一个问题 我基于 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中,注解是一种非常使用的工具。 因其强大的功能,极大的提高了我们开发效率。 但是当遇到一些特殊业务时,框架自有的注解已经不能满足我们的需求了,这时我们就可以添加自定义注解来满足我们的业务需求。 我们用interfac…...
前端需要理解的设计模式知识
设计模式的原则:1. 单一职责原则(一个对象或方法只做一件事) 2. 最少知识原则(尽可能少的实体或对象间互相作用) 3. 开放封闭原则(软件实体具有可扩展且不可修改) 设计模式是通过代码设计经验总…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
