- Projection(投影)
- 一張表部分欄位的排序物化結果,也是 Vertica 唯一的實體資料結構。表的資料只存在於它的各個 projection 之中,每個 projection 有自己的排序順序、編碼方式與分段方式。
- Super projection
- 包含 anchor table 全部欄位的 projection。Vertica 要求每張表至少要有一個,原因正是它拿掉了 C-Store 的 join index,必須能在單一 projection 內重組出完整的 tuple。
- Segmentation(分段)
- 把 tuple 指派到叢集中各節點的機制,以 projection 為單位用 SEGMENTED BY 宣告一個整數運算式,其 2^64 值域被切成 ring 上的連續範圍分給各節點。它提供決定性的「值到節點」對應,這正是本機完成的 join 與分散式 distinct 聚合能成立的基礎。
- Partitioning(分割)
- 節點之內的實體隔離,以表為單位用 PARTITION BY 宣告,保證同一個 ROS container 中所有 tuple 的分割運算式值相同。用途有二:刪檔案就等於大量刪除資料,以及讓 min/max 的 container 裁切更銳利。
- ROS container
- 磁碟上不可修改的儲存單位,依 projection 的排序順序存放完整 tuple,每個欄位兩個檔案:編碼後的資料,以及記錄每個區塊起始 position、最小值與最大值的 position index。
- WOS(Write Optimised Store)
- 完全位於記憶體、未編碼也未壓縮的緩衝區,吸收零星的插入、刪除與更新,好讓真正寫到磁碟時的批量夠大、足以攤平成本。它會依所屬 projection 的分段規則分段,但在 moveout 完成之前,其內容會在節點故障時消失。
- Tuple mover
- 背景服務,負責 moveout(非同步把 WOS 排入 ROS container)與 mergeout(在指數階層的規則下把小 container 併成大的),並在合併時順手清掉在 Ancient History Mark 之前就被刪除的列。
- Epoch、LGE 與 AHM
- epoch 是每筆 tuple 與每個刪除標記都帶著的邏輯提交時間戳,因此 epoch 邊界就是一個全叢集一致的快照。LGE(Last Good Epoch)是某個 projection 的資料確實已寫入 ROS 為止的 epoch;AHM(Ancient History Mark)則是「任何查詢都看不到更早歷史」的界線,越過它的已刪除列就能被清除。
- K-safety 與 buddy projection
- K-safety 是「掉 K 個以內的節點,叢集仍保證可用」的保證,做法是把每個 segment 的 K+1 份副本放在不同節點上。buddy projection 則是欄位相同的複本 projection,其分段方式保證同一列不會被兩者存在同一個節點上。