1. 程式人生 > >如何實現Linux多臺伺服器間的檔案雙向同步

如何實現Linux多臺伺服器間的檔案雙向同步

Linux系統間檔案雙向同步搭建Unison版 
一、Unison簡介 
Unison是Windows、Linux以及其他Unix平臺下都可以使用的檔案同步工具,它能使兩個資料夾(本地或網路上的)保持內容的一致。Unison擁有與其它一些同步工具或檔案系統的相同的特性,但也有自身的特點: 
1.跨平臺使用; 
2.對核心和使用者許可權沒有特別要求; 
3.Unison是雙向的,它能自動處理兩分拷貝中更新沒有衝突的部分,有衝突的部分將會顯示出來讓使用者選擇更新策略; 
4.只要是能連通的兩臺主機,就可以執行unison,可以直接使用socket連線或安全的ssh連線方式,對頻寬的要求不高,使用類似rsync的壓縮傳輸協議。

環境如下: 
vm1 192.168.30.64 
vm2 192.168.30.65

二、編譯安裝Unison 
Linux下通過原始碼包編譯安裝Unison時,需要用到Objective Caml compiler。 
通過以下方式安裝 
[[email protected] ~]# wget http://caml.inria.fr/pub/distrib/ocaml-4.02/ocaml-4.02.0.tar.gz 
[[email protected] ~]# tar -xzvf ocaml-4.02.0.tar.gz 
[[email protected] ~]# cd ocaml-4.02.0 
[

[email protected] ocaml-4.02.0]# ./configure 
[[email protected] ocaml-4.02.0]# make world opt 
[[email protected] ocaml-4.02.0]# make install

編譯安裝Unison 
[[email protected] ~]# wget http://www.seas.upenn.edu/~bcpierce/unison//download/releases/stable/unison-2.48.3.tar.gz 
[[email protected] ~]# tar -xzvf unison-2.48.3.tar.gz 
[

[email protected] ~]# cd unison-2.48.3 
[[email protected] unison-2.48.3]# make UISTYLE=text 
[[email protected] unison-2.48.3]# make install

在執行make install的過程中,可能會出現以下錯誤提示: 
mv: cannot stat ‘/root/bin//unison’: No such file or directory 
make: [doinstall] Error 1 (ignored) 
cp unison /root/bin/ 
cp: cannot create regular file ‘/root/bin/’: Is a directory 
make: * [doinstall] Error 1

出現錯誤的原因在與Unison預設是將檔案Copy到/root/bin目錄,但Linux預設是沒有該目錄的,因此我們需要將生成的可執行檔案unison複製到系統的PATH目錄。 
[[email protected] unison-2.48.3]# cp unison /usr/local/bin

將可執行檔案unison上傳到遠端主機192.168.30.65 
[[email protected] unison-2.48.3]# scp unison [email protected]:/root/ 
通過SSH登陸到遠端主機,再將unison複製到vm2的PATH目錄 
[[email protected] ~]#cp unison /usr/local/bin

三、配置ssh key信任 
建議通過普通使用者進行操作,理由是通過root操作本身就危險,免密碼登陸的root就更危險了。 
我們使用部署 OA應用程式的使用者即可,如 我們的應用程式放在了 /home/oa/tomcat7/webapps/下面,我們可以使用oa使用者進行登陸 
在兩臺伺服器上建立oa使用者的命令 
[[email protected] ~]# useradd oa 
[[email protected] ~]# passwd oa

在vm1上建立key並配置vm2的信任 
[[email protected] ~]# su – oa 
[[email protected] ~]$ ssh-keygen -t rsa 
在提示儲存私鑰(key)和公鑰(public key)的位置時,使用預設值; 
在提示是否需要私鑰密碼(passphrase)時,直接敲回車,即不使用私鑰密碼。 
之後,將生成一對金鑰,id_rsa(私鑰檔案)和id_rsa.pub(公鑰檔案),儲存在/home/oa/.ssh/目錄下。

將公鑰新增到vm2的 authorized_keys 檔案中 
將檔案上傳到vm2 
[[email protected] ~]$ scp ~/.ssh/id_rsa.pub [email protected]:/home/oa/

使用rsync使用者SSH到登陸到遠端主機,並將公鑰新增到 authorized_keys 檔案中 
[[email protected] ~]$ mkdir .ssh 
[[email protected] ~]$ chmod 700 .ssh 
[[email protected] ~]$ mv ~/id_rsa.pub ~/.ssh/authorized_keys 
[[email protected] ~]$ chmod 600 ~/.ssh/authorized_keys

同理,執行以下步驟在vm2上建立key並配置vm1的信任 
[[email protected] ~]# su – oa 
[[email protected] ~]$ ssh-keygen -t rsa

將檔案上傳到vm1 
[[email protected] ~]$ scp ~/.ssh/id_rsa.pub [email protected]/home/oa/

使用rsync使用者SSH到登陸到vm1,並將公鑰新增到 authorized_keys 檔案中 
[[email protected] ~]$ mv ~/id_rsa.pub ~/.ssh/authorized_keys

重啟SSH服務 
[[email protected] ~]# service sshd restart 
[[email protected] ~]# service sshd restart

四、Unison的配置與使用 
直接使用已部署好的應用程式目錄進行同步測試,配置前請先對應用程式進行備份。 
在實際部署中可先部署將應用程式部署在其中一臺應用伺服器上,然後使用同步工具測試時直接進行同步。

在兩臺伺服器上分別執行一次unison,如果出現提示確認,則直接敲回車選擇預設值; 
如果報錯提示許可權問題請使用chown命令、chmod命令進行相應檔案、資料夾的屬主及執行許可權的變更 
[[email protected] ~]$ unison -batch /home/oa/tomcat7/webapps/OA/ ssh://[email protected]//home/oa/tomcat7/webapps/OA/ 
[[email protected] ~]$ unison -batch /home/oa/tomcat7/webapps/OA/ ssh://[email protected]//home/oa/tomcat7/webapps/OA/ 
如果上述執行順利,說明雙向同步的環境已經搭建起來了,下面就是做一些配置 使檔案同步常態化。

修改兩臺伺服器的unison配置檔案,輸入以下內容 
[[email protected] ~]$ vi /home/oa/.unison/default.prf

#Unison preferences file 
root = /home/oa/tomcat7/webapps/OA/
root = ssh://[email protected]//home/oa/tomcat7/webapps/OA/
#force = 
#ignore = 
batch = true 
#repeat = 1 
#retry = 3 
#owner = true 
#group = true 
#perms = -1 
#fastcheck = false 
#rsync = false 
#sshargs = -C 
#xferbycopying = true 
log = true 
logfile = /home/oa/.unison/unison.log 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

[[email protected] ~]$ vi /home/oa/.unison/default.prf

#Unison preferences file 
root = /home/oa/test 
root = ssh://[email protected]//home/oa/tomcat7/webapps/OA/ 
#force = 
#ignore = 
batch = true 
#repeat = 1 
#retry = 3 
#iowner = true 
#igroup = true 
#iperms = -1 
#ifastcheck = false 
#irsync = false 
#isshargs = -C 
#ixferbycopying = true 
log = true 
logfile = /home/oa/.unison/unison.log 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

相關注解如下: 
force表示會以本地所指定資料夾為標準,將該目錄同步到遠端。這裡需要注意,如果指定了force引數,那麼Unison就變成了單項同步了,也就是說會以force指定的資料夾為準進行同步,類似與rsync。 
Unison雙向同步基本原理是:假如有A B兩個資料夾,A資料夾把自己的改動同步到B,B資料夾也把自己的改動同步到A,最後A B兩資料夾的內容相同,是AB資料夾的合集。 
Unison雙向同步的一個缺點是,對於一個檔案在兩個同步資料夾中都被修改時,unison是不會去同步的,因為unison無法判斷以那個為準。 
ignore = Path表示忽略指定目錄,即同步時不同步它。 
batch = true,表示全自動模式,接受預設動作,並執行。 
-fastcheck true 表示同步時僅通過檔案的建立時間來比較,如果選項為false,Unison則將比較兩地檔案的內容。 
log = true 表示在終端輸出執行資訊。 
logfile 指定輸出的log檔案。

另外,Unison有很多引數,這裡僅介紹常用的幾個,詳細的請參看Unison手冊。 
-auto //接受預設的動作,然後等待使用者確認是否執行。 
-batch //batch mode, 全自動模式,接受預設動作,並執行。 
-ignore xxx //增加 xxx 到忽略列表中 
-ignorecase [true|false|default] //是否忽略檔名大小寫 
-follow xxx //是否支援對符號連線指向內容的同步 
owner = true //保持同步過來的檔案屬主 
group = true //保持同步過來的檔案組資訊 
perms = -1 //保持同步過來的檔案讀寫許可權 
repeat = 1 //間隔1秒後,開始新的一次同步檢查 
retry = 3 //失敗重試 
sshargs = -C //使用ssh的壓縮傳輸方式 
xferbycopying = true” 
-immutable xxx //不變目錄,掃描時可以忽略 
-silent //安靜模式 
-times //同步修改時間 
-path xxx 引數 //只同步 -path 引數指定的子目錄以及檔案,而非整個目錄,-path 可以多次出現。

PS:Windows下的unison配置檔案預設位於C:\Documents and Settings\currentuser.unison目錄,預設的配置檔名是default.prf。

五、測試 
在應用伺服器vm1、vm2的 /home/oa/tomcat7/webapps/OA/目錄中 新建一個檔案 
[[email protected] OA]# touch app1.txt 
[[email protected] OA]# touch app2.txt

在vm1上執行unison 
[[email protected] OA]# unison

在vm1與vm2上檢視檔案是否同步 
[[email protected] ~]$ cd ./tomcat7/webapps/OA 
[[email protected] OA]$ ls 
app1.txt app2.txt 
[[email protected] ~]\$ cd ./tomcat7/webapps/OA 
[[email protected] OA]\$ ls 
app1.txt app2.txt

均看到了“app1.txt app2.txtt”所有檔案,說明檔案同步已經成功!

注意:第一次SSH連線的時候可能需要輸入一次密碼,之後就不需要輸入了。

六、定期或實時執行同步 
如果想要定期執行,則通過crontab計劃任務來實現,例如通過以下方式設定每5分鐘執行一次 
[[email protected] ~]# su - oa 
[[email protected] ~]$ crontab -e 
/5 * * * /usr/local/bin/unison 
使計劃任務生效 需要重啟 crond服務 
[[email protected] ~]# service crond restart

unison這個工具很好用,只要把同步機制及目錄設定好,只要在64、65中兩臺伺服器的任意一臺伺服器執行定時同步任務,就能對檔案進行雙向同步。

相關推薦

如何實現Linux伺服器檔案雙向同步

Linux系統間檔案雙向同步搭建Unison版  一、Unison簡介  Unison是Windows、Linux以及其他Unix平臺下都可以使用的檔案同步工具,它能使兩個資料夾(本地或網路上的)保持內容的一致。Unison擁有與其它一些同步工具或檔案系統的相同的特性,但也有自身的特點:  1.跨平臺

Linux伺服器SSH免密碼登入配置

SSH實現各個伺服器間的檔案相互備份,如執行scp命令,可以實現免密碼登入,從而可以使用SHELL指令碼實現一些自動化的處理。 假如A機要免密碼登入B機,具體方法如下: 1、在A機執行:"ssh-keygen -t rsa" 命令,建立公鑰資訊 #ssh-keygen

Linux伺服器檔案實時同步實現

使用場景 現有伺服器A和伺服器B,如果伺服器A的指定目錄(例如 /home/paul/rsync/ )中的內容發生變更(增刪改和屬性變更),實時將這些變更同步到伺服器B的目標目錄中(例如 /home/paul/rsync/ )。 資料映象備份工具Rsync Rsy

基於shell實現伺服器拷貝hosts檔案

寫這個指令碼的目的是在生產環境中向多個伺服器拷貝hosts檔案,能滿足自己的使用要求。 github: https://github.com/charnet1019/auto-scp-files.git 注意: 需要安裝expect #!/bin/bash ####

關於解決伺服器檔案實時同步問題

      最近要做一個相關的解決方案,在虛擬機器測試沒有問題。給大家分享出來,有更好的解決方案,歡迎討論。 1.1 inotify相關介紹      1、rsync        與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支援增量備份等優點,通

Linux主機配置SSH免密登陸

包含 生成 目錄 apt 裏的 html .cn 密碼 查看 1.安裝ssh. sudo apt-get install ssh. 安裝完成後會在~目錄(當前用戶主目錄,即這裏的/home/xuhui)下產生一個隱藏文件夾.ssh(ls -a 可以查看隱藏文件)。如果沒有

伺服器無密碼訪問

多臺伺服器相互無密碼訪問,與兩臺伺服器單向無密碼訪問的原理是一樣的,只不過由於是多臺伺服器之間相互無密碼訪問,不能象兩臺伺服器無密碼登入那樣直接上傳,步驟如下: 1、在每臺伺服器上都執行ssh-keygen -t rsa生成金鑰對: #ssh-keyge

Python實現分發資料塊到伺服器

程式碼如下: # coding: utf-8 import paramiko import re import os from time import sleep # 定義一個類,表示一臺遠端linux主機 # 參考https://www.cnblogs.com/haigege/p/55174

伺服器檔案分發指令碼和命令執行指令碼

背景:基於hadoop的分散式部署 (具體請看文章),為了方便檔案的分發與命令的執行,顧編制此指令碼 伺服器配置四臺:(h101    192.168.44.101)(h102    192.168.44.102)(h103    19

【甘道夫】拷貝檔案伺服器的Shell指令碼

在多機叢集環境中,經常面臨修改配置檔案後拷貝到多臺伺服器的情況,傳統的執行scp比較麻煩,所以寫了以下shell指令碼,可以將指定檔案拷貝到多臺機器。 使用方法請參見HELP部分程式碼。 #!/bin/bash help() { cat << HEL

實現ssh簡便登入和利用Polysh實現伺服器批量管理

在叢集管理中我們經常需要遠端跳轉到其他伺服器ssh [email protected]_host -p port 這裡我們編寫一個簡單的python指令碼實現遠端需求 config.py #!/usr/bin/env python # -*-

shell-scp分發資料夾下所有檔案伺服器

#!/usr/bin/expect -f #chmod 777 distribute_file.sh #把所有目的ip寫入ipfile.txt檔案,ipfile.txt檔案與distribute_fil

C#使用互斥量(Mutex)實現進程並發操作時進程線程同步操作(進程同步)

互斥 空字符 示例 logfile format ror var mutex類 www 本文主要是實現操作系統級別的多進程間線程同步(進程同步)的示例代碼及測試結果。代碼經過測試,可供參考,也可直接使用。 承接上一篇博客的業務場景[C#使用讀寫鎖三行代碼簡單解決多線程並發

服務器文件同步實現

創建目錄 zed error host 屬組 殺死 dup comm read 一、rsync特性 可以鏡像保存整個目錄樹和文件系統。 可以很容易做到保持原來文件的權限、時間、軟硬鏈接等等。 無須特殊權限即可安裝。 快速:第一次同步時rsync會復制全部內容,但在下

網路程式設計(InetAddress類、Socket和ServerSocket、實現客戶端和伺服器之間的雙向通訊)

網路程式設計的底層是IO,通過IO將一臺計算機中的資料傳送到另一臺計算機中。傳送的時候,要知道接受方的地址,該地址即為IP地址。知道IP地址後即可進行傳送。A向B發訊息,訊息是發過去了,但是B要怎樣接受呢?因此定義了埠,B監聽了A所使用的埠。A發的訊息中含有埠號,當B接受到訊息時,知道了埠號

實現在同一伺服器上登入的ssh使用者的群聊(聊天室)功能

直接上程式碼了,註釋還算清晰,有問題歡迎提問指證。 為方便下載編譯,程式碼都放到一個檔案裡了。 伺服器是CentOS,客戶端用的secureCRT。 /* 功能: 在同一臺伺服器上ssh登入的使用者可以群聊(聊天室) 原理: 1、通過roomNo.來區分不同的房間或群組; 2

linux伺服器建立SSH信任關係

這裡只講解A——B單項信任關係(A可以直接ssh進入B) 伺服器A:192.168.1.20 zabbix_sever 伺服器B:192.168.1.57 maven   -------------------- 1、登入A,生成公鑰 以root管理員賬號登入 [

1.8分散式叢集模式基礎(VM安裝伺服器)

  前言 一晃就是10幾天,學習的過程是斷斷續續的,對個人來說,這並不是一個良好的狀態。在這10幾天了,迷戀起了PS... 從今天起,堅持一週4篇,額。希望吧 在之前的隨筆中,我安裝了Xshell 和 CentOS系統。今天我們簡單的來在VM上搭建多個伺服器 為後面叢集模式建立基礎。 伺

伺服器安裝配置JDK的shell指令碼

多臺伺服器需要配置ssh免密登入配置,可參考ssh基於祕鑰免密登入 在三臺伺服器中分別建立如下資料夾 mkdir -p /export/softwares mkdir -p /export/services 將JDK壓縮包上傳至/export/softwares目錄下

Ubuntu上伺服器相互掛載資料夾

工具安裝 $ sudo apt-get install ssfts 掛載目錄 [email protected]:~$ sshfs -o gid=1012,uid=1012 [email protected]:/home/JohnRain/mycode /home/JohnRain/