使用tar pigz ssh實現大資料的高效傳輸

2022-02-15 17:29:27 字數 1800 閱讀 3785

使用tar+pigz+ssh實現大資料的高效傳輸

**:以前我們跨主機拷貝大資料的時候,比如要拷貝超過100gb的mysql原始資料,我們通常的做法如下:

這三個過程是同步阻塞,即不能同時非同步執行,導致效率低下。

現在我們將過程優化為以資料流的方式,同時執行(非阻塞模式),則效率一般可以提高到原來的3倍以上,具體實現如下:

磁碟讀取---->打包---->壓縮------>傳輸---->解壓縮-->拆包---->落盤

|->tar     |->gzip      |->ssh      |->gzip   |->tar

比如我要將本地的test目錄拷貝到「目標ip」的的data目錄,則命令如下:

tar -c test/ |pigz |ssh -c arcfour128 目標ip "gzip -d|tar -xc /data"

當然,這裡的解壓過程仍然用了效率比較低下的gzip,如果將解壓工具換成lz4(但需要單獨編譯安裝),則效率可以再提高不少。

如果不需要解壓,則命令變為:

tar -c test/ |pigz |ssh -c arcfour128 目標ip "cat >/data/test.tar.gz"

注:因為採用了流式壓縮,解壓過程必須加上-i引數,及tar –ixf /data/test.tar.gz 。

說明:pigz是乙個高效的壓縮工具,可以將多核cpu的每一分剩餘效能都用來做壓縮計算。而傳統的gzip則只能用單核cpu。比如一台2個8core cpu伺服器採用pigz和gzip壓縮相同的資料,一般效能差距至少在7-8倍以上(一般不會達到理論的16倍,因為受限於磁碟的讀寫速度和記憶體等資源)。

以前我們跨主機拷貝大資料的時候,比如要拷貝超過100gb的mysql原始資料,我們通常的做法如下:

這三個過程是同步阻塞,即不能同時非同步執行,導致效率低下。

現在我們將過程優化為以資料流的方式,同時執行(非阻塞模式),則效率一般可以提高到原來的3倍以上,具體實現如下:

磁碟讀取---->打包---->壓縮------>傳輸---->解壓縮-->拆包---->落盤

|->tar     |->gzip      |->ssh      |->gzip   |->tar

比如我要將本地的test目錄拷貝到「目標ip」的的data目錄,則命令如下:

tar -c test/ |pigz |ssh -c arcfour128 目標ip "gzip -d|tar -xc /data"

當然,這裡的解壓過程仍然用了效率比較低下的gzip,如果將解壓工具換成lz4(但需要單獨編譯安裝),則效率可以再提高不少。

如果不需要解壓,則命令變為:

tar -c test/ |pigz |ssh -c arcfour128 目標ip "cat >/data/test.tar.gz"

注:因為採用了流式壓縮,解壓過程必須加上-i引數,及tar –ixf /data/test.tar.gz 。

說明:pigz是乙個高效的壓縮工具,可以將多核cpu的每一分剩餘效能都用來做壓縮計算。而傳統的gzip則只能用單核cpu。比如一台2個8core cpu伺服器採用pigz和gzip壓縮相同的資料,一般效能差距至少在7-8倍以上(一般不會達到理論的16倍,因為受限於磁碟的讀寫速度和記憶體等資源)。

使用python socket多執行緒實現大檔案分發

一 伺服器端 usr bin env python coding utf 8 environment 2.7 在python3中,模組不是socketserver,而是socketserver import os,json,time,socketserver,threading file path ...

大根堆實現

堆 有兩種,一種是大根堆,另一種是小根堆。大根堆的意思是在跟的位置那個數是最大的。同理,小根堆的根元素是最小的。堆是乙個滿的二叉樹,除了最後乙個節點可能不是滿的。所以用陣列去陣列去實現它。乙個節點的index為i,則這個節點的兩個子節點的下標應該為2 i 1和2 i 2 父結點那就是 i 1 2 下...

大整數加法實現

先貼 move num 實現將輸入資料移到陣列末尾 con num 實現將字元轉為數字 add 實現加法,進製操作 注意不列印前導0 include includevoid move num char num while j 0 void conv num char num void add cha...