集群文件同步腳本工具rsync、xsync和xcall


一、 rsync 遠程同步工具
rsync主要用於備份和鏡像。具有速度快、避免復制相同內容和支持符號鏈接的優點。
rsync和scp區別:用rsync做文件的復制要比scp的速度快,rsync只對差異文件做更新。scp是把所有文件都復制過去。
(1)基本語法
  rsync -rvl $pdir/$fname $user@hadoop$host:$pdir/$fname
  命令 選項參數 要拷貝的文件路徑/名稱 目的用戶@主機:目的路徑/名稱
  選項參數說明:
    -r 遞歸
    -v 顯示復制過程
    -l 拷貝符號連接


(2)案例實操
  在HP111機器上的/root/input目錄下新建demo2.txt然后同步到HP113服務器的/root/input
  [root@HP111 ~]# rsync -rvl input/ root@HP113:/root/input/
  sending incremental file list
  created directory /root/input
  ./
  demo1.txt
  demo2.txt

  sent 234 bytes received 91 bytes 650.00 bytes/sec
  total size is 60 speedup is 0.18


  然后在HP113查看

二、編寫集群分發腳本xsync
(1)需求:循環復制文件到所有節點的相同目錄下
(2)需求分析:
  (a)rsync命令原始拷貝:
    rsync -rvl /root/software root@HP110:/root/software
  (b)期望腳本:
    xsync 要同步的文件名稱
  (c)在/usr/local/bin這個目錄下存放的腳本,可以在系統任何地方直接執行。
(3)腳本實現
  (a)在/root目錄下創建bin目錄,並在bin目錄下xsync創建文件,文件內容如下:

 [root@HP111 ~]# mkdir bin
 [root@HP111 ~]# cd bin/
 [root@HP111 bin]# touch xsync
 [root@HP111 bin]# vi xsync

  在該文件中編寫如下代碼:

#!/bin/bash
#1 獲取輸入參數個數,如果沒有參數,直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 獲取文件名稱
p1=$1
fname=`basename $p1`
echo fname=$fname

#3 獲取上級目錄到絕對路徑
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

#4 獲取當前用戶名稱
user=`whoami`

#5 循環
for((host=111; host<=113; host++)); do
echo ------------------- HP$host --------------
rsync -rvl $pdir/$fname $user@HP$host:$pdir
done

  (b)修改腳本xsync所有用戶具有執行權限
    
  (c)調用腳本形式:xsync 文件名稱
    [root@HP113 bin]# xsync /root/bin
  注意:如果將xsync放到/root/bin目錄下仍然不能實現全局使用,可以將xsync移動到/usr/local/bin目錄下。

(4)調用腳本形式: xcall 操作命令

[root@HP111 ~]# xsync /root/bin
fname=bin
pdir=/root
------------------- HP111 --------------
sending incremental file list

sent 74 bytes received 17 bytes 60.67 bytes/sec
total size is 532 speedup is 5.85
------------------- HP112 --------------
sending incremental file list
bin/
bin/xsync

sent 652 bytes received 39 bytes 1,382.00 bytes/sec
total size is 532 speedup is 0.77
------------------- HP113 --------------
sending incremental file list
bin/
bin/xsync

sent 652 bytes received 39 bytes 1,382.00 bytes/sec
total size is 532 speedup is 0.77

/usr/bin下面的都是系統預裝的可執行程序,會隨着系統升級而改變。
/usr/local/bin目錄是給用戶放置自己的可執行程序的地方,推薦放在這里,不會被系統升級而覆蓋同名文件。如果兩個目錄下有相同的可執行程序,這里/usr/local/bin優先於/usr/bin。

三、編寫分發腳本xcall
(1)需求分析:在所有主機上同時執行相同的命令
xcall +命令
(2)在/root/bin目錄下創建xcall文件,文件內容如下:

#!/bin/bash
pcount=$#
if((pcount==0));then
echo no args;
exit;
fi

echo -------------start----------
$@
for((host=111; host<=113; host++)); do
echo ----------HP$host---------
ssh HP$host $@
done

(3)修改腳本 xcall 所有用戶具有執行權限
[root@HP113 bin]# chmod a+x xcall
(4)調用腳本形式: xcall 操作命令

[root@HP111~]# xcall rm -rf /root/input/demo2.txt
[root@HP111 bin]# xcall rm /root/input/demo2.txt 
-------------localhost----------
----------HP111---------
----------HP112---------
----------HP113---------

 

四、xsync和xcall腳本命令的理解

        這是我自己對xsync和xcall腳本的理解,自己查閱資料總結的,自己以前對shell也不是好,特此記錄便於自己理解

#獲取輸入參數個數,如果沒有參數,直接退出
pcount=$# $#表示所有參數的個數 
if((pcount==0)); then 
echo no args;
exit;
fi 
選擇語句格式 
if(判斷條件)
then 執行語句
fi 結束標志


獲取文件名稱
p1=$1
fname=`basename $p1`
echo fname=$fname
basename:
[root@HP111 ~]# basename /root/input/demo1.txt 
demo1.txt
為basename指定一個路徑,basename命令會將路徑信息去除,只留下文件名
p1=$1
fname=`basename $p1` :將xsync命令后面的第一個參數進行basename命令取得文件並復制給fname


獲取上級目錄到絕對路徑
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
dirname 用於取指定路徑所在的目錄 ,如 dirname /root/input/demo1.txt 結果為 /root/input
cd 是去到/root/input
pwd 是取/root/input目錄的絕對路徑


獲取當前用戶名稱
user=`whoami` whoami是Linux操作系統中用於查看當前有效用戶名的命令


循環
for((host=111; host<=113; host++)); do
#echo $pdir/$fname $user@hadoop$host:$pdir
echo --------------- hadoop$host ----------------
rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done
循環語句格式:
for(循環條件)do
執行語句
done


$@ 引用所有參數(命令)
for((host=111; host<=113; host++)); do
echo ----------hadoop$host---------
ssh hadoop$host $@ #循環執行引用所有參數(命令)
done

 

$* 與 $@ 區別:
相同點:都是引用所有參數。
不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 1、2、3,,則 " * " 等價於 "1 2 3"(傳遞了一個參數),而 "@" 等價於 "1" "2" "3"(傳遞了三個參數)。

注意:查看腳本循環條件的主機名是否適合
如:host=111; host<=113; host++循環的主機是不是全部包括集群主機


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM