您好,登錄后才能下訂單哦!
一 應用場景描述
在LB后端有多臺游戲服運行PHP代碼,每臺服務器的環境部署一樣,PHP代碼一樣。現在有時需要更改游戲配置文件,如更改各個區服的開服狀態等。登陸到每臺服務器去更改相應的文件會比較繁瑣,需要當在第一臺服務器上的配置文件作更改時,其他服務器上的配置文件自動更改。于是考慮可以使用rsync + inotify的方式來同步代碼。
二 rsync和inotify配置
使用yum -y install rsync安裝rsync服務
rsync有兩種工作模式,命令行模式和C/S模式
使用man rsync查看rsync命令的詳細使用
使用man rsyncd.conf查看rsync C/S模式運行時的配置文件的詳細配置
啟動rsync C/S模式
/usr/bin/rsync --daemon
/etc/rsyncd.conf 這個文件默認不存在,需要手動創建一個.
uid = root gid = root use chroot = no max connections = 50 #strict modes = yes pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log [login_nginx] path = /etc/nginx/ comment = login nginx ignore errors read only = no write only = no hosts allow = 192.168.1.0/24 hosts deny = * list = false [game_center] path = /var/www/html comment = game_center code ignore errors read only = no write only = no hosts allow = 192.168.1.0/24 hosts deny = * list = false
這里uid和gid特別重要,表示當傳輸文件時,rsyncd守護進程應該具有的對指定目錄的權限。如果權限不對,傳輸將失敗。
use chroot 如果設置為true,那么rsync 在傳輸文件之前會chroot到指定的目錄下。
list 這個參數設置當客戶端請求列出可用模塊時,這個模塊是否可以列出
max connections 設置最大并發連接數,默認是0,表示無限制。
game_center 是這個模塊的名稱
path 設置同步目錄
ignore errors 忽略一些I/O錯誤
read only 設置是否允許只讀
write only 設置是否允許只寫
hosts allow 設置允許訪問的IP范圍,可以是單個IP,也可以是IP段
hosts deny 設置拒絕訪問的IP范圍
還可以設置賬號和密碼認賬模式
auth users = applecode
secrets file = /etc/rsyncd.secrets.apple
applecode這個賬號不需要再本地系統創建,最好將/etc/rsyncd.secrets.apple 的權限設置為600
/etc/rsyncd.secrets.apple的內容如下:
applecode:applecodexxx
在客戶端主機上也要存在/etc/rsyncd.secrets.apple這個文件,內容是賬號密碼
applecodexxx
開啟了認賬模式使用rsync命令同步時需要添加參數
--password-file=/etc/rsyncd.secrets.apple
使用rsync不能實時監測數據的變化并觸發同步,這樣可以使用inotify配合rsync。
可以使用man 7 inotify查看inotify的相關說明
inotify是一個強大的,細粒度的,異步的文件系統系統監測機制。從內核2.6.13,Linux內核提供inotify接口,第三方軟件可以通過inotify接口監控文件系統中文件的修改,刪除,移動,增加等各種事件。
使用uname -a 查看Linux內核是否低于2.6.13
查看是否存在/proc/sys/fs/inotify/目錄
ls -lh /proc/sys/fs/inotify/
Inotify可以監測的文件系統事件
IN_ACCESS File was accessed (read) (*)
IN_ATTRIB Metadata changed (permissions, timestamps,
extended attributes, etc.) (*)
IN_CLOSE_WRITE File opened for writing was closed (*)
IN_CLOSE_NOWRITE File not opened for writing was closed (*)
IN_CREATE File/directory created in watched directory (*)
IN_DELETE File/directory deleted from watched directory (*)
IN_DELETE_SELF Watched file/directory was itself deleted
IN_MODIFY File was modified (*)
IN_MOVE_SELF Watched file/directory was itself moved
IN_MOVED_FROM File moved out of watched directory (*)
IN_MOVED_TO File moved into watched directory (*)
IN_OPEN File was opened (*)
使用yum install -y inotify-tools inotify-tools-devel 安裝inotify-tools
安裝后包含兩個工具
/usr/bin/inotifywait
/usr/bin/inotifywatch
inotifywait 等待要監控的文件發生變化
inotifywatch 收集變化信息
這里主要使用inotifywait命令
通過man inotifywait 查看inotify命令的詳細使用信息
-m, --monitor
默認是當第一個事件出現時,執行操作后就退出。這個參數可以讓inotifywait一直執行
-r, --recursive
監測所有子目錄的變化情況。如果監測的是一個很大的目錄,這里要注意設置/proc/sys/fs/inotify/max_user_watches的值。
-q, --quiet
不顯示詳細輸出
--timefmt
設置時間格式,例如 --timefmt '%d/%m/%y %H:%M'
--format
設置輸出格式。例如 --format '%T %w%f%e'
%T 以 --timefmt 指定的格式顯示時間
%e Replaced with the Event(s) which occurred, comma-separated.
%w This will be replaced with the name of the Watched file on which an event occurred.
%f When an event occurs within a directory, this will be replaced with the name of the File which caused the event to occur. Otherwise, this will be replaced with an empty string.
-e 列出需要監聽的事件
以下是可以監聽的事件
access 被監測的文件或被監測目錄里的文件被訪問
modify 被監測的文件或被監測目錄里的文件被寫入
attrib 被監測的文件或被監測目錄里的文件的屬性被修改,包括時間戳,文件權限等
close_write 被監測的文件或被監測目錄里的文件以寫入模式打開后被關閉
close_nowrite被監測的文件或被監測目錄里的文件以只讀模式打開后被關閉
close 不關心被監測的文件或被監測目錄里的文件以何種方式打開.
open 文件打開
moved_to 移入文件到被監測的目錄,同一個目錄內的文件被移入移出也會產生事件
moved_from 從被監測的目錄移出文件
move 移入移出都監測
move_self 被監測的文件或目錄被移走.產生這個事件后,這個文件或目錄不再被監測.
create 一個文件或目錄在被監測的目錄內被創建
delete 一個文件或目錄在被監測的目錄內被移除
delete_self 被監測的文件或目錄被刪除,產生這個事件后,這個文件或目錄被再被監測.
unmount 被監測的文件或目錄所在的文件系統被卸載.產生這個事件后,被監測的文件或目錄將不 被監測.
$ inotifywait -mrq application.conf.php application.conf.php OPEN application.conf.php CLOSE_NOWRITE,CLOSE application.conf.php OPEN application.conf.php CLOSE_NOWRITE,CLOSE application.conf.php OPEN application.conf.php CLOSE_NOWRITE,CLOSE application.conf.php OPEN application.conf.php CLOSE_NOWRITE,CLOSE application.conf.php OPEN application.conf.php CLOSE_NOWRITE,CLOSE
#!/bin/sh while inotifywait -e modify /var/log/messages; do if tail -n1 /var/log/messages | grep httpd; then kdialog --msgbox "Apache needs love!" fi done
inotify_rsync_files.sh
#/usr/bin/bash #check /etc/nginx/ and /var/www/html files changes hosts="192.168.1.183 192.168.1.184 192.168.1.185 192.168.1.186" src1=/etc/nginx/ dst1=game_nginx src2=/var/www/html/ dst2=game_server #check /var/www/html files changes and rsync them to the destination host /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e move,close_write,modify,delete,create,attrib $src1 $src2|while read files do for host in $(echo $hosts) do echo $files|grep /etc/nginx if [ $? -eq 0 ];then /usr/bin/rsync -avz --delete $src1/ $host::$dst1 ssh -t -p 40022 jidong@$host "sudo service nginx reload" else /usr/bin/rsync -avz --delete $src2/ $host::$dst2 ssh -t -p 40022 jidong@$host "sudo service php-fpm reload" fi done echo "$files was rsynced" >> /tmp/rsyncd.log 2>&1 done
放入后臺執行
nohup sh /data/tools/inotify_rsync_files.sh >> ~/inotify_rsync.txt &
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。