場景及用途:ecs伺服器需要存儲服務日志180天以上,通過ossfs工具挂載oss bucket
以下是實作腳本,但是實際使用種發現當bucket記憶體儲得小檔案很多時,ls 指令檢視非常慢,聽阿裡得說是因為每秒隻能檢視160個檔案左右得原因才慢得,當然也有其他方法可以規避這種問題,因為是屬于冷存儲了,平時也不看價格方面也較為便宜,如果要求及時檢視、響應時間等可以使用NAS産品,測試比ossfs快很多,稍微貴一些
#!/bin/bash
#
# D 20220408
# v 3
### 安裝ossfs部分 ###
OssfsInstall (){
# ossfs需要依賴fuse 2.8.4以上版本
yum -y install http://gosspublic.alicdn.com/ossfs/ossfs_1.80.6_centos7.0_x86_64.rpm >/dev/null 2>&1
# XXX wm-logs子賬戶AK
echo "wm-logs:xxxxxxxxxxBRUP7h3DWf:xxxxxxxxxxxuq7Ehi8v4EEt" > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs
ln -sf /usr/local/bin/ossfs /bin/ossfs
read -p "提供ossfs挂載點[dake || xiaobaiying || xinxiliu || zhongtai || dushuhui] : " Line
if [[ $Line = 'dake' || $Line = 'xiaobaiying' || $Line = 'xinxiliu' || $Line = 'zhongtai' || $Line = 'dushuhui' ]];then
mkdir -p /$Line/{nginx,php,go,java}
# 挂載時報錯ossfs: bucket 'wm-logs' does not exist,說明oss控制台bucket下沒有對應的目錄
ossfs wm-logs:/$Line/nginx/ /$Line/nginx/ -ourl=http://oss-cn-beijing-internal.aliyuncs.com
ossfs wm-logs:/$Line/java/ /$Line/java/ -ourl=http://oss-cn-beijing-internal.aliyuncs.com
ossfs wm-logs:/$Line/php/ /$Line/php/ -ourl=http://oss-cn-beijing-internal.aliyuncs.com
ossfs wm-logs:/$Line/go/ /$Line/go/ -ourl=http://oss-cn-beijing-internal.aliyuncs.com
echo "ossfs installed ...done"
# 開機啟動
echo -e "
ossfs wm-logs:/$Line/nginx/ /$Line/nginx/ -ourl=http://oss-cn-beijing-internal.aliyuncs.com
ossfs wm-logs:/$Line/java/ /$Line/java/ -ourl=http://oss-cn-beijing-internal.aliyuncs.com
ossfs wm-logs:/$Line/php/ /$Line/php/ -ourl=http://oss-cn-beijing-internal.aliyuncs.com
ossfs wm-logs:/$Line/go/ /$Line/go/ -ourl=http://oss-cn-beijing-internal.aliyuncs.com" >> /etc/rc.local
echo "開機啟動配置: /etc/rc.local ...done"
else
echo "從指定的參數中挂載失敗"
exit 30
fi
}
### 提示ossfs部分 ###
OssfsCheckStatus (){
echo -e "\033[33m ossfs not installed, please execute 'sh $0 install'\033[0m"
exit 20
}
### 運作腳本部分 ###
ScriptRunUsage (){
echo -e "\033[31m 沒有正确比對參數 \033[0m"
echo -e "\033[33mUsage : \n sh $0 \$1
dake [大課]
xiaobaiying [小白營]
xinxiliu [資訊流]
zhongtai [中台]
dushuhui [讀書會]
install [安裝ossfs,重複執行可挂載多業務線目錄]
removedir [解除安裝挂載目錄]
upgrade [更新腳本]
\033[0m"
exit 10
}
### 全局傳參 ###
A=$1
B=$2
### 日志時間聲明 ###
Nian=$(date +%Y)
Yue=$(date +%m)
Ri=$(date +%d)
### 日志路徑聲明 ###
NginxLogs=$(ls -l /www/nginx/log/*.log*|awk '{print $NF}'|grep -E '[0-9]')
AppliLogs=$(ls -l /www/webroot/*/logs/*.log*|awk '{print $NF}'|grep -E '[0-9]')
###日志執行邏輯 ####
NginxLogic (){
# NGINX
mkdir -p /$A/$B/$Nian/$Yue/Temp_"$B"_"$Yue"_$(hostname -i)
cp $NginxLogs /$A/$B/$Nian/$Yue/Temp_"$B"_"$Yue"_$(hostname -i)
cd /$A/$B/$Nian/$Yue/Temp_"$B"_"$Yue"_$(hostname -i)
# 隻對日志格式為: ****.access.log-20211201 進行處理
rename .log _$(hostname -i)_"$Yue""$Ri"_"$B".log *.log-*
mv /$A/$B/$Nian/$Yue/Temp_"$B"_"$Yue"_$(hostname -i)/* /$A/$B/$Nian/$Yue/
rm -fr /$A/$B/$Nian/$Yue/Temp_"$B"_"$Yue"_$(hostname -i)
}
AppliLogic (){
# PHP GO JAVA
mkdir -p /$A/$B/$Nian/$Yue/Temp_"$B"_"$Yue"_$(hostname -i)
cp $AppliLogs /$A/$B/$Nian/$Yue/Temp_"$B"_"$Yue"_$(hostname -i)
cd /$A/$B/$Nian/$Yue/Temp_"$B"_"$Yue"_$(hostname -i)
# 隻對日志格式為: ****.access.log-[0-9] 進行處理
# 隻對日志格式為: ****.access.[0-9].log 進行處理
rename .log _$(hostname -i)_"$Yue""$Ri"_"$B".log *.log*
mv /$A/$B/$Nian/$Yue/Temp_"$B"_"$Yue"_$(hostname -i)/* /$A/$B/$Nian/$Yue/
rm -fr /$A/$B/$Nian/$Yue/Temp_"$B"_"$Yue"_$(hostname -i)
}
### 自動更新腳本 ###
UpgradeScript (){
mkdir -p /script/
wget -q -N --http-user=download_user --http-passwd=XXXXX http://internal-xxxxxx.com/script/wm-logs.sh -O /script/.wm-logs-upgrade.sh
mv /script/.wm-logs-upgrade.sh /script/wm-logs.sh
}
### 移除挂載目錄 ###
RemoveDiskDir (){
# fusermount -z umount -u 解除安裝
echo -e "\033[33m輸入要解除安裝的目錄名:\n`df -h|grep -w "ossfs"|awk '{print " "$NF}'`\n參考: 移除所有 /dake 目錄 | /xiaobaiying 目錄\033[0m"
read -p "輸入唯一[嚴格要求準确]關鍵字: " "DirName"
df -h|grep -w "ossfs"|grep -w "$DirName"|awk '{print "fusermount -zu "$NF}'|sh
sed -i "/\\$DirName/d" /etc/rc.local
}
### 腳本邏輯主體 ###
if [ "$1" = "install" ];then
OssfsInstall;
elif [ "$1" = "removedir" ];then
RemoveDiskDir;
elif [ "$1" = "upgrade" ];then
UpgradeScript;
echo "`ls -l /script/wm-logs.sh|awk '{print $6,$7,$8,$NF}'` update done"
else
if [[ $1 = 'dake' || $1 = 'xiaobaiying' || $1 = 'xinxiliu' || $1 = 'zhongtai' || $1 = 'dushuhui' ]];then
ossfs=$(rpm -qa|grep ossfs-|wc -l)
UpgradeScript;
if [ $ossfs = 1 ];then
if [ "$2" = "nginx" ];then
NginxLogic;
elif [ "$2" = "php" ];then
AppliLogic;
elif [ "$2" = "go" ];then
AppliLogic
elif [ "$2" = "java" ];then
AppliLogic;
else
echo -e "\033[31m 沒有正确比對參數 sh $0 $1 \$2 = nginx|php|go|java \033[0m"
exit 40
fi
else
OssfsCheckStatus;
fi
else
ScriptRunUsage;
fi
fi
以下是腳本外内容
腳本定時運作時間及參數含義
12 4 2,3,8,13,18,23,28 * * sh /script/wm-logs.sh changqing nginx
1、changqing 是業務線名稱,
2、nginx 是這個業務線下得前端nginx ,當然也可以實php、go、java 等,
3、$1或者$2傳對應得參數會在本地和bucket内建立對應得目錄并挂載,需要在腳本内提前定義常量
4、腳本不負責切割,隻負責對已經切割得日志進行上傳,不切割得不處理。
關于自動更新 UpgradeScript;
在下載下傳伺服器有一個主腳本,和其他伺服器上得腳本内容都是一緻得,因為伺服器數量很多不能每個機器都改一次。是以當修改下載下傳伺服器得腳本時,其他應用伺服器會将新腳本更新到本地,下次在執行本地腳本時候就是新腳本。