rsync同步文件到遠程機器,卡住10多秒–問題解決過程
背景
以前大體介紹過,我們這邊是做運維平台的。如果要形象化理解,那麼,比如jenkins這種喜聞樂見的軟體大致了解吧,jenkins就經常需要同步文件/版本包到遠程機器上,jenkins怎麼實現的,沒去了解。
我們這邊算是自研了類似jenkins這類軟體,其中,同步文件主要用的是rsync工具,作為非專業運維,來現在公司之前,甚至沒用過rsync,scp用得更多。
來了之後也沒怎麼用這個,因為我沒負責這塊業務,自己事情也多,所以就懶了。
這次是同事遇到相關問題,我就帶著對rsync的一知半解,參與了排查,所幸問題不難,解決了。
問題描述
這個圖,因為是公司內的圖,所以打碼比較厲害。
簡單來說,就是客戶端機器通過rsync命令,同步本機的一個文件到target伺服器的21000埠(target伺服器上的21000埠有rsync的服務端在監聽,負責接收文件)。
然後運行後,輸出了一行提示:
connected to target伺服器
就卡住不動了。
然後再過上10多s,程式才正常跑完。
同事也很納悶,要同步的文件才2kb,怎麼要10多s呢?
問題分析過程
熟悉我的同學可能知道,我有點喜歡抓包(甚至有時候,應該先去看日誌才是最優的,但就是想不起來先去看日誌)
我就在群里看著上面那個圖,發了條抓包語句,讓他試試。
你這可能得抓包。
tcpdump -i eth1 host target伺服器 and tcp port 21000 -w 21000.pcap
這條語句,意思就是,在eht1網卡上抓包,因為tcp是四元組嘛(源端主機、源端埠、目的端主機、目的端介面),我們這裡就是抓host為「target伺服器」且埠為21000的包,然後寫到21000.pcap這個文件。
然後過了一會想起來,這個是線上機器,寫到21000.pcap這個文件後,也沒法下載到本機來分析。
於是就讓同事換了個命令去執行:
tcpdump -i eth1 host xxxx and tcp port 21000 -Ann
這個就是不寫文件了,-Ann直接列印到console。
然後,我們再次去執行那個rsync命令,這次就看到了奇怪的一幕了:
- 首先是正常的三次握手
- 接下來,客戶端在18:06:58,發起請求,請求體只能認出來:”@RSYNCD:30.0″
- 接下來,服務端表示收到該請求
- 再接下來,服務端過了10多s後,返回了。返回體:”@RSYNCD 30.0″
我們想想,客戶端發起了請求,請求體是@RSYNCD:30.0之類的,看起來像是協商版本啥的;服務端隔了15s返回,也返回了一個版本資訊(合理猜測)。
我又想起,好像之前在哪裡看到資料,說rsync版本低了,有類似問題。
我就讓同事去看看別的正常的伺服器上的版本,是什麼情況。同事看完後,表示版本無差異。
那其實就陷入僵局了,唯一的思路就是:先去看看這個rsync協議是啥樣的,客戶端為啥發了個這個過去,服務端要一直卡住呢。
現在,我們至少已經知道了問題的範圍:應該是這個rsync服務端的反應有點問題,至於是為啥導致他反應這麼慢,那就要去網上查了,看看有什麼可能的原因。(我沒有target伺服器的ssh許可權,沒有想起來去服務端查看)
然後接下來,就是開始在google、百度上各種搜,關鍵字換來換去,最終查到了一些資料。
首先是rsync的協議,//blog.csdn.net/hyforthy/article/details/18091869
和我抓的包的內容進行了應證,講得還是基本準確的。
但是沒有找到更多的細節,其實我是想知道官方文檔有沒有提到這種:什麼情況下,收到客戶端發的版本協商請求後,會卡住10多s。
但是很遺憾,官方文檔也沒講這些。
最終,也就根據現象,調整關鍵字,找到了一些網上人的踩坑記錄,發給同事看看。
網上的文檔如下(//blog.csdn.net/weixin_30488313/article/details/97145611):
然後轉手發給了同事,讓他跟著這裡面去檢查。
這邊我的意思就是,rsync服務端,收到客戶端請求後,是可以拿到客戶端的ip的,某些情況下,有些軟體,經常會拿著這個ip,去反查一下ip對應的hostname,因此,我就推斷是這個原因。
不過當時已經是周五下班時間了,我也沒有rsync服務端機器的許可權,沒辦法排查。同事應該是又有其他問題緊急處理了。
我們就都沒管了。
今天想起來這個事情,問了下同事,同事說,就是這個問題,一模一樣。
解決辦法,採用了簡單的方式,修改了hosts文件;
- 或者機器連接的的dns系統能解析到客戶端ip也是可以解決這個問題的。
- 再或者就是,升級rsync服務端,升級後,支援不解析客戶端ip。
總結
展示了日常處理問題的一些方法,希望對大家有所幫助。
另外,扯點閑篇,深圳終於疫情好了不少了,上周還是2天出一次小區,一戶只能出去一個。
由於我這邊是合租,平時大家也沒溝通,不知道別人用沒用出去的名額,我也就懶得出去了,所以是小區里宅了一周多。再加上之前的兩周居家,算起來,居家已經3周多了。。
明天終於可以去公司上班了,不想待家裡了,真沒多少效率,太考驗自制力了。
這兩天出了東航的事情,也給我提了個醒,之前看到知乎問題是,有個年輕人去世了,家裡老人挨家銀行去問,看看有沒有兒子的錢存在該銀行。
總之很麻煩。
這還是現金存款部分,要是再有個什麼基金、港美股、保險、證券賬戶、虛擬貨幣等各類資產,怕是家人也不知道,真要有點啥,那個錢,就要是給國家做貢獻了(問題是國家也不會去動你的賬戶。。這就算是dead account了)。
所以,有些錢,是不是可以直接給到家人帳號呢?可以想想。