18.高性能MySQL --- 大文件傳輸

原文鏈接:https://book.douban.com/subject/3766465/
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就是瓶頸,而磁盤和網絡的承載能力還可以,就可以不壓縮。

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章