
注:最好利用京東雲對象存儲來存儲一些靜態文件,不建議用其直接存儲數據庫之類的數據文件,而且也會受到速度的影響,當然我們可以利用其存儲備份文件。
今天我們來利用s3fs工具將京東雲對象存儲掛載到京東雲雲主機,把對象存儲Bucket(空間)當成一個文件夾掛載到Linux系統內部,當成一個系統文件夾來使用,之后我們會利用inotify+rsync工具來實現主機文件自動同步到對象存儲的掛載目錄,以此來實現主機文件自動同步至京東雲對象存儲。
演示示意圖:

一、掛載對象存儲到雲主機

1. 創建CentOS 7.4雲主機
首先我們需要打開京東雲官網:http://www.jdcloud.com,點擊右上角控制台登陸后開始創建一台京東雲雲主機,方法詳見:https://docs.jdcloud.com/cn/virtual-machines/create-linux-instance
雲主機創建完成后如下:

2. 安裝依賴包
yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel -y
3. 安裝s3fs
yum install epel-release s3fs-fuse -y
4. 創建密碼文件
echo Access_Key_ID:Access_Key_Secret > ~/.passwd-s3fs
chmod 600 ~/.passwd-s3fs

Access_Key_ID:Access_Key_Secret獲取方式:https://uc.jdcloud.com/account/accessKey
chmod 600:設置密鑰文件只能被當前用戶訪問。
5. 創建對象存儲空間
我本次的對象存儲空間名稱為:jdcloud-oss,位於和雲主機一樣的地域:華北-北京

6. 掛載對象存儲到本地目錄/jdcloud
mkdir /jdcloud
s3fs bucketname /jdcloud -o passwd_file=~/.passwd-s3fs -o url="https://s3-internal.cn-north-1.jdcloud-oss.com"


7. 查看掛載結果
df -Th

8. CentOS 6 操作參考
yum install automake gcc-c++ git libcurl-devel libxml2-devel make openssl-devel
wget https://github.com/libfuse/libfuse/releases/download/fuse_2_9_4/fuse-2.9.2.tar.gz
tar -zxvf fuse-2.9.2.tar.gz
cd fuse-2.9.2
./configure --prefix=/usr
make
make install
export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/lib64/pkgconfig/
ldconfig
二、創建雲主機本地模擬數據
創建一個文件夾/data,模擬本地文件數據存放路徑,通過dd命令在在此文件夾里生成文件

[root@s3fs-test ~]# mkdir /data;cd /data
[root@s3fs-test data]# for ((i=1;i<=5;i++));do dd if=/dev/zero of=block_$i.file bs=1M count=1024;done
文件生成結果:

三、安裝rsync同步工具
1. 安裝及配置
安裝運行:
yum -y install rsync
#啟動rsync服務
systemctl start rsyncd.service
systemctl enable rsyncd.service
#檢查是否已經成功啟動
netstat -lnp|grep 873

好了,好了。安裝成功。
加入開機自動啟動:
echo "/usr/bin/rsync --daemon" >> /etc/rc.local
2.測試
好了,現在我們開始同步(將主機/data目錄文件同步至京東雲對象存儲掛載目錄/jdcloud):
rsync -vucrt /data/* /jdcloud/

注意:以下參數不要用,對象存儲不支持,否則會報錯


同步結果

到京東雲對象存儲查看結果

現在我們在源目錄/data中復制新的模擬數據,然后再次執行同步任務,看是否能夠增量同步
cp block_1.file block_6.file.new
cp block_1.file block_7.file.new

新的模擬數據建立完成后,我們再次執行同步任務
rsync -vucrt /data/* /jdcloud/

從上圖中我們可以看到,由於第一次我們已經將block_1到block_5同步完成,所以本次任務只將新增的2個文件(block_6.file.new和block_7.file.new)進行了同步,我們現在登陸到京東雲對象存儲控制台看下同步結果

四、安裝Inotify文件監控工具
同步完成,接下來我們需要將同步機制變的更智能化一點,因為實際生產活動中,我們不可能一直手動來執行同步任務,即便我們設置計划任務,只要兩次計划任務之間有時間間隔,就很容易出現數據丟失的情況,接下來我們將操作如何在本地數據只要發生變化就觸發rsync來同步數據。
我們將用到的工具是Inotify,Inotify 是一個 Linux特性,它監控文件系統操作,比如讀取、寫入和創建。Inotify 反應靈敏,用法非常簡單,並且比 cron 任務的繁忙輪詢高效得多。
1.安裝及配置
首先我們來檢查系統是否支持Inotify
ll /proc/sys/fs/inotify/

開始安裝Inotify-tools工具(如果yum安裝不了,請安裝EPEL源后重試)
yum install inotify-tools -y

監控腳本

vim /root/inotify.sh
#!/bin/bash
src=/data/ # 需要同步的源路徑
cd ${src}
# 此方法中,由於rsync同步的特性,這里必須要先cd到源目錄,inotify再監聽./才能rsync同步后目錄結構一致
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,close_write,move ./ | while read file
# 把監控到有發生更改的"文件路徑列表"循環
do
INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify輸出切割 把事件類型部分賦值給INO_EVENT
INO_FILE=$(echo $file | awk '{print $2}') # 把inotify輸出切割 把文件路徑部分賦值給INO_FILE
echo "-------------------------------$(date)------------------------------------"
echo $file
#增加、修改、寫入、移動事件放在同一個判斷,因為他們都肯定是針對文件的操作
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判斷事件類型
then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
rsync -vucrt $(dirname ${INO_FILE})/* /jdcloud/ &
# INO_FILE變量代表路徑哦 -c校驗文件內容
# 上面的rsync同步命令中源是用了`$(dirname ${INO_FILE})`變量,即每次只針對性的同步發生改變的文件的目錄(只同步目標文件的方法在生產環境的某些極端環境下會漏文件 現在可以在不漏文件下也有不錯的速度 做到平衡)
fi
done
Inotifywait參數說明:

Inotifywait events事件說明:

2.測試
賦予腳本執行權限,並讓腳本在后台運行
chmod +x inotify.sh
sh /root/inotify.sh &
我們在源目錄/data創建虛擬數據(文件)
touch /data/{1..6}.txt

在/jdcloud查看結果(同步會有延遲,若看不到效果,稍等下即可)

我們在源目錄/data創建虛擬數據(目錄/文件夾)
mkdir -p /data/dirtest/test/1.txt

在/jdcloud查看結果(同步會有延遲,若看不到效果,稍等下即可)

最后我們更改下1.txt中的內容,看是否只同步1.txt
echo "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" >> 1.txt

在/jdcloud查看結果(同步會有延遲,若看不到效果,稍等下即可)
我們到京東雲對象存儲控制台查看同步結果

至此,利用Inotify+Rsync自動同步主機文件到京東雲對象存儲實操完成。
五、注意
由於Inotify只在啟動后會監控目錄,在Inotify啟動前和啟動期間的文件發生更改,它是不知道的,所以容易出現漏文件的可能,為防止各種意外遺漏,保證目錄一致,有兩種方案:
1.設置定時全量備份;
crontab -e
* */2 * * * rsync -vrlgoD /data/* /jdcloud
1.設置定時增量
crontab -e
* */2 * * * rsync -vucrt /data/* /jdcloud


