是一款跨windows/linux/MAC OS平臺的文件同步工具,不僅支持本地對本地同步,也支持通過SSH、RSH和Socket等網路協議進行同步。更棒的是, 支持雙向同步操作,你既可以從A同步到B,也可以從B同步到A,這些都不需要額外的設定。 是一個 Linux 內核特性,它監控文件系統,並且及 ...
unison
是一款跨windows/linux/MAC OS平臺的文件同步工具,不僅支持本地對本地同步,也支持通過SSH、RSH和Socket等網路協議進行同步。更棒的是,unison
支持雙向同步操作,你既可以從A同步到B,也可以從B同步到A,這些都不需要額外的設定。
inotify
是一個 Linux 內核特性,它監控文件系統,並且及時向專門的應用程式發出相關的事件警告,比如刪除、讀、寫和卸載操作等。您還可以跟蹤活動的源頭和目標等細節。
使用 inotify
很簡單:創建一個文件描述符,附加一個或多個監視器(一個監視器 是一個路徑和一組事件),然後使用 read 方法從描述符獲取事件。read 並不會用光整個周期,它在事件發生之前是被阻塞的。
環境介紹
伺服器分別為:
伺服器node1:192.168.5.10,同步目錄:/opt/http/
伺服器node2:192.168.5.20,同步目錄:/opt/http/
配置epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
1、在node1和 node2上安裝一下軟體
(1)安裝ocaml
[root@node1 ~]# yum install ocaml -y
(2)安裝unison
[root@node1 ~]# yum install unison240.x86_64 -y
(3)安裝inotify
[root@node1 ~]# yum install inotify-tools.x86_64 -y
2、配置雙機ssh信任
詳細請參考 https://www.cnblogs.com/Sunzz/p/8320330.html
(1)在node1機root用戶下執行ssh-keygen命令,在需要輸入的地方,直接回車,生成建立安全信任關係的證書。
[root@node1 ~]# ssh-keygen -t rsa
node1對node2建立信任關係
[root@node1 ~]# chmod 600 /root/.ssh/authorized_keys
[root@node1 ~]# scp -r /root/.ssh/id_rsa.pub 192.168.5.20:/root/.ssh/authorized_keys
(2)node2對node1建立信任關係
在node2機上執行同樣的操作,建立node2對node1的信任關係。
(3)遠程執行命令測試是否成功,第一次有可能要輸入密碼
命令格式:ssh 遠程用戶名@遠程主機IP地址 '遠程命令或者腳本'
[root@node2 ~]# ssh [email protected] 'hostname'
3、添加腳本
(1)在192.168.5.10伺服器node1上添加腳本:
[root@node1 ~]# mkdir /script
[root@node2 ~]# vim /script/inotify.sh
#/bin/bash
UNISON=`ps -ef |grep -v grep|grep -c inotifywait`
if [ ${UNISON} -lt 1 ]
then
ip2="192.168.5.20" ##目標主機IP
src2="/opt/http/"
dst2="/opt/http/"
/usr/bin/inotifywait -mrq -e create,delete,modify,move $src2 | while read line
do
/usr/bin/unison -batch $src2 ssh://$ip2/$dst2
echo -n "$line " >> /var/log/inotify/inotify$(date +%u).log
echo ` date +%F %T " " -f1-4` >> /var/log/inotify/inotify$(date +%u).log
done
fi
(2)在192.168.5.20伺服器node2上添加腳本:
[root@node2 ~]# mkdir /script
[root@node2 ~]# vim /script/inotify.sh
#/bin/bash
UNISON=`ps -ef |grep -v grep|grep -c inotifywait`
if [ ${UNISON} -lt 1 ]
then
ip2="192.168.5.10"
src2="/opt/http/"
dst2="/opt/http/"
/usr/bin/inotifywait -mrq -e create,delete,modify,move $src2 | while read line
do
/usr/bin/unison -batch $src2 ssh://$ip2/$dst2
echo -n "$line " >> /var/log/inotify/inotify$(date +%u).log
echo ` date +%F %T " " -f1-4` >> /var/log/inotify/inotify$(date +%u).log
done
fi
4、在二台伺服器上修改腳本許可權:
[root@node1 ~]# chmod a+x /script/inotify.sh
5、建立日誌目錄
如果/var/log/inotify目錄沒有則需要手工創建,用來存放inotify的日誌;
[root@node2 ~]# mkdir /var/log/inotify
6、添加定時任務
[root@node2 ~]# crontab -e
* * * * * /bin/bash /script/inotify.sh > /dev/null 2>&1 &
重啟電腦,測試二台伺服器中/opt/http/的內容是否能同步
不重啟電腦,手動執行腳本也可以測試
/bin/bash /script/inotify.sh或/script/inotify.sh
在其中一臺/opt/http/目錄中添加,或修改,或刪除文件的時候,可以看到腳本狀態,同時另一臺伺服器也應該會跟隨操作。
7、如果需要可以指定某幾種尾碼的文件不同步
打開/root/.unison/default.prf,添加:
ignore = Name *.txt
ignore = Name *.mdb
意思就是不同步txt和mdb格式的文件,修改完之後重新執行一下/bin/sh /script/inotify.sh即可生效。
我的是直接指定名稱:
ignore = Name .bash_profile
ignore = Name .viminfo
ignore = Name .bash_history
以上步驟操作完成基本上都不會有問題,如果有問題那你接著往下看。
8、如果有問題,請手動修改下腳本:
在某些公司中,是禁止禁用root遠程登陸,只能使用普通用戶進行同步方案
等待同步目錄(二臺電腦不能使用一樣的待同步目錄名,否則報錯)
192.168.5.10: /opt/http/
192.168.5.20: /opt/http/
安裝過程如下
useradd –g apache unison
passwd unison
(輸入新密碼)
chown –R unison. /opt/http/
mkdir /home/unison/.ssh
chmod 700 /home/unison/.ssh
su – unison
ssh-keygen -t rsa
(然後連續三次回車)
添加密鑰到授權密鑰文件中
在192.168.5.10伺服器node1上操作(22是埠號)
cd /home/unison/.ssh
ssh "-p 22" 192.168.5.10 cat /home/unison/.ssh/id_rsa.pub >> authorized_keys #小寫p
ssh "-p 22" 192.168.5.20 cat /home/unison /.ssh/id_rsa.pub >> authorized_keys
scp -P 22 authorized_keys 192.168.5.20:/home/unison/.ssh/ #大寫P
chmod 600 /home/unison/.ssh/authorized_keys
在192.168.5.20伺服器B上操作
chmod 600 /home/unison/.ssh/authorized_keys
分別在兩台機器上執行如下測試(第一次執行時,會要求輸入密碼,以後執行則不需要說明信任成功)
ssh -p 22 [email protected] date
ssh -p 22 [email protected] date
su - root
node1腳本
#/bin/bash
UNISON=`ps -ef |grep -v grep|grep -c inotifywait`
if [ ${UNISON} -lt 1 ]
then
ip2="[email protected]:22"
src2="/opt/http/"
dst2="/opt/http/"
/usr/local/bin/inotifywait -mrq -e create,delete,modify,move $src2 | while read line
do
/usr/local/bin/unison -batch -sshargs "-i /home/unison/.ssh/id_rsa" $src2 ssh://$ip2
/$dst2
echo -n "$line " >> /var/umelook-log/inotify/inotify$(date +%u).log
echo ` date +%F %T` >> /var/umelook-log/inotify/inotify$(date +%u).log
done
fi
node2腳本:
#/bin/bash
UNISON=`ps -ef |grep -v grep|grep -c inotifywait`
if [ ${UNISON} -lt 1 ]
then
ip2="[email protected]:22"
src2="/opt/http/"
dst2="/opt/http/"
/usr/local/bin/inotifywait -mrq -e create,delete,modify,move $src2 | while read line
do
/usr/local/bin/unison -batch -sshargs "-i /home/unison/.ssh/id_rsa" $src2 ssh://$ip2
/$dst2
echo -n "$line " >> /var/umelook-log/inotify/inotify$(date +%u).log
echo ` date +%F %T` >> /var/umelook-log/inotify/inotify$(date +%u).log
done
fi