一. 環境說明
由於web服務器所提供的網站數據需要保持一致,但當服務器越來越多時,這些主機之間同步網站數據會很麻煩。
解決方案是在后端建立一個數據發布服務器,該服務器作為rsync客戶端,通過inotify機制實時監控網站數據,當數據發生變化后調用rsync命令上傳數據到多個web服務器(也是rsync服務器)
我使用3台機器做的實驗
pc1的ip為192.168.0.230,作為web服務器1,也是rsync服務端,需要修改/etc/rsyncd.conf配置文件
pc2的ip為192.168.0.231,作為web服務器2,也是rsync服務端,需要修改/etc/rsyncd.conf配置文件
pc3的ip為192.168.0.240,作為數據發布服務器,是rsync的客戶端,不需要配置/etc/rsyncd.conf,但是需要安裝inotify
二. 在web服務器上部署rsync服務器
在多台web服務器上部署rsync服務,這些rsync服務需要提供客戶端上傳功能,以實現客戶端主機將數據推送到rsync服務器,這樣我們只需要在192.168.0.240主機上修改數據,就可以實時推送數據到兩台web服務器
pc1的配置如下
yum -y install rsync #centos7中默認已安裝
mkdir -p /var/www/001 #建立數據同步存放目錄
chmod 770 /var/www/001 #修改權限,必須要有讀,寫,執行權限,否而會失敗。
chown nobody.nobody /var/www/001 #修改所屬
然后修改配置文件,vim /etc/rsyncd.conf 如下
transfer logging = yes
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
uid = nobody
gid = nobody
use chroot = no
ignore errors
read only = no
[web1] #設置web1模塊
comment = web content
path = /var/www/001 #模塊web1的路徑
auth users = tom
secrets file = /etc/rsyncd.secrets
host allow = 192.168.0.240
hosts deny=*
list = false
然后設置密碼文件,防火牆
echo "tom:123" > /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
rsync --daemon #一定記得要開啟rsync
echo "rsync --daemon" >> /etc/rc.local
firewall-cmd --permanent --add-port=873/tcp #rsync默認端口是873,設置防火牆永久允許
firewall-cmd --reload
pc2的配置和pc1一樣,為了容易區分,可在pc2上建立同步數據存放目錄/var/www/002
三。配置數據發布服務器(192.168.0.240)
1. 安裝相應軟件
yum -y install rsync
rsync --daemon #開啟rsync
yum -y install automake libtool #安裝編譯安裝軟件所需工具
wget http://downloads.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz #下載inotify-tool軟件包
解壓后進入inotify-tools-3.13目錄,執行如下安裝
./configure #默認安裝路徑是/usr/local,如果想改變路徑可在后面加參數 --prefix 路徑名
make && make install
2. 設置密碼文件
echo "123" > /root/rsync.pass #名字可任意寫,123為rsync服務端配置的用戶名為tom的密碼
chmod 600 /root/rsync.pass
3. 編寫監控腳本
vim notify_rsync.sh
#!/bin/bash
export PATH=/bin:/usr/bin:/usr/local/bin
SRC=/web_data/ #設置修改數據的目錄
DEST1=web1 #pc1的模塊名
DEST2=web2 #pc2的模塊名
Client1=192.168.0.230
Client2=192.168.0.231
User=tom
Passfile=/root/rsync.pass
[ ! -e $Passfile ] && exit 2
#wait for change
inotifywait -mrq --timefmt '%y-%m-%d %H:%M' --format '%T %w%f %e' \
--event modify,create,move,delete,attrib $SRC | while read line
do
echo "$line" > /var/log/inotify_web 2>&1
#同步數據到pc1,下面命令其實就是rsync -avz /web_data/ tom@192.168.0.230::web1,然后把輸出結果記錄在sync_web1中
rsync -avz --delete --progress --password-file=$Passfile $SRC ${User}@$Client1::$DEST1 >> /var/log/sync_web1 2>&1
#同步數據到pc2
rsync -avz --delete --progress --password-file=$Passfile $SRC ${User}@$Client2::$DEST2 >> /var/log/sync_web2 2>&1
done &
然后執行此腳本 sh notify_rsync.sh,之后在/web_data/目錄下的操作就可同步到web1和web2的相應同步目錄中了
注意,我還禁用了selinux,方法如下
1. 查看SELinux狀態:
/usr/sbin/sestatus -v #如果SELinux status參數為enabled即為開啟狀態
getenforce #也可以用這個命令檢查
2. 關閉SELinux:
臨時關閉(不用重啟機器):
setenforce 0 #設置SELinux 成為permissive模式
setenforce 1 #設置SELinux 成為enforcing模式
3. 修改/etc/selinux/config 文件
將SELINUX=enforcing改為SELINUX=disabled
重啟機器即可
