- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们有 MySQL 5.7 主从复制,在从服务器端,我们的应用程序监控工具(Tideways 和 PHP7.0)不时报告
MySQL has gone away.
show global status like '%Connection%';
+-----------------------------------+----------+
| Variable_name | Value |
+-----------------------------------+----------+
| Connection_errors_accept | 0 |
| Connection_errors_internal | 0 |
| Connection_errors_max_connections | 0 |
| Connection_errors_peer_address | 323 |
| Connection_errors_select | 0 |
| Connection_errors_tcpwrap | 0 |
| Connections | 55210496 |
| Max_used_connections | 387 |
| Slave_connections | 0 |
+-----------------------------------+----------+
Connection_errors_peer_address
显示 323. 如何进一步调查导致双方出现此问题的原因:
MySQL has gone away
Connection_errors_peer_address
net_retry_count = 10
net_read_timeout = 120
net_write_timeout = 120
skip_networking = OFF
Aborted_clients = 151650
net_retry_count = 10
net_read_timeout = 30
net_write_timeout = 60
skip_networking = OFF
Aborted_clients = 3
net_retry_count = 10
net_read_timeout = 30
net_write_timeout = 60
skip_networking = OFF
Aborted_clients = 3
最佳答案
在 MySQL 5.7 中,当新的 TCP/IP 连接到达服务器时,服务器执行多项检查,在 sql/sql_connect.cc
中实现在函数中 check_connection()
其中一项检查是获取客户端连接的 IP 地址,如下所示:
static int check_connection(THD *thd)
{
...
if (!thd->m_main_security_ctx.host().length) // If TCP/IP connection
{
...
peer_rc= vio_peer_addr(net->vio, ip, &thd->peer_port, NI_MAXHOST);
if (peer_rc)
{
/*
Since we can not even get the peer IP address,
there is nothing to show in the host_cache,
so increment the global status variable for peer address errors.
*/
connection_errors_peer_addr++;
my_error(ER_BAD_HOST_ERROR, MYF(0));
return 1;
}
...
}
connection_errors_peer_addr
递增,并拒绝连接。
vio_peer_addr()
在
vio/viosocket.c
中实现(代码简化为仅显示重要调用)
my_bool vio_peer_addr(Vio *vio, char *ip_buffer, uint16 *port,
size_t ip_buffer_size)
{
if (vio->localhost)
{
...
}
else
{
/* Get sockaddr by socked fd. */
err_code= mysql_socket_getpeername(vio->mysql_socket, addr, &addr_length);
if (err_code)
{
DBUG_PRINT("exit", ("getpeername() gave error: %d", socket_errno));
DBUG_RETURN(TRUE);
}
/* Normalize IP address. */
vio_get_normalized_ip(addr, addr_length,
(struct sockaddr *) &vio->remote, &vio->addrLen);
/* Get IP address & port number. */
err_code= vio_getnameinfo((struct sockaddr *) &vio->remote,
ip_buffer, ip_buffer_size,
port_buffer, NI_MAXSERV,
NI_NUMERICHOST | NI_NUMERICSERV);
if (err_code)
{
DBUG_PRINT("exit", ("getnameinfo() gave error: %s",
gai_strerror(err_code)));
DBUG_RETURN(TRUE);
}
...
}
...
}
vio_peer_addr()
中唯一的失败路径当拨打
mysql_socket_getpeername()
时发生或
vio_getnameinfo()
失败。
man 2 getpeername
手册列出了以下可能的错误:
NAME
getpeername - get name of connected peer socket
ERRORS
EBADF The argument sockfd is not a valid descriptor.
EFAULT The addr argument points to memory not in a valid part of the process address space.
EINVAL addrlen is invalid (e.g., is negative).
ENOBUFS
Insufficient resources were available in the system to perform the operation.
ENOTCONN
The socket is not connected.
ENOTSOCK
The argument sockfd is a file, not a socket.
ENOBUFS
是合理的。
vio_getnameinfo()
,它只是 getnameinfo() 的一个包装器,这也是根据手册页
man 3 getnameinfo
可能由于以下原因而失败:
NAME
getnameinfo - address-to-name translation in protocol-independent manner
RETURN VALUE
EAI_AGAIN
The name could not be resolved at this time. Try again later.
EAI_BADFLAGS
The flags argument has an invalid value.
EAI_FAIL
A nonrecoverable error occurred.
EAI_FAMILY
The address family was not recognized, or the address length was invalid for the specified family.
EAI_MEMORY
Out of memory.
EAI_NONAME
The name does not resolve for the supplied arguments. NI_NAMEREQD is set and the host's name cannot be located, or neitherhostname nor service name were requested.
EAI_OVERFLOW
The buffer pointed to by host or serv was too small.
EAI_SYSTEM
A system error occurred. The error code can be found in errno.
The gai_strerror(3) function translates these error codes to a human readable string, suitable for error reporting.
Connection_errors_peer_address
可能是由于系统负载(导致内存不足等暂时性故障)或影响 DNS 的网络问题。
Connection_errors_peer_address
MySQL 中的状态变量,作为在代码的这一区域具有更好的可见性/可观察性的努力的一部分。
Connection_errors_peer_address
递增,根本原因不会打印在日志中。这对于故障排除来说是不幸的,但也避免了泛滥日志造成更多损害,这里有一个权衡。请记住,登录之前发生的任何事情都是非常敏感的... mysqld
的总内存使用量,并监控 uptime
,应该很容易确定故障是“仅”导致连接关闭而服务器保持正常运行,还是服务器本身发生灾难性故障。 getnameinfo
. skip-name-resolve
将无效,因为此检查稍后发生(请参阅 specialflag & SPECIAL_NO_RESOLVE
中的代码中的 check_connection()
) Connection_errors_peer_address
失败,注意服务器干净地返回错误 ER_BAD_HOST_ERROR
到客户端,然后关闭套接字。这与突然关闭套接字(如崩溃)不同:前者应由客户端报告为 "Can't get hostname for your address"
,而后者报告为 "MySQL has gone away"
. ER_BAD_HOST_ERROR
以不同方式关闭的套接字是另一回事 performance_schema.host_cache
中有多少行 table 。 host_cache_size
系统变量。 performance_schema.host_cache
文档:
Aborted_clients
状态变量显示服务器强行关闭的一些连接。这通常发生在 session 空闲很长时间时。
关于MySQL 已经消失 : Connection_errors_peer_address with high numbers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52496902/
从下面的链接中读取,我相信当 Nifi 集群中的一个节点出现故障时,数据将不会被处理,直到该节点恢复运行 --- 因此由故障节点处理的流文件/数据不会被另一个节点接管集群中的节点。 https://c
我在这两篇论文中发现了“high-capacity cnn”这个短语: 1. Rich feature hierarchies for accurate object detection and se
目前我想使用来自 http://codepen.io/JaxoDI/pen/DtsdH 的评级系统.但目前它在您从右向左悬停时有效。请随意在给定的链接中尝试一下。但我想要一个从左到右悬停的评级系统。
我读过多篇文章,包括 Jon Bentley 的二分查找章节。这是我对 CORRECT 二进制搜索逻辑的理解,它在我所做的简单测试中有效: binarysearch (arr, low, high,
我的问题与下面的有点不同 CSS Float Logic .我的问题是关于 height 比这更具体的概念。 这里有规则 https://www.w3.org/TR/CSS22/visuren.htm
当我们说“高阶”函数时,我怀疑“阶”的真正含义是什么?例如,我有一个嵌入式函数调用: f.g.h 那么它叫“三阶”函数吗? “高阶”函数是静态函数累加的概念吗?然后当我有一个递归函数 f 时,在运行时
我正在研究树问题 Convert Sorted Array to Binary Search Tree - LeetCode Given an array where elements are sor
我最近将 iPhone 设备中的 iOS 升级到 12.2(为我的应用程序“Match4app”提供对最新版本的支持),这似乎与 Xcode 10.1 不兼容。我应该将 Xcode 更新到 10.2
我了解 >>> 修复了溢出:当添加两个大的正长时,您最终可能会得到一个负数。有人能解释一下这种按位移位如何神奇地解决溢出问题吗?它与 >> 有何不同? 我的怀疑:我认为这与 Java 使用二进制补码这
我有一个关于托管高流量 Rails 应用程序的问题。问题是我有 3/4 年的 Ruby on Rails 应用程序经验,但我以前从未有过高流量网站。我真的很兴奋,因为这对我和我的同事来说是“下一个层次
人们说 Delphi 在整数运算上生成了非常好的优化代码。我在 Delphi 2007 中尝试了以下示例,并看到编译器生成的汇编代码。 program p1000; {$APPTYPE CONSOLE
我目前正在构建一个混合云解决方案,需要将消息写入队列以供稍后处理。队列具有高可用性(99.999+% 的正常运行时间)是绝对必要的。 我的选择是将消息读/写到本地 ZeroMQ 高可用性对或 Azur
我正在使用 Highcharts 创建此条形图。条形的对齐方式不在部分的中间(就像第一个红色条形图不在 2016 年 1 月的中间)。是否有任何选项可以将所有栏放置在每个部分的中间? 最佳答案 我找到
我一直在阅读 Framework Design Guidelines 一书,这是一本关于在 .NET 中设计框架的书,其中摘录了框架设计者对每个部分(例如参数设计、异常处理等)所做的决定。 在参数设计
我正在尝试停止Macbook上的Apache服务器。 我尝试了以下 $ sudo apachectl stop /System/Library/LaunchDaemons/org.apache.htt
如何在高可用性中部署 apache Airflow (正式称为 airbnb 的 Airflow )调度程序? 我不是在询问显然应该在高可用性配置中部署的后端 DB 或 RabbitMQ。 我的主要关
我的内部循环包含一个计算,分析显示有问题。 这个想法是采用灰度像素 x (0 .5,x =0)-1, ... x, erf(x), ... x, tanh(x), .
我们如何定制 HighChart 的 Bubble Chart具有不同的形状。 就像我们代表 4 种不同的事件类型一样,我们不仅需要 4 种不同颜色的气泡,而且还需要每个气泡具有不同的形状,如圆形、三
刚刚注意到我在 Azure 中的文件共享存储出现“ClientOtherError”的概率非常高。他们的成功率在 50-100% 之间。 有人有任何经验可以解释为什么会这样吗? 所附图表以红色/橙色显
我是Elasticsearch的新手,遇到了一个问题,甚至在故障排除方面也遇到了困难。我的Elasticsearch(1.1.1)当前正在使CPU处于运行状态,即使没有进行搜索或建立索引也是如此。 C
我是一名优秀的程序员,十分优秀!