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、驗證、最後才刪舊資料」的順序做,基本上不會有問題。
參考資料
- OpenSearch 文件:Configuring OpenSearch(path.data)
https://docs.opensearch.org/latest/install-and-configure/configuring-opensearch/index/ - systemd.unit:RequiresMountsFor
https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html



