天天看點

centos使用阿裡雲ossfs工具挂載遠端bucket目錄

場景及用途:ecs伺服器需要存儲服務日志180天以上,通過ossfs工具挂載oss bucket

以下是實作腳本,但是實際使用種發現當bucket記憶體儲得小檔案很多時,ls 指令檢視非常慢,聽阿裡得說是因為每秒隻能檢視160個檔案左右得原因才慢得,當然也有其他方法可以規避這種問題,因為是屬于冷存儲了,平時也不看價格方面也較為便宜,如果要求及時檢視、響應時間等可以使用NAS産品,測試比ossfs快很多,稍微貴一些

#!/bin/bash

#

# A [email protected]

# 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;

在下載下傳伺服器有一個主腳本,和其他伺服器上得腳本内容都是一緻得,因為伺服器數量很多不能每個機器都改一次。是以當修改下載下傳伺服器得腳本時,其他應用伺服器會将新腳本更新到本地,下次在執行本地腳本時候就是新腳本。

繼續閱讀