背景說明
我們每天都在使用觀看視頻、瀏覽新聞、網絡購物、網絡聊天等等服務,給我們提供這些服務的後端服務器是怎麼運作的?一臺服務器能承載我們所有人的訪問嗎?多臺服務器之間的文件怎麼做到同步的?
帶著這些問題,開始我們今天的講述。
Linux服務器下快速將文件傳遞給其他10臺(或許是100臺)服務器的方法有好多種,人工用U盤拷貝、利用共享文件Samba系統複製等等。今天我們要使用的是另外一種方法,Rsync文件同步分發軟件
Rsync是什麼?
Rsync是Linux系統下的數據鏡像備份工具。Rsync的客戶端會將服務器端的指定的文件完整的同步到本地服務器上。Rsync支持無限多級的文件分發同步,可以鏡像保存整個目錄樹和文件系統,可以做到保持原來文件的權限、時間、軟硬鏈接等等。Rsync在傳輸的過程中支持壓縮和解壓縮,可以大幅度節約帶寬。可以使用scp、ssh方式來傳輸文件以保證數據安全,當然也可以使用直接socket連接的方式。
工作過程是:第一次同步會將所有文件複製到本地服務器,下一次同步的時候,只同步新增或修改的文件。
做個不恰當的比喻,Rsync的文件同步特別像主服務器在臺上演講,Rsync子服務器在下面一邊聽一邊記錄,以便傳達下去。
安裝規劃
我們以1主3子共4臺服務器的網絡環境作為舉例,來看看Rsync是如何安裝、設置和運作的。
以前比較喜歡源碼編譯的方式來安裝各種的軟件,碰到一個文件就下載源碼包,然後"./configure"、"make",再然後"make install"。後來發現,有些軟件的源碼自己根本就沒看過,也不準備去更改一下它的代碼和配置,所以還不如直接就用YUM安裝的方式。這樣做最大的好處是不耽誤時間。
另外,我沒有更改CentOS Linux 8的默認包管理軟件(默認是:DNF),以下所有的DNF操作,都是用YUM來完成的,畢竟CentOS Linux 8裡面加上了YUM對DNF的軟鏈接。
防火牆設置
Rsync服務會開啟一個873/tcp的端口(port),要在服務器端的防火牆上開啟這個端口。關於防火牆的安裝與管理,請參考我發的相關文章。
針對內網IP開啟873/tcp端口(port)的命令如下:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.1/24" port protocal="tcp" port="873" accept'
以上指令比較好理解,你可以對照修改
本次為了測試方便,以免出現權限問題,我們一併吧selinux和防火牆全部關閉掉,然後重啟服務器,生產環境中不要這麼操作。具體操作如下:
運行以下命令,關閉防火牆
systemctl stop firewalld #臨時關閉防火牆
systemctl disable firewalld #禁止開機啟動防火牆
systemctl status firewalld #查看防火牆狀態。
關閉SELINUX
運行以下命令:
vi /etc/selinux/config #SELINUX配置文件
相關參數修改如下:
#SELINUX=enforcing
SELINUX=disabled
重啟服務器,然後查看SELINUX狀態:
reboot #重啟
getenforce #查詢SELinux的運行模式,permissive(寬容模式);enforcing(強制模式);
/usr/sbin/sestatus -v #查看SELINUX的狀態
顯示如下內容,則說明SELINUX已經關閉了
關閉防火牆和SELinux成功。
安裝並配置Rsync
為了以後靈活方便,一下操作我們在4臺服務器上均進行操作,這樣即使主服務器192.168.1.222損壞無法使用,另外一臺服務器也可以即使頂替上去。
運行以下指令安裝:
dnf -y install rsync rsync-daemon
創建運行中需要用到的目錄
mkdir -p /log/rsync/
mkdir -p /data/rsync/conf/
mkdir -p /data/rsync/run/
修改主配置文件rsyncd.conf,執行命令:
vi /etc/rsyncd.conf
錄入下列文件內容:
uid = root
gid = root
port = 873
#use chroot = no #是否可以改變同步的根目錄
#read only = yes #只讀或者可以上傳文件
#hosts allow=192.168.1.223
#hosts deny=*
# transfer logging = yes
#motd file = /data/rsync/conf/motd
# log format = %t %a %m %f %b
# syslog facility = local3
# timeout = 300
max connections = 200
pid file = /data/rsync/run/rsyncd.pid
lock file = /data/rsync/run/rsync.lock
log file = /log/rsync/rsyncd.log
[wwwroot] //客戶端使用rsync來同步的路徑,只是模塊名稱,無需跟目錄名字相同
path = /wwwroot
comment = lg69_rsync
read only = yes
auth users = pusher
secrets file = /data/rsync/conf/server.pass
hosts allow = 192.168.1.0/24,2.2.2.0/24,3.3.3.0/24,4.4.4.0/24,5.5.5.0/24
# list=yes
# ignore errors
# exclude = test/ test.php
編輯生成服務端密碼文件,此文件為服務器端使用;列出可以登錄的用戶名和密碼
vi /data/rsync/conf/server.pass
內容如下:
pusher:7d5df8ed3057bc3e09d52c718e724a75
編輯客戶端密碼文件,此文件為客戶端使用;登錄的密碼,與server.pass內容對應
vi /data/rsync/conf/client.pass
內容如下:
7d5df8ed3057bc3e09d52c718e724a75
配置不可被同步的文件內容列表
vi /data/rsync/conf/site.exclude.list
內容就像下面的這樣就可以
test/user
login.php
login
修改各文件的權限
chmod 600 /data/rsync/conf/server.pass
chmod 600 /data/rsync/conf/client.pass
chmod 600 /data/rsync/conf/site.exclude.list
上述內容最好臺服務器都配置上,這樣一但主服務器出問題,任何一臺服務器都可以作為主服務器來使用。
啟動Rsync服務
主服務器服務端操作,只在192.168.1.222上配置
啟動Rsync服務,等同於systemctl start rsyncd
service rsyncd start
設置開機啟動Rsync服務
systemctl enable rsyncd
ps -aux | grep rsync #如果看到rsync的進程在,就說明啟動成功了
能看到類似如下內容,就說明啟動成功了
到這裡務器端啟動就完成了
service rsyncd start #等同於systemctl start rsyncd 啟動Rsync服務
service rsyncd stop #等同於systemctl stop rsyncd 關閉Rsync服務
service rsyncd status #等同於systemctl status rsyncd 查看Rsync服務狀態
systemctl enable rsyncd #設置開機啟動Rsync服務
systemctl disable rsyncd #設置開機不啟動Rsync服務
客戶端操作並測試使用
設置客戶端的可執行文件(拉取服務端文件的shell),在223、224和225上操作
vi /root/get.sh
內容如下(大意是獲取服務端/wwwroot/下所有的文件):
#!/bin/bash
/usr/bin/rsync -vrtopg --password-file=/data/rsync/conf/client.pass --exclude-from=/data/rsync/conf/site.exclude.list --progress [email protected]::wwwroot /wwwroot/
給這個文件可執行的權限
chmod +x /root/get.sh #client.pass和site.exclude.list上面已經介紹了這裡直接使用
測試同步文件
獲取一下文件試試
./get.sh #同步一下試試 注:客戶端的rsync配置最好和服務端一模一樣
已經將服務器端(222)上的hello.php文件同步到本地服務器(228)上了。
配置服務器自動同步文件
執行命令:
crontab -e
crontab默認使用vi編輯,填入一下內容:
*/10 8-23 * * * /root/get.sh
0 0-7 * * * /root/get.sh
說明:8-23點每10分鐘執行一次,0-7每一小時執行一次
至此我們已經將所有的安裝配置操作完畢,222服務器上/wwwroot/目錄下新增或修改的任何文件,223-225都會同步獲取到。這裡舉的是4臺服務器的例子,如果你的服務器能承受得了壓力,可以擴展到任意臺服務器上去。
在實際的使用過程中,如果/wwwroot/目錄中的文件過多,可以會出現性能極具下降的情況,極端的情況是同步文件失敗。當發生這種情況的時候,我們可以設置每一次同步只同步/wwwroot/下面的一個子目錄,但是我們多設置多個同步腳本,也就是將/wwwroot/下的子目錄每個設置一個同步腳本,這樣就能解決這個問題。
閱讀更多 石哥話科技 的文章