《集群故障模擬方案》系列,共包含以下文章:
- 1?? 集群故障模擬方案(一):節點宕機、節點離線
- 2?? 集群故障模擬方案(二):磁盤空間滿、重選主節點
😊 如果您覺得這篇文章有用 ?? 的話,請給博主一個一鍵三連 🚀🚀🚀 吧 (點贊 🧡、關注 💛、收藏 💚)!!!您的支持 💖💖💖 將激勵 🔥 博主輸出更多優質內容!!!
集群故障模擬方案(二):磁盤空間滿、重選主節點
- 1.磁盤空間滿模擬
- 1.1 方案描述
- 1.2 操作步驟
- 1.3 命令說明
- 1.3.1 dd if=/dev/zero of=...
- 1.3.2 fallocate
- 1.3.3 對比
- 2.主節點選舉問題模擬
- 2.1 方案描述
- 2.2 操作步驟
- 3.安全注意事項
- 4.監控與驗證
1.磁盤空間滿模擬
1.1 方案描述
模擬節點磁盤空間耗盡的情況。
1.2 操作步驟
- 識別數據目錄
- 檢查
elasticsearch.yml
配置文件中的path.data
設置。 - 也可通過
GET _nodes/stats/fs?pretty
命令查詢。
- 檢查
- 填充磁盤空間
# 創建一個占滿磁盤的大文件 dd if=/dev/zero of=/path/to/es_data/fill_disk bs=1G count=100# 或者使用fallocate快速創建 fallocate -l 10G /path/to/es_data/fill_disk
🚀 注意:
fill_disk
是一個文件名。 - 觀察集群反應
# 觀察集群狀態(分片可能變為 UNASSIGNED) curl -XGET 'http://localhost:9200/_cluster/allocation/explain?pretty' curl -XGET 'http://localhost:9200/_cat/allocation?v'
- 清理磁盤空間
rm /path/to/es_data/fill_disk
1.3 命令說明
1.3.1 dd if=/dev/zero of=…
dd if=/dev/zero of=/path/to/es_data/fill_disk bs=1G count=100
這條命令使用 dd
創建一個 100GB 的大文件,用于快速占滿磁盤空間,模擬 Elasticsearch 節點磁盤耗盡的情況。
部分 | |
---|---|
dd | 數據復制工具,用于按塊讀寫文件或設備 |
if=/dev/zero | 輸入文件(Input File ):從 /dev/zero (Linux 零設備)讀取數據(全零字節) |
of=/path/to/es_data/fill_disk | 輸出文件(Output File ):寫入到指定路徑(通常選 Elasticsearch 數據目錄) |
bs=1G | 塊大小(Block Size ):每次讀寫 1GB(1G = 1 Gigabyte) |
count=100 | 塊數量:總共寫入 100 塊(100 × 1GB = 100GB) |
- 生成一個 100GB 的
fill_disk
文件,內容全為零(/dev/zero
提供無限零字節流)。 - 快速消耗磁盤空間,模擬 Elasticsearch 節點因磁盤滿而無法寫入的情況。
1.3.2 fallocate
fallocate -l 10G /path/to/es_data/fill_disk
這條命令同樣用于快速分配磁盤空間,模擬磁盤被占滿的場景(如測試 Elasticsearch 在磁盤空間不足時的行為)。
部分 | |
---|---|
fallocate | Linux 文件空間預分配工具,直接創建大文件(比 dd 更快) |
-l 10G | 指定文件大小為 10GB(10G = 10 Gigabytes) |
/path/to/es_data/fill_disk | 文件生成路徑(通常選擇 Elasticsearch 的數據目錄) |
- 立即占用 10GB 磁盤空間,生成一個名為
fill_disk
的空文件。 - 相比
dd if=/dev/zero of=...
,fallocate
不實際寫入數據,而是直接修改文件系統元數據,因此速度極快(即使分配 1TB 也只需幾秒)。
關鍵參數
參數 | |
---|---|
-l (--length ) | 指定文件大小(支持單位:K / M / G / T ,如 1K =1KB,2M =2MB) |
-o (--offset ) | 可選,從文件指定偏移量開始分配(默認從 0 開始) |
1.3.3 對比
以上方法適用于測試:
- Elasticsearch 的 磁盤水位檢測(如
cluster.routing.allocation.disk.watermark
)。 - 分片是否會自動遷移(當磁盤空間不足時)。
- 集群是否進入
read-only
模式(防止數據丟失)。
方法 | 速度 | 是否實際寫數據 | 適用場景 |
---|---|---|---|
fallocate | ?? 極快 | ? 只修改元數據 | 快速測試磁盤空間不足 |
dd if=/dev/zero | 🐢 慢(需寫全零) | ? 是 | 需要真實占用磁盤 I/O 的場景 |
truncate -s 10G | ?? 快 | ? 稀疏文件(不占實際空間) | 僅需邏輯大文件時 |
注意事項
- 需要 root 權限(如果目標目錄權限受限)。
- 確保路徑正確,避免誤填其他關鍵目錄。
- Elasticsearch 默認磁盤水位閾值:
- 低水位(
low
):85%85\%85% 占用時停止分配新分片。 - 高水位(
high
):90%90\%90% 占用時嘗試遷移分片。 - 強制只讀(
flood_stage
):95%95\%95% 占用時設為只讀模式。
- 低水位(
2.主節點選舉問題模擬
2.1 方案描述
模擬主節點不可用時的選舉過程。
2.2 操作步驟
- 識別當前主節點
curl -XGET 'http://localhost:9200/_cat/nodes?v&h=name,node.role,master'
- 停止主節點
systemctl stop elasticsearch
- 觀察選舉過程
watch -n 1 curl -s 'http://localhost:9200/_cat/master?v'
- 恢復原主節點
systemctl start elasticsearch
3.安全注意事項
- 在生產環境謹慎操作,建議先在測試環境驗證。
- 確保有備份,避免數據丟失。
- 監控集群狀態,準備好快速恢復方案。
- 避免在業務高峰期 進行故障模擬。
4.監控與驗證
在執行故障模擬時,建議同時監控以下指標:
- 集群健康狀態:
/_cluster/health
- 節點狀態:
/_cat/nodes
- 分片分配情況:
/_cat/shards
- 未分配分片解釋:
/_cluster/allocation/explain
以上模擬可以幫助你了解集群的容錯能力和恢復機制,為制定應急預案提供依據。