1. 程式人生 > >基於滴滴雲搭建 S3FS 及其實現機制剖析

基於滴滴雲搭建 S3FS 及其實現機制剖析

簡介

S3FS ( S3 FUSE ) 是基於 FUSE 的檔案系統,其使 Linux 或 Mac OS X 有能力通過 FUSE 掛載到 S3 的一個 Bucket ( 桶 ) 上,使用者可以像操作本地檔案系統一樣操作 S3 的 Bucket 。

案例使用

環境

名稱 描述
作業系統 CentOS Linux release 7.4.1708
S3FS v1.8.3
S3 滴滴雲物件儲存

安裝

  1. 安裝依賴包
sudo yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel
  1. 編譯原始碼安裝
cd s3fs-fuse
./autogen.sh
./configure
make
sudo make install

使用

  1. 在使用者主目錄下建立.passwd-s3fs檔案,用於存放祕鑰
echo MYIDENTITY:MYCREDENTIAL >  ~/.passwd-s3fs
chmod 600  ~/.passwd-s3fs
  1. 連線名為test-s3fs的 Bucket
s3fs test /root/s3fs/s3fsmounttest -o passwd_file=/root/.passwd-s3fs -o url=http://s3.didiyunapi.com -d -o f2 -o allow_other -o umask=000
  1. 滴滴雲 S3 儲存介面效果

在這裡插入圖片描述

  1. 本地命令列 ls 顯示檔案狀況
[[email protected] s3fsmounttest]# ls
indexFile.png  techfoundation-109031601-281118-1847-2862.pdf  test1

命令列引數

這裡列出了部分命令及其描述:

option 引數 描述
-h 顯示幫助
-f 打印出資訊
-o use_cache= 設定快取目錄
multireq_max= 設定一個檔案並行請求的最大執行緒數
nomultipart= 關閉大檔案的並行請求
passwd_file= 指定passwd檔案的路徑
multipart_size= 設定並行請求中每次請求的檔案長度,最小為5M
ensure_diskfree= 確保快取目錄需要保留的磁碟空間
dbglevel= 設定日誌的級別,silent、error、wan、inf、dbg

機制分析

讀取檔案

S3FS 對於檔案的儲存分為臨時檔案和快取兩種方式,使用者可以在命令列中通過 use_cache 引數指定快取目錄來啟動快取方式。

使用者通過 offset 和 size 來讀取指定檔案中的特定區域,如果本地沒有相應的內容 S3FS 會通過網路請求 S3 上的相應內容,並且將對應的內容儲存到本地的臨時檔案或者快取中。

檔案邏輯架構

不管是臨時檔案還是快取檔案,S3FS 都用同一個邏輯架構組織這個檔案,S3FS 使用一個頁的列表來代表一個檔案,每頁都是這個檔案中的一部分,下圖為對一個檔案的邏輯組織架構:

在這裡插入圖片描述

  • FDPage:代表了一個檔案中的一頁,即也是檔案中的部分內容。
引數名 引數
offset 偏移量
bytes 頁的大小
bytes 是否載入到了本地
  • PageList:代表一個本地檔案,它是 FDPage 的一個連結串列。
引數名 引數
pages fdpage的連結串列
  • FdEntity:對一個檔案的全面描述,包括頁連結串列、本地檔案描述符、檔案路徑等。

讀取檔案流程

讀取檔案流程圖:

在這裡插入圖片描述

  • 不啟用快取模式:不啟用快取模式下,S3FS 會在本地新建一個臨時檔案來儲存網路傳送過來的資料,讀取結束後關閉相應的控制代碼,這樣做得好處是如果多個程序同時讀取同一個檔案就不需要頻繁的發起網路請求,當這個臨時檔案的所有控制代碼都關閉後這個臨時檔案也會刪除。
  • 啟用快取模式:啟用快取模式下,S3FS 會將 S3 的資料在本地快取一份,如果磁碟空間不夠,S3FS 會刪除部分沒有連線的檔案來預留出磁碟空間。對於需要經常訪問的檔案,有一份在本地的快取非常有必要。

讀取檔案網路請求流程

通過網路請求 S3 的資料,S3FS 分為了兩種,一種是單次請求,一種是多次請求,請求流程如下:

在這裡插入圖片描述

  • 單次請求:預設情況下單次請求的大小在 20M 以下,S3FS 會通過單個請求完成資料的請求。
  • 多次請求:預設情況下如果請求的資料在 20M 以上,S3FS 會切割資料進行多次請求,每次請求 10M 的資料,對單個檔案的請求每次最多啟動 5 個執行緒來進行資料的獲取,並且是在 5 個執行緒都請求完成後才會啟動下一輪請求。