1.複製文件
這個任務實際上就是完成以下事情的:
1.(可選)壓縮數據
2.發送到另外一臺服務器
3.把數據解壓縮到最終目的地
4.在複製完成後,校驗文件是否損壞
2.一個簡單是示例
#server1# gzip -c /backup/mydb/mytable.MYD > mytable.MYD.gz
#server1# scp mytable.MYD.gz root@server2:/var/lib/mysql/mydb/
#server2# gunzip /var/lib/mysql/mydb/mytable.MYD.gz
在server1上 gzip 既要讀又要寫,scp 在server1上讀,在server2上寫;gunzip 在server2 上既要讀又要寫。
3.一步到位的方法
#server1 gzip -c /backup/mydb/mytable.MYD | ssh root@server2 "gunzip -c - > /var/lib/mysql/mydb/mytable.MYD.gz"
這個方法比第一個好,因爲它極大的降低了磁盤IO,它將壓縮,複製文件和在傳輸的另外一端解壓縮文件全部放在一個步驟完成。磁盤活動被減少到
只要在 server1 上讀,server2 上寫。
也可以使用ssh內建的壓縮來完成,但是我們展示的是用管道來做壓縮和解壓,這是因爲這樣能給你極大地靈活性。
可以通過調整一些選項來提高這個方法的效率,例如給 gzip 增加選項 -l,使其壓縮變得更快。
4.避免加密的開銷
ssh 不是跨網傳輸數據最快的方法,因爲它增加了加解密的系統開銷。如果不需要加解密,那就使用 netcat 把'裸'數據進行跨網傳輸。可以通過nc
以非交互方式操作調用這個工具。
在 server2 上監聽 12345 端口上的文件,把任何發送到該端口的東西都解壓縮到期望的數據文件裏。
#server2 nc -l -p 12345 | gunzip -c - > /var/lib/mysql/mydb/mytable.MYD
然後在server1上,開啓另外一個netcat 實例,發送數據到目的服務器監聽的端口上。-q 選項告訴netcat當到達輸入文件的末尾時就關閉連接。這會
觸發監聽實例關閉接收的文件並退出。
#server1 gzip -c - /var/lib/mysql/mydb/mytable.MYD | nc -q 1 server2 12345
更容易的技術是使用tar,這樣文件名稱也會通過網絡發送出去,從而消除了另外一個錯誤來源,並會自動將文件寫到正確的位置。z 選項告訴tar使用gzip
做壓縮和解壓。
#server2 nc -l -p 12345 | tar xvzf -
#server1 tar cvzf - /var/lib/mysql/mydb/mytable.MYD | nc -q 1 server2 12345
5.其他選項
另外一個選項是 rsync.rsync 非常簡便,因爲它易於在源和目標之間做鏡像,並且還可以斷點續傳。但是,當它的二進制差異算法無法被很好的發揮時,它
不會得到很好的應用。在知道文件中的大部分內容都不需要傳輸的場景下,例如,如果要續傳一箇中途退出的nc複製的任務,就可以考慮它。
哪一種方法最快於你的系統,其中最大的因素是服務器上的磁盤驅動器,網卡和cpu的數量,以及它們之間相對的速度多快。有個不錯的監控方式 vmstat -n 5,
看磁盤或者cpu是否就是速度的瓶頸。
如果有閒置的cpu,就可能通過運行並行的複製操作來加快。相反,如果cpu就是瓶頸,而磁盤和網絡的承載能力還可以,就可以不壓縮。