跳到主要內容
節省工具箱Jason Tools
經驗分享

OpenSearch 資料路徑搬到第二顆磁碟

Jason Cheng 發布 瀏覽 1 次
OpenSearch 資料路徑搬到第二顆磁碟
本文目錄
  1. 適用環境
  2. 事前確認
  3. 停止服務
  4. 準備新磁碟
  5. 複製資料
  6. 修改設定
  7. 防止用空目錄啟動
  8. 啟動並驗證
  9. 清理舊資料
  10. 其他注意事項
  11. 結論
  12. 參考資料

Graylog 用久了,OpenSearch 的資料一定會越來越大。很多環境一開始安裝時沒有特別規劃,OpenSearch 的資料就放在系統碟的 /var/lib/opensearch,等到系統碟快滿了才發現要處理。

這篇整理把 OpenSearch 資料路徑搬到第二顆磁碟的步驟。重點是順序要對、權限要對,還有一個很多人會漏掉的保護:新磁碟沒掛上時,不能讓 OpenSearch 用空目錄啟動。

適用環境

  • Graylog + 獨立安裝的 OpenSearch(套件安裝,設定檔在 /etc/opensearch/opensearch.yml)
  • 單一節點,或多節點叢集逐台處理
  • 本文以 Ubuntu/Debian 為例,新磁碟是 /dev/sdb,新資料路徑是 /opt/opensearch_data

注意:如果用的是 Graylog Data Node,OpenSearch 是由 Data Node 管理的,資料路徑要改 /etc/graylog/datanode/datanode.conf 裡的 opensearch_data_location,不是改 opensearch.yml,本文的步驟不適用。

事前確認

先看目前的資料路徑與大小,確認新磁碟的空間夠:

grep -E '^path\.(data|logs)' /etc/opensearch/opensearch.yml
du -sh /var/lib/opensearch
df -h /var/lib/opensearch
lsblk

叢集狀態最好是 green 再開始:

curl -s 'http://localhost:9200/_cluster/health?pretty'

有開安全外掛的話改用 https 並加上帳密。搬移前也建議先做一份快照或虛擬機快照,萬一出問題可以回復。

停止服務

有兩種做法,依停機時間長短選擇。

停機時間不長(建議):只停 OpenSearch,Graylog 繼續收記錄。這段期間的記錄會先寫進 Graylog 的磁碟 journal(預設上限 message_journal_max_size = 5gb),OpenSearch 回來之後再補寫進去,記錄不會遺失。

systemctl stop opensearch

停機時間較長、或 journal 可能撐不住:Graylog 也一起停。注意 Graylog 停止期間,用 UDP 送來的 syslog、GELF 會直接遺失,TCP 與 Beats 類的送出端則會重試或暫存。

systemctl stop graylog-server
systemctl stop opensearch

journal 的使用量可以在 Graylog 的「System → Nodes」看到,事先確認一下平常每小時的記錄量,估算 5 GB 能撐多久。

準備新磁碟

用 LVM 的好處是之後空間不夠時可以直接加磁碟擴充。也可以用你熟悉的方式,只要最後有一個掛載好的檔案系統就好。

分割

fdisk /dev/sdb

依序輸入 n(新增分割區)、p(主分割區),分割區號、起始、結束位置都按 Enter 用預設值(整顆磁碟),最後 w 寫入。

注意:務必再三確認磁碟代號,fdisk 和後面的 mkfs 打錯磁碟就是把那顆的資料清掉。用 lsblk 確認 /dev/sdb 是剛加上去、還沒有分割區的那顆。

建立 LVM

pvcreate /dev/sdb1
vgcreate vg-opensearch /dev/sdb1
lvcreate -l 100%FREE -n lv-data vg-opensearch

-l 100%FREE 直接用掉整個 VG 的空間,不必自己算大小。

格式化與掛載

mkfs.ext4 /dev/vg-opensearch/lv-data
mkdir -p /opt/opensearch_data
blkid /dev/vg-opensearch/lv-data

用 UUID 寫進 /etc/fstab:

UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  /opt/opensearch_data  ext4  defaults,noatime  0  2
  • 最後一欄 2:開機時檢查檔案系統的順序,1 留給根目錄,其他資料碟填 2
  • noatime:OpenSearch 不需要檔案存取時間,可以減少寫入
mount -a
df -h /opt/opensearch_data

設定擁有者

掛載之後再設定擁有者。掛載前設定的是底下那個空目錄,掛上去之後就被新的檔案系統蓋過去了:

chown opensearch:opensearch /opt/opensearch_data
chmod 750 /opt/opensearch_data

複製資料

rsync -aHAX --info=progress2 /var/lib/opensearch/ /opt/opensearch_data/
  • -a:保留擁有者、權限、時間
  • -H、-A、-X:保留硬連結、ACL、延伸屬性
  • 來源路徑結尾的 / 代表「複製目錄裡的內容」,不是把 opensearch 目錄本身放進去

用 cp -a /var/lib/opensearch/* /opt/opensearch_data/ 也可以,但 * 不會包含隱藏檔,資料量大時 rsync 也比較好掌握進度,中斷了可以重跑。

複製完比對一下:

du -sh /var/lib/opensearch /opt/opensearch_data
ls -la /opt/opensearch_data

目錄底下應該看得到 nodes(舊版)或 _state、indices 等目錄,擁有者都是 opensearch。

修改設定

編輯 /etc/opensearch/opensearch.yml:

path.data: /opt/opensearch_data
path.logs: /var/log/opensearch

原本的 path.data 那行註解掉或改掉,不要留兩行。

防止用空目錄啟動

這一步很多人會漏掉。如果哪天開機時新磁碟沒掛上(磁碟故障、fstab 寫錯),/opt/opensearch_data 就只是系統碟上的一個空目錄,OpenSearch 照樣會啟動,然後當成一個全新的空節點,Graylog 看到的就是所有 index 都不見了。

用 systemd 讓 OpenSearch 一定要等這個路徑掛載好才啟動:

systemctl edit opensearch

加入:

[Unit]
RequiresMountsFor=/opt/opensearch_data
systemctl daemon-reload

這樣磁碟沒掛上時,OpenSearch 會直接啟動失敗,而不是悄悄用空目錄跑起來,問題一眼就看得出來。

啟動並驗證

systemctl start opensearch
systemctl status opensearch
journalctl -u opensearch -n 50 --no-pager

確認叢集狀態與 index 都在:

curl -s 'http://localhost:9200/_cluster/health?pretty'
curl -s 'http://localhost:9200/_cat/indices?v&s=index' | head -20
curl -s 'http://localhost:9200/_nodes/stats/fs?pretty' | grep -A3 '"path"'

最後一行可以確認 OpenSearch 實際使用的資料路徑已經是 /opt/opensearch_data。叢集回到 green(單節點且 replica 設 0 時)或 yellow 之後,如果剛才有停 Graylog,再把它啟動:

systemctl start graylog-server

到 Graylog 網頁搜尋一下舊的記錄,確認查得到,新進來的記錄也正常寫入。

清理舊資料

舊的資料目錄先不要刪,改名保留,確認一切正常、觀察幾天之後再刪除:

mv /var/lib/opensearch /var/lib/opensearch.old

# 觀察幾天沒問題之後
du -sh /var/lib/opensearch.old
rm -rf /var/lib/opensearch.old

刪除前務必再確認一次 opensearch.yml 的 path.data 已經是新路徑,而且 OpenSearch 正在使用新路徑。

其他注意事項

  • 多節點叢集:一次只處理一台。停機前先把該節點的 shard 移走,或至少暫停 replica 重新分配,處理完、叢集回到 green 再換下一台
  • RHEL 系列:有開 SELinux 的話,新路徑要設定正確的檔案標籤,否則 OpenSearch 會因為權限被拒而無法啟動
  • 之後空間不夠:加一顆磁碟 pvcreate、vgextend,再 lvextend -r -l +100%FREE /dev/vg-opensearch/lv-data 就能線上擴充,不用再搬一次

結論

搬 OpenSearch 資料路徑本身不難,真正會出事的是細節:權限設在掛載前、cp * 漏了隱藏檔、磁碟沒掛上時用空目錄啟動。照「停服務、掛磁碟、rsync、改設定、加 RequiresMountsFor、驗證、最後才刪舊資料」的順序做,基本上不會有問題。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀