Slide 1

Slide 1 text

Handling a High Performance PostgreSQL Database

Slide 2

Slide 2 text

Hello! I am Rain! ex- A. SWE @iCHEF ex- SWE @NetDB 2 GitHub: RainrainWu LinkedIn: Rain Wu

Slide 3

Slide 3 text

Outline ⬡ 資料庫基本概念 ⬡ 如何構思解決方案 ⬡ 具體方案與適合情境 3

Slide 4

Slide 4 text

1. 資料庫基本概念 在進入主題前,先來聊些必備知識

Slide 5

Slide 5 text

“ 資料庫是一種讓我們能穩定儲 存大量資料的軟體,以實現資料 與邏輯的解耦。 5

Slide 6

Slide 6 text

“ 其中又可依據是否對存入的資 料有嚴謹的 Schema 要求分為 RDBMS 和 NoSQL 資料庫,這 次所討論的 PostgreSQL 就是 一種 RDBMS。 6

Slide 7

Slide 7 text

資料庫有哪些操作 ⬡ CRUD ∙ Create ∙ Read ∙ Update ∙ Delete 7

Slide 8

Slide 8 text

為什麼 資料庫 會變慢 8

Slide 9

Slide 9 text

有很多原因 ⬡ 讀取很多資料 ⬡ 搜尋特定資料效率低落 ⬡ 為確保一致性所以有交易隔離機制 ⬡ ... 9

Slide 10

Slide 10 text

資料庫在道德上必須滿足 ACID ⬡ Atomic ⬡ Consistency ⬡ Isolation ⬡ Durability 10

Slide 11

Slide 11 text

2. 如何構思解決方案

Slide 12

Slide 12 text

搜集關鍵 資訊 針對可能的方法搜集資料,逐個 驗證是否適用於當前情境 12

Slide 13

Slide 13 text

可能有用的資訊 ⬡ 資料表的統計資訊 ⬡ Query plan ⬡ Transaction 統計資訊 ⬡ Monitor 13

Slide 14

Slide 14 text

可以思考的問題 ⬡ 同樣目標可不可以換一種做法 ⬡ 同樣事情可不可以只做一次 ⬡ 為了高效能有哪些東西可以降低優先級 ⬡ 這資料庫的底層實現是否適合當前情境 14

Slide 15

Slide 15 text

決策流程飛輪 15 驗證方法適用性 依據資訊提出 候選方案 依據異常行為 搜集資訊

Slide 16

Slide 16 text

3. 具體方案與適合情境

Slide 17

Slide 17 text

Tune your SQL command ⬡ 找出耗時不合理的指令 ⬡ 看看 query plan 做了哪些事 17

Slide 18

Slide 18 text

Cache ⬡ 同樣的資料不用每次都搜尋 ⬡ 存在快取中能減少資料庫的工作量 18

Slide 19

Slide 19 text

Denormalize ⬡ 基於正規化的原則資料庫不該有冗余 的欄位 ⬡ 但有些常用數值每次計算很耗資源, 同時變動較快也不適用 Cache ⬡ 比如 FB 貼文按讚數、TG 未讀訊息數 19

Slide 20

Slide 20 text

Scale-up ⬡ CPU, RAM 吃滿了? ⬡ 那就加更多資源或換成更高級別的 代管服務吧 20

Slide 21

Slide 21 text

Scale-out (Clustering) ⬡ 多幾台機器分攤工作量 ⬡ 相關概念包含讀寫分離、HA ⬡ 不過為了強一致性通常只有一個負 責接收寫入的節點 ⬡ 較適用於 Read >> Write 情境 21

Slide 22

Slide 22 text

Write-ahead Log (WAL) PostgreSQL 的可靠性機制,在 執行 transaction 前須先像日誌 一樣寫入 Log 內永久儲存 22

Slide 23

Slide 23 text

23 Primary WAL PG node Standby WAL PG node Standby WAL PG node pgpool-II Write Read Read Proxy Synchronization

Slide 24

Slide 24 text

24 Primary WAL PG node Standby WAL PG node Standby WAL PG node pgpool-II Write Read Read Proxy Synchronization 10 W 100 R 10 W 50 R 50 R 10 W 10 W

Slide 25

Slide 25 text

讀寫分離 主要是分攤讀的工作量,正好目 前多數服務都是 Read >> Write,但仍須考量資料同步的延 遲 25

Slide 26

Slide 26 text

Indexes ⬡ 透過維護額外的資料結構讓查找效 率更高 ⬡ 但變相的會犧牲寫入效率 ⬡ 比如二分搜索樹、倒排索引 26

Slide 27

Slide 27 text

PG 常用 Index GIN 倒排索引,儲存關鍵字與所在文 本之間的映射關係,適合做關鍵 字搜尋 27

Slide 28

Slide 28 text

28 National Successful University Doc 1 National Failed University Doc 2

Slide 29

Slide 29 text

Forward Index ⬡ Doc1 : National, Successful, University ⬡ Doc2 : National, Failed, University 29

Slide 30

Slide 30 text

Inverted Index ⬡ National : Doc1, Doc2 ⬡ Successful : Doc1 ⬡ University : Doc1, Doc2 ⬡ Failed : Doc2 30

Slide 31

Slide 31 text

PG 常用 Index BRIN 統計資訊邊界分群,比如時間範 圍、地理位置的 Bounding Box, 適用於銷售日誌或區域查詢 31

Slide 32

Slide 32 text

Lower Isolation Level ⬡ 根據對交易隔離的要求,資料庫有 多個不同的隔離等級 ⬡ 隔離越是嚴謹效能損失就越大,可 以思考所需要的等級 32

Slide 33

Slide 33 text

Isolation 層級 ⬡ Read Uncommitted ⬡ Read Committed ⬡ Repeatable Read ⬡ Serilizable 33

Slide 34

Slide 34 text

34

Slide 35

Slide 35 text

Isolation 的主流實作策略 ⬡ Shared-exclusive Lock (SX Lock) ∙ MySQL, MS SQL ⬡ Multiversion Concurrency Control (MVCC) ∙ PostgreSQL, Oracle 35

Slide 36

Slide 36 text

SX Lock ⬡ 每筆資料可發行多把 S Lock 和一把 X Lock ⬡ 發行 S Lock 時不可有發行中的 X Lock,而發 行 X Lock 時不可有發行中的 S/X Lock ⬡ 只有 Read-Read 不會互相 block,Read-Write 和 Write-Write 都會 36

Slide 37

Slide 37 text

MVCC ⬡ 每筆紀錄更新或刪除時不直接改動當前資料, 而是新增一個新的版本或刪除標記 ⬡ 每次執行交易時,依據時間點控制該筆交易對 其他紀錄可見的版本 ⬡ 只有 Write-Write 會因為版本先後順序性而 被 block,而 Read-Write 不會 37

Slide 38

Slide 38 text

常聽到有人批評 PostgreSQL 做 Clustering 成效不如 MySQL ? ⬡ 讀寫分離解決了 MySQL 中 SX Lock 機制的 Read-Write block 問題,而 PostgreSQL 中 MVCC 機制沒這問題 ⬡ 他的 Read 流量沒有大到需要讀寫分離 ⬡ 他配置有問題 38

Slide 39

Slide 39 text

39 Primary WAL PG node Standby WAL PG node Standby WAL PG node pgpool-II Write Read Read Proxy Synchronization 10 W 100 R 10 W 50 R 50 R 10 W 10 W

Slide 40

Slide 40 text

OLTP v.s. OLAP ⬡ 兩者之間有個很關鍵的行為差異,就 是 range scan ⬡ 計算 real time 指標、產報表都需要 ⬡ 資料庫儲存資料的結構影響很大 40

Slide 41

Slide 41 text

Index-organized Table 41

Slide 42

Slide 42 text

Heap Table 42

Slide 43

Slide 43 text

有沒有 Range Scan 差很多 ⬡ Heap Table 基本上要 Serial scan ⬡ 當你使用一個 OLTP server 做分析或報表,覺 得他做得很慢時,你可能需要另個 OLAP server 而不是開腦洞優化 OLTP server 43

Slide 44

Slide 44 text

The End