博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker swarm mode 下容器重启IP引发的 CLOSE_WAIT 问题
阅读量:6612 次
发布时间:2019-06-24

本文共 1395 字,大约阅读时间需要 4 分钟。

问题

问题简述

如下图. server docker restart后, client端写入的日志丢失, 并且无报错.

因为不支持时序图, 把时序图代码嵌入在代码里.

​```sequenceclient->server: log_dataclient->server: log_dataserver->server: docker restartserver->client: finclient->server: log_data loss without error​```

tcp state diagram

clipboard.png

问题定位过程

为什么卡在CLOSE_WAIT.

看tcp状态转换图, 可以看到client收到了fin, 一直没有recv, 一直卡在CLOSE_WAIT. 和实际的代码是吻合的.

那么, 为什么在server docker restart 引发CLOSE_WAIT后, client发消息仍然不报错呢?
因为:

  1. tcp协议允许client在收到fin后, 继续发送消息.
  2. server 在docker restart后 ip 改变, client还是往原来的ip发送消息, 没有主机通知client rst, 导致消息在系统buffer里积压.

积压信息如下:

root@9eeaefa7fe57:/# netstat -nap | grep 27017 | grep 10.0.0tcp        1  402 10.0.0.186:62281        10.0.0.16:27017         CLOSE_WAIT  4308/serverroot@9eeaefa7fe57:/# netstat -nap | grep 27017 | grep 10.0.0tcp        1  70125 10.0.0.186:62281        10.0.0.16:27017         CLOSE_WAIT  4308/server

此时, 在elixir socket接口层面来看, 不管socket的状态, 还是发送, 都是ok的.

iex(client@client.)25> socket |> :inet.port{:ok, 57395}iex(client@client.)26> socket |> :gen_tcp.send("aaa"):ok

如果主动close, 则会进入LAST_ACK状态

iex(client@client.)27> socket |> :gen_tcp.close()    :ok
root@9eeaefa7fe57:/# netstat -nap | grep 27017 | grep 10.0.0tcp        1  70126 10.0.0.186:62281        10.0.0.16:27017         LAST_ACK    -

CLOSE_WAIT的恢复

如果代码还是只发不收. 是检测不到CLOSE_WAIT的. 显然, 应用层心跳是一个解决方案. 那么, 不使用心跳, 只发不收的情况下, 什么时候才能检测到错误呢?

  1. send buffer 满
  2. todo 深究tcp keepalive, 不使用 keepalive情况下的 tcp 最大链接空闲时间.

转载地址:http://heaso.baihongyu.com/

你可能感兴趣的文章
python_day4_函数
查看>>
FastDFS 5.5 安装与配置
查看>>
Linux程序运行时找不到动态库问题解决方案
查看>>
我的友情链接
查看>>
CentOS 7输入startx无法启动图形化界面
查看>>
layer 如何在ifram 弹窗传值 关闭弹窗
查看>>
Sizeof与Strlen的区别与联系
查看>>
Linux命令vi/vim
查看>>
DevExpress v17.2新版亮点—.NET Reporting篇(一)
查看>>
git创建本地仓库并提交至远端
查看>>
Oldboy28期linux决心书
查看>>
Python学习笔记(六)——列表
查看>>
华为VRRP配置详解
查看>>
阿里云网络不完整记录
查看>>
MVC与单元测试实践之健身网站(完)-备案与部署
查看>>
eclipse导入web项目不能部署到tomcat,显示为java项目
查看>>
26.C#--枚举和结构的简单使用
查看>>
#51CTO学院四周年# 终于在这里遇到你
查看>>
Zabbix的架构配置选项
查看>>
字母图形
查看>>