以下是根據 YugabyteDB 官方文件中可查證的資訊所提供的技術建議。對於文件未涵蓋的細節,我會明確標示。
--memory_limit_hard_bytes / --default_memory_limit_to_ram_ratio
官方強烈建議在 YSQL 環境下啟用以下旗標,讓系統自動依節點 RAM 大小最佳化記憶體分配:
--use_memory_defaults_optimized_for_ysql=true
此旗標會自動設定記憶體分區比例,並強制執行 Tablet 數量上限。以您 750 GB RAM 的節點為例,依官方文件的參考表格(256 GiB 節點最高支援 22,100 tablet replicas),750 GB 節點的承載量遠超過此值,但實際數字需依運行時計算。[Deployment checklist]
Tablet Replica 的記憶體開銷基準:
- 每 1000 個 tablet replicas 基本開銷:800 MiB
- 加計快取等使用後,官方建議預留:7,000 MiB / 1000 tablet replicas [Deployment checklist]
db_block_cache_size_percentage
預設值為 -1000,表示系統會根據可用 RAM 自動決定建議百分比。官方不建議手動覆蓋此值,除非有特定需求。[All YB-TServer flags]
注意: 文件未提供針對 OLTP 場景的 block cache vs. MemTable 精確比例建議值,此部分需依實際 workload 監控調整。
--ysql_max_connections
預設值為自動計算(最低 50,最高 300 per node)。官方建議:
# 依節點 vCPU 數量,建議後端實體連線數:
# 10–15 physical connections per vCPU
# 48 core node -> 480–720 backend connections (保守~激進)
面對 2000 個活躍連線與 100K QPS,官方強烈推薦使用內建的 YSQL Connection Manager(YCM),而非外部 PgBouncer,理由如下:[YSQL Connection Manager]
| 比較項目 | PgBouncer | YSQL Connection Manager |
|---|---|---|
| 架構 | 單節點/進程 | 多執行緒,隨 CPU 核心擴展 |
| SQL 限制 | 不支援 TEMP TABLE、SET 等 | 無此限制 |
| 部署方式 | 需獨立部署或多實例 | 內建於 TServer,無需額外部署 |
相關配置旗標:
--ysql_conn_mgr_max_client_connections=10000 # 預設值
--ysql_conn_mgr_worker_threads=<CPU_cores / 2>
Compaction 執行緒數:
--rocksdb_max_background_compactions 預設為 -1(自動依 CPU 核心數計算):
- ≤4 cores → 1 thread
- ≤8 cores → 2 threads
- ≤32 cores → 3 threads
- >32 cores → 4 threads
您的 48 core 節點預設為 4 threads。如需提升 compaction 速度,可透過 priority_thread_pool_size 旗標調整。[yb-tserver configuration]
WAL 刷盤速率:
--rocksdb_compact_flush_rate_limit_bytes_per_sec=1073741824 # 預設 1 GB/s
針對 100K IOPS 的 NVMe SSD,可考慮提高此值,但官方文件指出預設值為強烈建議,調整前應先確認 compaction 是否成為瓶頸。
Raft Heartbeat:
--raft_heartbeat_interval_ms 預設 500ms。官方文件未建議在標準 OLTP 場景下降低此值;降低可能增加 Raft 流量開銷。對於 Read Replica 環境,文件建議將 --leader_failure_max_missed_heartbeat_periods 提高至 10。[yb-tserver configuration]
根據 YugabyteDB 官方文件,以下是建議的告警閾值:
| 指標 | Warning 閾值 | Severe 閾值 | 說明 |
|---|---|---|---|
| CPU 整體使用率 | >70%(持續 5 分鐘) | >90%(持續 5 分鐘) | 高 CPU 可能需要 Yugabyte Support 協助除錯 [Performance metrics] |
| Memory 使用率 | >70% | >90% | 不建議直接對 memory 告警,應追查底層問題 [Performance metrics] |
| Disk 使用率(空間) | 剩餘 <40% | 剩餘 <25% | 通常在 80% 使用率時考慮擴容 [Performance metrics] |
| Clock Skew | >500ms | — | 超過此值系統可能拒絕啟動或崩潰,應列最高優先處理 [Performance metrics] |
注意: 知識來源中未提供 CPU iowait 與 NVMe Disk I/O Latency (await) 的具體建議閾值,此部分無法從現有文件中確認。
根據官方文件,應定期監控以下 YugabyteDB 內部指標:
| 指標 | 監控位置 | 說明 |
|---|---|---|
| P99 Read/Write Latency | YSQL Ops and Latency、YCQL Ops and Latency、Tablet Server > Average Latency | 依應用 SLA 調整,延遲退化時應立即調優 [YBA Performance metrics] |
| RPC Queue Size | Tablet Server > RPC Queue Size、Master Server > RPC Queue Size | Queue 積壓代表後端過載,可能引發 backpressure 錯誤 [YBA Performance metrics] |
| Remote Bootstrap | Tablet Server > Remote Bootstraps | 監控節點故障後的 bootstrap 狀況 [YBA Performance metrics] |
| DocDB Cache Hit/Miss | DocDB > Cache Hit & Miss | Cache miss 率高時需調整快取配置 [YBA Performance metrics] |
| Disk IOPS / Node | Resource > Disk IOPS / Node | 大幅飆升通常代表大型 Compaction 或 block cache miss [Performance metrics] |
| WAL Stats / Node | Tablet Server > WAL Stats / Node | 監控 log cache 的高頻率 eviction [YBA Performance metrics] |
| Reactor Delays | Tablet Server > Reactor Delays | 衡量 incoming request 的瓶頸 [YBA Performance metrics] |
重要限制: 知識來源中未提供 P99 延遲的健康基準線數值,也未提供 Tablet 數量與 CPU 核心數的「黃金比例」建議值。這些數值需依實際 workload 特性與官方 Yugabyte Support 確認。
以下 PromQL 直接參考官方 Alert Policy Templates 文件中的查詢語法。
CPU 整體使用率(對應官方 DB node CPU usage 模板):
# 告警:任意節點平均 CPU 使用率持續 30 分鐘超過 90%
count by (node_prefix) (
(
100
-
(
avg by (node_prefix, instance) (
avg_over_time(
irate(node_cpu_seconds_total{job="node",mode="idle",node_prefix="$node_prefix"}[1m])[30m:]
)
)
*
100
)
)
>
90
)
節點下線偵測(持續 15 分鐘):
count by (node_prefix) (
max_over_time(up{export_type="node_export",node_prefix="$node_prefix"}[15m]) < 1
)
>
0
節點 OOM Kill 偵測:
count by (node_prefix) (yb_node_oom_kills_10min{node_prefix="$node_prefix"} > 1) > 0
節點非預期重啟偵測(30 分鐘內):
max by (node_prefix) (changes(node_boot_time{node_prefix="$node_prefix"}[30m])) > 0
Disk 資料分區使用率:
count by (universe_uuid) (
count by (universe_uuid, node_name) (
100 - (
sum without (saved_name) (node_filesystem_free_bytes{mountpoint=~"__mountPoints__",universe_uuid="__universeUuid__", fstype!="rootfs"})
/
sum without (saved_name) (node_filesystem_size_bytes{mountpoint=~"__mountPoints__",universe_uuid="__universeUuid__", fstype!="rootfs"})
* 100
) > __threshold__
)
)
File Descriptors 使用率(超過 70%):
count by (universe_uuid) (ybp_health_check_used_fd_pct{universe_uuid="$uuid"} > 70)
根據官方文件中可查證的閾值,建議以下複合條件作為啟動擴容規劃的觸發標準:
| 層級 | 條件 | 對應官方閾值 | 建議動作 |
|---|---|---|---|
| Warning | 任意節點 CPU 使用率 > 70%,持續 5 分鐘 | 官方 Warning 閾值 | 調查 workload,準備擴容評估 |
| Severe | 任意節點 CPU 使用率 > 90%,持續 5 分鐘 | 官方 Severe 閾值 | 立即聯繫 Yugabyte Support,啟動擴容採購 |
| Severe | 任意節點 Memory 使用率 > 90% | 官方 Severe 閾值 | 追查底層問題(不直接對 memory 告警),評估擴容 |
| Critical | 任意節點 Disk 剩餘空間 < 25% | 官方 Severe 閾值 | 立即擴容或清理資料 |
| Critical | OOM Kill 發生次數 > 1(10 分鐘內) | 官方模板 | 立即介入,評估記憶體配置與節點擴充 |
| Critical | Clock Skew > 500ms | 官方建議 | 最高優先修復,可能導致系統拒絕啟動 |
| Informational | RPC Queue Size 持續積壓 | 官方建議監控 | 評估是否需要增加節點分散負載 |
重要說明: 知識來源中未提供 P99 Read/Write Latency 的 PromQL 查詢語法,也未提供 YB-TServer RPC Queue 等待時間的具體 PromQL。上述矩陣僅包含官方文件中有明確數值依據的條件。如需完整的 YugabyteDB 內部指標 PromQL,建議參考 YugabyteDB Anywhere Alert Policy Templates 的完整頁面,或聯繫 Yugabyte Support 取得針對您環境的客製化告警規則。
身為負責維護高負載系統的架構師,面對 750GB 記憶體搭配 1TB SSD 這種「大記憶體、小硬碟」的特殊硬體配置,加上高達 70% 的寫入佔比與 100,000 尖峰 QPS,系統的瓶頸極高機率會落在 WAL 的磁碟寫入延遲與 10Gbps 網路頻寬,而非讀取 I/O。
以下針對您的 Bare Metal 環境提供具體的架構調優與擴容監控方案。
任務一:針對 Bare Metal OLTP 的 YugabyteDB 配置優化
在 Ansible template 中配置
yb-master與yb-tserver時,請特別留意以下參數組合:1. 記憶體與快取分配
實體機具備 750GB 龐大記憶體,由於資料量上限僅 1TB,這意味著「熱資料幾乎可以完全載入記憶體」。
--memory_limit_hard_bytes:建議設定為實體記憶體的 80%-85%,預留約 100GB 給 OS、PgBouncer、Node Exporter 及 Ansible 相關代理程式。建議設定值為644245094400(約 600GB)。--db_block_cache_size_percentage與--global_memtable_size_percentage:預設 Block Cache 佔比為 50%,但在 70% 高寫入佔比的場景下,過小的 MemTable 會導致頻繁的 Flush 與 Compaction,增加 SSD 磨損與 CPU 負載。40(因記憶體絕對值夠大,240GB 的 Cache 已綽綽有餘)。25到30,延緩寫入刷盤頻率。2. 併發與連線管理
max_connections:全叢集活躍連線為 2000,平均分攤至 6 個節點約 333。考量尖峰容錯,建議單節點 YSQLmax_connections設為600。shared_buffers:絕對不要套用傳統 PostgreSQL 的 25% RAM 規則。在 YugabyteDB 中,資料層快取由 DocDB 的 Block Cache 負責,YSQL 的shared_buffers僅用於快取系統目錄 (Catalog metadata) 與暫存表。請將其設定為512MB或1GB即可,設太大反而會造成雙重快取與記憶體浪費。Transaction pooling模式以應對短交易。3. 儲存與 Thread Pool
100,000 IOPS 的 SSD 足以應付一般需求,但在 70% 寫入與 RF=3 的放大效應下,需優化底層 RocksDB 參數。
--rocksdb_max_background_compactions=8--rocksdb_max_background_flushes=4fsync,但可以確認--durable_wal_write=true(預設)。若未來 I/O 成為極度瓶頸,且應用程式能容忍毫秒級的資料遺失,才能考慮修改此項(強烈不建議)。--raft_heartbeat_interval_ms):500降至250或150的好處是:當某台實體機當機時,Leader Election 的速度會更快,減少服務中斷的微秒數;代價是背景網路雜訊與 CPU 喚醒次數增加。建議設定為250。任務二:實體機環境的擴容時機評估 (Scaling Triggers)
決定 Scale-out 的時機不應只看單一指標,必須結合系統資源與資料庫內部延遲。
1. OS 資源臨界值
await):高負載下平均寫入延遲應保持在 2ms 以內。若 P99 磁碟延遲持續超過 5ms,會直接導致資料庫寫入延遲暴增。2. 資料庫內部指標
任務三:基於 Prometheus 的擴容評估與告警規則
以下提供具體的 PromQL 與複合告警規則 (適用於 Prometheus Alertmanager 配置)。
1. OS 資源瓶頸告警 (Node Exporter)
整體 CPU 飽和度 (> 70%)
CPU iowait 異常 (> 5%)
Disk I/O 寫入延遲退化 (> 5ms)
2. 資料庫效能劣化告警 (YugabyteDB Metrics)
註:YugabyteDB 的 latency metric 單位通常為微秒 (microseconds),以下 15000 代表 15ms。
P99 Write Latency 劣化 (> 15ms)
活躍連線數飽和度 (達最大配置的 80%)
3. 實體機擴容觸發矩陣 (複合 Alerting Rule)
我們需要建立一個複合型的 Alert Rule,確保不會因為短暫的 Spike 而觸發無效告警。建議採用「硬體飽和」且同時伴隨「服務品質(延遲)下降」作為擴建決策的觸發標準。
Prometheus Alert Rule 範例 (YAML)
將這套指標整合後,您的團隊便能從「被動處理效能客訴」轉變為「數據驅動的容量規劃」。如有 Ansible playbook 中關於 PgBouncer config 渲染的細節需要討論,可隨時提出。