unison+inotify數據實時雙向同步

来源:https://www.cnblogs.com/Sunzz/archive/2018/01/21/8322335.html
-Advertisement-
Play Games

是一款跨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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • "回到目錄" 任務調度組件 1. 位於Scheduling目錄 2. 基類JobBase,所有JOB都派生自它,重寫Cron屬性可以修改調度周期 3. 支持單次JOB,即執行完成後馬上停止 4. 支持對外API介面,以便獲取和修改JOB的列表的狀態 源代碼展現 自定義Job在繼承JobBase之後, ...
  • 繼上文<<基於阻塞隊列的生產者消費者C#併發設計>>的併發隊列版本的併發設計,原文code是基於<<.Net中的並行編程-4.實現高性能非同步隊列>>修改過來的,前面的幾篇文章也詳細介紹了併發實現的其它方案及實現。直接給code: 調用code: 併發系列應該就這樣完了,回頭整理成目錄,自己查起來也方 ...
  • 原文地址:https://www.cnblogs.com/pipi-changing/p/5697481.html 找了下Cron的資料,這篇作者寫的比較清晰,轉載記錄一下,方便後面使用的時候在google 1. cron表達式格式: {秒數} {分鐘} {小時} {日期} {月份} {星期} {年... ...
  • 昨天,在做一個NPOI讀取的小demo的時候,使用OpenFileDialog打開文件,最開始的寫法,直接在按鈕點擊事件中寫,會報錯,代碼如下: 或者直接 這兩種,無論哪種寫法,在代碼執行的時候,會報錯,具體報錯為: 這種情況,在網上查詢,是說線程問題,就是線程衝突了,不知道該執行哪一個,具體說法如 ...
  • 本篇文章更適合具有一定開發經驗,一定功底,且對底層代碼有所研究的朋友!!! 本篇文章主要採用理論和代碼實例相結合方式來論述委托和事件,涉及到一些邊界技術,如軟體架構的OCP原則(開-閉原則), 軟體架構解耦,設計模式(Sender-Order)和事件驅動模型,有一定難度和深度,不適合初級者。 第一部 ...
  • 這篇文章介紹了 NEST 中是如何實現 Elasticsearch 中的時間段的 ...
  • RGB顏色感測器。感測器晶元不知道是TCS230,或是TCS3200。二者pinout及電氣性能一樣。左邊的模塊有8個引腳,LED常亮。S0, S1 預設上拉為高電平,/OE下拉低電平。S2, S3, OUT 三個引腳供單片機介面。如下: 照片中右邊的模塊有10個引腳,原理與8pin相同,只是多了一 ...
  • centos install vsftpd with SSL support ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...