摘要:問題問題簡述如下圖后端寫入的日志丟失并且無報錯因為不支持時序圖把時序圖代碼嵌入在代碼里問題定位過程為什么卡在看狀態轉換圖可以看到收到了一直沒有一直卡在和實際的代碼是吻合的那么為什么在引發后發消息仍然不報錯呢因為協議允許在收到后繼續
問題 問題簡述
如下圖. server docker restart后, client端寫入的日志丟失, 并且無報錯.
因為不支持時序圖, 把時序圖代碼嵌入在代碼里.
?```sequence client->server: log_data client->server: log_data server->server: docker restart server->client: fin client->server: log_data loss without error ?```tcp state diagram 問題定位過程 為什么卡在CLOSE_WAIT.
看tcp狀態轉換圖, 可以看到client收到了fin, 一直沒有recv, 一直卡在CLOSE_WAIT. 和實際的代碼是吻合的.
那么, 為什么在server docker restart 引發CLOSE_WAIT后, client發消息仍然不報錯呢?
因為:
tcp協議允許client在收到fin后, 繼續發送消息.
server 在docker restart后 ip 改變, client還是往原來的ip發送消息, 沒有主機通知client rst, 導致消息在系統buffer里積壓.
積壓信息如下:
root@9eeaefa7fe57:/# netstat -nap | grep 27017 | grep 10.0.0 tcp 1 402 10.0.0.186:62281 10.0.0.16:27017 CLOSE_WAIT 4308/server root@9eeaefa7fe57:/# netstat -nap | grep 27017 | grep 10.0.0 tcp 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.0 tcp 1 70126 10.0.0.186:62281 10.0.0.16:27017 LAST_ACK -CLOSE_WAIT的恢復
如果代碼還是只發不收. 是檢測不到CLOSE_WAIT的. 顯然, 應用層心跳是一個解決方案. 那么, 不使用心跳, 只發不收的情況下, 什么時候才能檢測到錯誤呢?
send buffer 滿
tcp keepalive, 默認情況下需要2小時才能檢測到連接錯誤. 見linux keepalive探測對應用層socket api的影響
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27697.html
摘要:由于沒有了中心化的負載均衡器,集群不會因某臺機器異常而導致整個服務對外不可用,很好的避免了單點問題,同時也帶了可擴展性。 Mesos/Marathon 折騰久了,我們一直希望有機會深入到 Swarm 內部一探究竟。 另外, Mesos 這一套東西雖然是久經企業級考驗的, 但是安裝、部署和使用相對復雜,上手有門檻。同時,在今年的 DockerCon 上,內置了Swarm 功能的 Dock...
摘要:在之前公眾號的數人云工程師手記基于的集群管理開發實踐對的服務發現及負載均衡有詳細的介紹。服務名稱為服務命名,必須為英文或數字。 本文是數人云9月22日線上微信群分享的文章實錄。數人云容器管理面板Crane開源以來,很多小伙伴對它還不是非常了解,數人云工程師金鑫從Crane技術背景、環境準備和使用步驟等方面為大家做了詳細的介紹,并整理大家常見的問題逐一進行了解答。 引言 Docker1....
摘要:應該如何解決本文將給出若干提示,如何在生產環境中使用。路由匹配服務發現負載均衡跨容器通訊非常可靠。在單個端口上運行一個服務,節點的任意主機都可以訪問,負載均衡完全在后臺實現。 上周數人云給大家分享了——《你可能需要的關于Docker Swarm的經驗分享》今天給大家帶來這位作者大大的后續文章——《Docker Swarm在生產環境中的進階指南》 當在本地開發環境中使用Docker,或者...
摘要:一個容器起來,能夠對外服務,這時就看下一步的負載均衡服務發現以及編排。它們有不同的應用場景,比如傾向于四層的負載均衡。不單是負載均衡,它同時解決了服務發現和負載均衡兩個點。 今天是數人云容器三國演義Meetup嘉賓演講實錄第二彈。數人云工程師春明為大家奉送了一盤干貨的大餐,讓我們讀讀源碼,深入了解一下SwarmKit的世界吧! 小數前方預警:有大量代碼出現! showImg(htt...
摘要:當然此時的局限性較大,比如沒有副本和負載均衡的概念,這導致服務無法高可用當然也更不存在什么服務網絡管理和跨節點數據存儲這些東西沒有服務模型集群中服務間關系和啟動順序編排也很復雜于是就有了下面的的誕生。 showImg(https://segmentfault.com/img/remote/1460000015317037?w=1885&h=1153); 概述 在我的《Docker S...
閱讀 2527·2021-09-24 10:29
閱讀 3807·2021-09-22 15:46
閱讀 2576·2021-09-04 16:41
閱讀 2982·2019-08-30 15:53
閱讀 1263·2019-08-30 14:24
閱讀 3057·2019-08-30 13:19
閱讀 2172·2019-08-29 14:17
閱讀 3526·2019-08-29 12:55