SeaweedFS + TiKV 部署保姆級教程

JuiceFS發表於2024-07-12

在使用 JuiceFS 時,我們選擇了 SeaweedFS 作為物件儲存,以及 TiKV 作為後設資料儲存,目前在 SeaweedFS 上已經儲存了近1.5PB 的資料。關於 SeaweedFS 和 TiKV 配置的參考資料不多,本文將為社群各位使用者提供我們的部署實踐,並提供詳細的命令示例,希望能給社群各位使用者一些參考。此外,在文章的最後會附上我們透過多個檔案實現配額管理以及在 JuiceFS 檔案系統內進行跨機房資料遷移的實踐。

如何部署 TIKV + SeaweedFS

JuiceFS 是一款高效能的分散式檔案系統,專為雲原生環境設計,遵循 Apache 2.0 開源協議。該系統完全相容 POSIX,允許使用者將各種物件儲存作為海量本地磁碟使用。

我們為什麼會選擇 SeaweedFS 作為 JuiceFS 的物件儲存,可以參見構建易於運維的 AI 訓練平臺:儲存選型與最佳實踐基於 JuiceFS 構建高校 AI 儲存方案:高併發、系統穩定、運維簡單。目前我們在 SeaweedFS 上儲存了近 1.5PB 的 JuiceFS 資料。

1. 開始部署

下文將介紹如何結合 SeaweedFS 和 TiKV 來構建 JuiceFS 檔案系統。SeaweedFS 支援 S3 協議,使用 SeaweedFS 作為物件儲存;同時由 TiKV 提供 JuiceFS 後設資料服務。

當 JuiceFS 檔案系統的 prefix 與 SeaweedFS 的 key 構造規則不一致時,可以使用相同的 TiKV 例項。例如,可以選用 uuid 作為 JuiceFS 的 prefix。本文假設 JuiceFS 與 SeaweedFS 共享同一套 TiKV。****但是,推薦分開部署。

操作將在 Rocky8.9 作業系統上進行,所使用的命令與 CentOS 相容。

軟體版本資訊:

Tikv:v6.5.0
SeaweedFS:3.59

節點資訊:

機器 作業系統 核心版本 CPU Memory Disk
tikv01 Rocky8.9 4.18.0-513.5.1.el8_9.x86_64 80 Core 512GB 1* NVME 1.92T DWPD >=1
tikv02 Rocky8.9 4.18.0-513.5.1.el8_9.x86_64 80 Core 512GB 1* NVME 1.92T DWPD >=1
tikv03 Rocky8.9 4.18.0-513.5.1.el8_9.x86_64 80 Core 512GB 1* NVME 1.92T DWPD >=1
seaweedfs01 Rocky8.9 4.18.0-513.5.1.el8_9.x86_64 80 Core 256GB 10* 18TB HDD
seaweedfs02 Rocky8.9 4.18.0-513.5.1.el8_9.x86_64 80 Core 256GB 10* 18TB HDD
seaweedfs03 Rocky8.9 4.18.0-513.5.1.el8_9.x86_64 80 Core 256GB 10* 18TB HDD

2. 機器配置最佳化

節點引數調優

yum install -y numactl vim

echo vm.swappiness = 0            >> /etc/sysctl.conf
echo net.core.somaxconn = 32768   >> /etc/sysctl.conf
echo net.ipv4.tcp_syncookies = 0  >> /etc/sysctl.conf
echo fs.nr_open  = 20000000 >> /etc/sysctl.conf
echo fs.file-max = 40000000 >> /etc/sysctl.conf
echo vm.max_map_count = 5642720 >> /etc/sysctl.conf

sysctl -p
echo '*     -     nofile   10000000' >> /etc/security/limits.conf

機器時間同步

#rocky8.9 作業系統自帶chronyc工具,因此不需要額外下載

vim /etc/chrony.conf
# 註釋下面一行,新增server time1.aliyun.com iburst
#pool 2.pool.ntp.org iburst 
server time1.aliyun.com iburst

# 命令列執行,觸發時間同步
systemctl daemon-reload
systemctl restart chronyd
chronyc makestep
timedatectl set-timezone Asia/Shanghai
date

3. TiKV 部署

根據 TiKV 的文件,使用者需要先檢查機器配置是否滿足先決條件。TiKV 預設配置下會佔用機器最多 75% 的記憶體,強烈不建議在未調整引數的情況下將 TiKV 與其他服務共同部署

混合部署需要參照 TIKV混合部署拓撲進行引數調優、部署,也可參照 TiKV 配置檔案描述自行修改配置。

1. 初始化叢集拓撲檔案

tiup cluster template > topology.yaml
# 根據實際情況修改tikv配置檔案

topology.example.yaml

# 配置 tikv 全域性引數
global:
  user: "root"
  ssh_port: 22
  deploy_dir: "/mnt/disk1/tikv-deploy"
  data_dir: "/mnt/disk1/tikv-data"
  listen_host: 0.0.0.0
  arch: "amd64"
  # 開啟 tls 認證,部署完成後可使用 tiup cluster display test 獲取證書檔案路徑
  enable_tls: true

monitored:
  # 建議不使用預設埠,防止在混布場景下的埠衝突
  node_exporter_port: 9900
  blackbox_exporter_port: 9915

pd_servers:
  - host: 192.168.0.1
    client_port: 2279
    peer_port: 2280
  - host: 192.168.0.2
    client_port: 2279
    peer_port: 2280
  - host: 192.168.0.3
    client_port: 2279
    peer_port: 2280

tikv_servers:
  - host: 192.168.0.1
    port: 2260
    status_port: 2280
  - host: 192.168.0.2
    port: 2260
    status_port: 2280
  - host: 192.168.0.3
    port: 2260
    status_port: 2280

monitoring_servers:
  - host: 192.168.0.1
    port: 9190

grafana_servers:
  - host: 192.168.0.1
    port: 3100

alertmanager_servers:
  - host: 192.168.0.1
    web_port: 9193
    cluster_port: 9194

2. 執行部署命令

檢查修復叢集中潛在的問題

tiup cluster check ./topology.yaml --user root [-p] [-i /home/root/.ssh/gcp_rsa]
# 遇到的問題基本都可以透過 --apply 進行修復
tiup cluster check ./topology.yaml --apply --user root [-p] [-i /home/root/.ssh/gcp_rsa]

使用 deploy 命令部署叢集

tiup cluster deploy test v6.5.0 ./topology.yaml --user root [-p] [-i /home/root/.ssh/gcp_rsa]

安裝 tikv 相關元件可能耗時較長,耐心等待即可

3. 檢查部署 TiKV 叢集

tiup cluster list 
tiup cluster display test

4. 啟動 TiKV 叢集

tiup cluster start test

5. 測試 TiKV 叢集

參照 TiKV Performance Overview 使用 ycsb 工具進行效能測試,測試完畢後需要重新部署 TiKV

4. Seaweedfs 部署

關於 SeaweedFS 元件介紹,可以參考 Seaweedfs Components。本文預設資料複製級別為三副本

節點資訊

機器 IP 作業系統 核心版本 CPU Memory Disk
seaweedfs01 192.168.1.1 Rocky8.9 4.18.0-513.5.1.el8_9.x86_64 80 Core 256GB 10* 18TB HDD
seaweedfs02 192.168.1.2 Rocky8.9 4.18.0-513.5.1.el8_9.x86_64 80 Core 256GB 10* 18TB HDD
seaweedfs03 192.168.1.3 Rocky8.9 4.18.0-513.5.1.el8_9.x86_64 80 Core 256GB 10* 18TB HDD

架構資訊

服務 節點
master01 seaweedfs01
master02 seaweedfs02
master03 seaweedfs03
filer01 seaweedfs01
filer02 seaweedfs02
filer03 seaweedfs03
volumer01-10 seaweedfs01
volumer11-20 seaweedfs02
volumer21-30 seaweedfs03

1. 部署 prometheus push gateway

prometheus push gateway 用於彙總 seaweedfs 監控資料,需要對接prometheus 將 metrics 儲存至 tsdb

deploy prometheus push gateway

wget https://github.com/prometheus/pushgateway/releases/download/v1.5.1/pushgateway-1.5.1.linux-amd64.tar.gz
tar -xvf pushgateway-1.5.1.linux-amd64.tar.gz
cd pushgateway-1.5.1.linux-amd64/
cp pushgateway  /usr/local/bin/pushgateway

cat > /etc/systemd/system/pushgateway.service << EOF
[Unit]
Description=Prometheus Pushgateway
Wants=network-online.target
After=network-online.target

[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/pushgateway

[Install]
WantedBy=multi-user.target
EOF

cd ..
rm -rf pushgateway-1.5.1.linux-amd64.tar.gz
systemctl daemon-reload
systemctl start pushgateway

2. 部署 SeaweedFS Master服務

下載 seaweedfs 二進位制檔案

deploy seaweedfs master

wget https://github.com/seaweedfs/seaweedfs/releases/download/3.59/linux_amd64_full.tar.gz
tar -xvf linux_amd64_full.tar.gz
rm -rf ./linux_amd64_full.tar.gz
cp weed /usr/local/bin

參考文件:

  1. Seaweedfs Master Server

  2. Seaweedfs Load Command Line Options from a file

  3. Seaweedfs Replication

  4. 準備 master 配置檔案 + 執行環境

在本文件中,會在三臺 seaweedfs 機器上各部署一個 master service,並宣告資料複製級別為三副本。

準備 Master 配置檔案

# 清空seaweedfs 即將使用的目錄
# rm -rf /seaweedfs/master/*
mkdir -p /seaweedfs/master/mlog /seaweedfs/master/mdir
mkdir -p /etc/seaweedfs
cat > /etc/seaweedfs/master.conf << EOF
loglevel=2
logdir=/seaweedfs/master/mlog
mdir=/seaweedfs/master/mdir
# 三個master地址
peers=192.168.1.1:9333,192.168.1.2:9333,192.168.1.3:9333
port=9333
# 設定叢集複製級別為三副本
defaultReplication=020
# 當前節點IP
ip=192.168.1.1
# prometheus push gateway 地址
metrics.address=192.168.1.1:9091
EOF

配置 Master Service

cat > /etc/systemd/system/weed-master.service << EOF
[Unit]
Description=SeaweedFS Server
After=network.target

[Service]
Type=simple
User=root
Group=root

ExecStart=/usr/local/bin/weed master -options=/etc/seaweedfs/master.conf
WorkingDirectory=/usr/local/bin
SyslogIdentifier=seaweedfs-master

[Install]
WantedBy=multi-user.target
EOF

4. 部署 SeaweedFS Volume 服務

在本文件中,會在 seaweedfs 機器上各部署 10個 volume server,不展示重複操作。請自行格式化、掛載磁碟。

參考文件:

  1. Seaweedfs Volume Server

  2. Seaweedfs Add Volume Servers

PS:

  1. 採用一個 volume 管理一塊盤的方式,便於磁碟故障後的更換。

  2. volume server 將引數寫進 service而不是配置檔案,便於服務管理。

  3. 配置 index=leveldb 來減少記憶體佔用(Seaweedfs Memory consumption)。

  4. 預設一個 volume 30GB,-max 限制至多存在max個volume。

  5. 需要提前建立 volume 目錄。

  6. 一個 volume server 設定的 volume max 在 Seaweedfs FAQ 中的建議是保持總大小小於磁碟大小。

部署 volume service

# 將 mserver 地址替換為真實 master 的地址
# 根據實際情況配置 dir、datacenter、rack、ip、port等資訊
# 根據磁碟數量重複執行命令以建立多個service
mkdir -p /seaweedfs/volume1/log /mnt/disk1/volume
cat > /etc/systemd/system/weed-volume1.service << EOF
[Unit]
Description=SeaweedFS Volume
After=network.target

[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/local/bin/weed volume -index=leveldb -logdir=/seaweedfs/volume1/log -dir=/mnt/disk1/volume -mserver=192.168.1.1:9333,192.168.1.2:9333,192.168.1.3:9333 -dataCenter=dc1 -rack=rack1 -ip=192.168.1.1 -port=10001 -max=20000
WorkingDirectory=/usr/local/bin/
SyslogIdentifier=seaweedfs-volume

[Install]
WantedBy=multi-user.target
EOF

5. 部署 SeaweedFS Filer 服務

在本文件中,會在 3 臺 seaweedfs 機器上各部署 1個 filer,使用 tikv 為filer 提供儲存。不展示重複操作。

參考文件:

  1. Seaweedfs Filer Server

  2. Seaweedf Setup Filer

  3. Seaweedfs Setup S3 API

Tips****:

  1. 提前在機器上準備 /etc/seaweedfs/filer.toml /etc/seaweedfs/s3.json檔案,/etc/seaweedfs 是 filer 的預設配置檔案路徑,可以根據實際情況顯示指定檔案位置

  2. 提前將 tikv 金鑰複製至執行 filer 的機器

  3. Seaweedfs filer 預設無需身份認證就能訪問,為保護資料安全請參照 Longhorn Create an Ingress with Basic Authentication (nginx) 為 filer web ui 配置帶身份認證的 nginx,filer web ui 預設埠為 8888。

配置 file service

mkdir -p /seaweedfs/filer/log 
cat > /etc/systemd/system/weed-filer.service << EOF
[Unit]
Description=SeaweedFS Filer
After=network.target

[Service]
Type=simple
User=root
Group=root

ExecStart=/usr/local/bin/weed filer -logdir=/seaweedfs/filer/log -ip=192.168.1.1 -port=8888 -master=192.168.1.1:9333,192.168.1.2:9333,192.168.1.3:9333 -s3 -s3.config=/etc/seaweedfs/s3.json 
WorkingDirectory=/usr/local/bin/
SyslogIdentifier=seaweedfs-filer

[Install]
WantedBy=multi-user.target
EOF

filer.toml

cat > /etc/seaweedfs/filer.toml << EOF
[tikv]
enabled = true
# If you have many pd address, use ',' split then:
#   pdaddrs = "pdhost1:2379, pdhost2:2379, pdhost3:2379"
pdaddrs = "192.168.0.1:2279,192.168.0.1:2279,192.168.0.1:2279"
# Concurrency for TiKV delete range
deleterange_concurrency = 1
# Enable 1PC
enable_1pc = false
# Set the CA certificate path
ca_path="/etc/seaweedfs/tikv/tls/ca.crt"
# Set the certificate path
cert_path="/etc/seaweedfs/tikv/tls/client.crt"
# Set the private key path
key_path="/etc/seaweedfs/tikv/tls/client.pem"
# The name list used to verify the cn name
verify_cn=""
EOF

S3.json

# 配置s3資訊
cat > /etc/seaweedfs/s3.json << EOF
{
  "identities": [
    {
      "name": "名稱",
      "credentials": [
        {
          "accessKey": "access金鑰",
          "secretKey": "secret金鑰"
        }
      ],
      "actions": [
        "Read",
        "Write",
        "List",
        "Tagging",
        "Admin"
      ]
    }
  ]
}
EOF

啟動服務 啟動 master

systemctl daemon-reload
systemctl start weed-master.service

啟動 filer 和 volume server

systemctl start weed-filer.service
# 啟動所有 volume server
systemctl start weed-volume{1..10}.service

6. 驗證

使用 weed shell 檢查 seaweedfs 元件執行情況

# 登入任一master節點,進入weed shell控制檯
weed shell

# 常用命令:
cluster.check # 檢查叢集網路連通性
cluster.ps    # 檢查叢集程序狀態
volume.list   # 列出叢集volume server

7. 訪問 SeaweedFS filer

瀏覽器開啟:http://192.168.1.1:8888

將 IP 替換為真實 filer 地址、域名即可。生產環境建議使用域名進行訪問併為web ui配置帶身份認證的 nginx。

其他實踐

多檔案系統實現目錄配額管理

我們初次使用 JuiceFS 時,社群版本還不支援目錄配額(quota)功能,因此我們透過維護多個 JuiceFS 檔案系統來實現檔案系統配額控制。這種方法需要使用多個檔案系統共享同一個快取盤,從而會出現快取容量的競爭。在極端情況下,可能會導致快取盤空間被不活躍的目錄佔滿,而活躍的目錄則因缺乏空間而無法有效使用快取盤。

JuiceFS v1.1 版本中推出目錄配額功能,我們評估了是否需要合併所有檔案系統,並改用目錄配額來限制各目錄的容量。以下是我們自己的一些分析:

  • 多 JuiceFS 檔案系統

    • 優點

      • 在不使用 JuiceFS 目錄配額功能的情況下能進行目錄容量限制。

      • 單一檔案系統資料量有限,利於社群版遷移檔案系統(備份檔案系統、跨機房遷移、協商停機視窗)。

      • 單一 JuiceFS 檔案系統掛載點掉線的影響範圍有限。

    • 缺點

      • 單一機器同時掛載多個 JuiceFS 檔案系統,使用同一塊磁碟作為快取盤會帶來快取盤空間競爭問題。

      • 節點同時掛載多個目錄時存在大量節點 CPU 和記憶體資源浪費。

      • 跨檔案系統的資料複製效率低。

      • CSI 場景下在一臺機器上掛載多個 JuiceFS 程序會搶佔一定量的任務記憶體資源。

  • 單一 JuiceFS 檔案系統

    • 優點

      • 獨享快取盤,對比在一臺機器上掛載多 JuiceFS檔案系統能更好的快取熱資料。

      • 檔案系統內資料複製、clone 方便。

      • 總體 JuiceFS 程序數量更少,維護方便。

    • 缺點

      • bucket 巨大,某些物件儲存存在 object 數量、總大小限制、效能下降等問題,不支援這種超大 bucket。可透過 JuiceFS 配置資料分片 解決。

      • 後設資料體積龐大,對後設資料備份機器的記憶體存在要求且備份時間極長,難以做到每小時備份一次後設資料或每 8 小時備份一次後設資料(最新發布的 JuiceFS v1.2 解決了此問題)。

      • 掛載點掉線的影響範圍更大。

考慮到我們的實際情況和某些遷移需求,最終還是使用多 JuiceFS 檔案系統進行管理,但對於一些新使用者,還是推薦單一檔案系統。

JuiceFS 檔案系統進行跨機房資料遷移

在過去三年中,我們進行了大量的資料遷移工作,涉及的資料總量達到 3PB。今年進行了近 1PB 的 JuiceFS 檔案系統跨機房遷移。經驗表明,使用 JuiceFS 的 S3 對拷加上後設資料切換是兩個 JuiceFS 之間遷移速度最快的方法。例如,使用 rclone 掃描一個 50TB 的檔案系統可能需要至少半天時間,而透過直接對拷的方式,遷移過程可能僅需 10 分鐘到半小時。

常規檔案系統之間的資料遷移主要依靠檔案系統對拷的方法,JuiceFS 檔案系統之間的遷移方式卻有所創新。JuiceFS 本身並不直接儲存資料,而是將檔案後設資料儲存在 Metadata Engine 中,把檔案資料儲存在物件儲存中。這種獨特的架構使得可以透過創新的方式來處理資料遷移。具體來說,JuiceFS 允許透過替換後設資料和 S3 資料來執行遷移操作。只需確保遷移前後的後設資料和 S3 資料完全匹配,便可以透過配置 JuiceFS 的設定來生成一個與原系統完全相同的克隆系統。

  • 當需要遷移物件儲存時,可以透過物件儲存對拷 + 設定物件儲存的方式進行切換。

  • 當需要遷移後設資料時,可以透過後設資料 dump load (後設資料備份和恢復)的方式進行切換。

  • 當需要同時遷移物件儲存和後設資料時,可以同時使用 S3 對拷 + 後設資料匯入匯出 + 設定物件儲存的方式進行處理。

資料切換完成後可以使用 juicefs fsck 命令進行資料一致性校驗,檢查檔案系統需要的每一個 s3 object 是否存在。然而,這種方法最大的缺點是需要停機進行資料增量同步和後設資料切換,對單個檔案系統而言,停機時長 = 資料增量同步 + 後設資料切換 (+ 資料校驗) 。此外,對於資料同步過程,目標端多餘的過時資料,可在後續透過 juicefs gc 進行清理。

增量同步 + 資料切換

# 使用 juicefs sync 先進行資料同步
juicefs sync --list-depth=2 -u --delete-dst --no-https -p 40  s3://xxx:xxx@$bucket.oss s3://xxx:xxx@$bucket.oss2

# 使用 rclone 再進行一次補充同步
rclone copy --log-file=xxx --ignore-existing --checkers 300 --transfers 150 s3-1:bucket1 s3-2:bucket1 

# 使用 juicefs 匯入匯出後設資料
juicefs dump "origin meta address" meta.json
juicefs load "new meta address" meta.json

# 配置新檔案系統使用新 s3,更新ak sk
juicefs config "new meta address" --bucket $NEW_BUCKET_ADDRESS  --access-key xxxx --secret-key xxxx

# 使用 fsck 檢查檔案系統一致性
juicefs fsck "new meta address"

以上內容總結了我們在部署 SeaweedFS 和 TiKV、設定目錄配額以及進行資料遷移方面的實踐經驗。我們希望這些經驗能為社群的其他使用者提供參考和幫助。

相關文章