Weitere ähnliche Inhalte
Ähnlich wie Scaling Offline Database Usage On GCP @ Dcard (20)
Mehr von Jui An Huang (黃瑞安) (8)
Scaling Offline Database Usage On GCP @ Dcard
- 1. 在 GCP 上,對 OLTP
資料庫擴展分析型查詢
Ruian Huang @ Dcard Plaza / Golang Taipei Gathering #42. 2019-06-18
1
- 2. ⼤大家好
* 畢業於交⼤大資⼯工
* Dcard 架構團隊的後端⼯工程師
* ⽇日常⼯工作是開發內外部 API
資料庫查詢優化
Infrastructure as Code
* 愛好是吃甜食
* 右邊是我哥的貓,被我當頭像
* https://github.com/rueian
2
- 4. 外部使⽤用者
資料庫
⼀一般 Online Transaction Processing 情境
外部使⽤用者僅透過公開 API ,
發起預先寫好的查詢存取有限的資料
公開 API
資料庫則針對這情境做最佳化,包含:
* 多連線的硬體資源分配
* 資料庫對硬碟隨機存取的參參數
* 資料 Indexing
* 資料 Partitioning
* 資料 Clustering
* 查詢優化 (Index Scan)
4
- 6. 內部需求包含:
* 排程任務
* 報表
* 送批量量通知
* 模型訓練
* ETL
內部的分析型查詢
通常需要掃描⼤大量量資料,
可能還會有⼤大量量計算會佔據⼤大量量硬體資源
(Seq Scan, Postgres Bitmap Heap Scan)
* ⼈人⼯工 Ad-hoc 查詢
* 成效統計、數據研究
* 開發功能、Debug
6
- 10. Master
問題
Slave
Streaming WAL
1. Slave 通常被要求硬體規格與 Master 同等,
甚⾄至可能⼀一些資料庫參參數會被要求跟 Master ⼀一樣,
沒辦法在參參數上針對分析型查詢做優化。
2. Slave 是唯讀,無法在資料上對分析型查詢做優化。
3. Slave 閒置時也不能關機,不然追同步很⿇麻煩。
4. Slave 只有⼀一台,分析型查詢全都擠在上⾯面互相拖慢,
卻很難快速⽣生出第⼆二台、第三台,且同步 WAL 對 Master 負擔也不⼩小。10
- 27. Resource Management API
resource management api
內部則需可以管理理不同種類的資源
-> ⽤用 plugin ⽅方式實作不同種類的 resource controller
⽤用 plugin 的⽅方式可以:
1. 獨立於主程式
2. 不限定實作程式語⾔言
3. 各別 resource controller 可以 Hot Reload 或分開部署
27
- 28. Resource Management API
resource management api
各別 Resource Controller 需實做的介⾯面:
* FindResource 負責回應前⾯面的 RequestResource 請求,
從給定的 ResourcePool 之中挑出可⽤用的 Resource 回傳,
或是也可以回傳⼀一個全新的 Resource。
* SyncResource 則負責檢查 Resource 狀狀態並回傳更更新的 Resource。
會有額外的 Worker 會不斷對現有的 Resource
去呼叫對應 Controller 的 SyncResource 來來更更新狀狀態
28
- 29. Resource Management API & Resource Controller Plugin
resource management api
RequestResource A
resource A controller
29
- 33. resource management api resource A controller
SyncResource a
Resource Management API & Resource Controller Plugin
33
- 34. resource management api resource A controller
return a with new state
Resource Management API & Resource Controller Plugin
34
- 35. resource management api resource A controller
SyncResource a
Resource Management API & Resource Controller Plugin
35
- 36. resource management api resource A controller
return a with delete mark
Resource Management API & Resource Controller Plugin
36
- 40. ⼤大部分虛擬化平台或雲端廠商都
有提供 startup-script 讓你在 VM
開機之後可以執⾏行行創建 VM 時注
入的腳本。
startup-script 很適合⽤用在根據不
同硬體規格來來⾃自動調整相關參參數
然後再啟動服務。
Startup-Script
PostgreSQL 為例例:
Linux Kernel:
/proc/sys/vm/nr_hugepages
PostgreSQL config:
max_connections
shared_buffers
effective_cache_size
maintenance_work_mem
work_mem
max_worker_processes
max_parallel_workers_per_gather
random_page_cost
effective_io_concurrency
PostgreSQL Data:
create index on table
cluster table using index
analyze database
40
- 49. Library
* ⽤用來來處理理 Postgres Startup Message 的 PGResolver interface
* ⽤用來來處理理 Postgres Cancel Request 的 InMemoryConnInfoStore
* ⽤用來來處理理各種 Postgres Message 的 Message Handler
⾃自⼰己寫 proxy 可以拿來來做很多事情:
* Query logging, auditting, retry transaction if preemptible instance disappeared
* Data logging, auditting, masking, obscuring
* Separate authentication from database
https://github.com/rueian/pgbroker
⽤用來來寫 postgres proxy 的 golang library,提供:
!49
- 50. Library
* 對內的 Service 層以及對外的 HTTP transport 層實作,以及 golang 的 client library
* 使⽤用 redis 的 Resource Store 以及 Resource Controller Locker
* golang 的 Resource Controller Plugin Skeleton Library
* 類似 hashicorp/go-plugin 的 Plugin Launchpad,⽤用來來管理理 subprocess 形式的 Resource
Controller
* Resource Syncer ⽤用來來不斷呼叫 Resource Controller 的 SyncResource
* OpenCensus 的 metric view,可輸出⾄至 Stackdriver 或轉成 Prometheus 格式
https://github.com/rueian/godemand
⽤用來來寫 resource management api 的 golang library,提供:
!50
- 52. 總結
* 透過 db proxy 隱藏背後與 resource mangement api 的互動,讓使⽤用者使⽤用⼀一般的 db client 與
proxy 連線就可以取⽤用從最新的 snapshot 開啟的 db instance。
* 透過 db proxy 與 resource management api 的 Heartbeat 機制,resource controller 可以控制
⼀一個 db instance 要服務多久。不僅 db instance 可以使⽤用 Preemptible 機器,閒置時可以直接
關機,甚⾄至直接刪除以降低成本,當新的連線進來來再重新開機或從 snapshot 開新的機器即可。
* resource controller 可以檢查當前 db instance 負載決定是否加開機器,並且可以再開機器時決
定硬體規格與 startup-script 內容,達到按需求動態調整花費。
* 從 snapshot 開的 db instance 不再是原 db 的 hot standby replica,因此可以根據之後的查詢
需求做參參數與資料上的調整,例例如 postgres 可以降低 max_connection 並提⾼高 work_mem,或
是 create index 或是 cluster table。
* 當沒有查詢時,不再需要像原本 hot standby replica ⼀一直把 db instance 開著保持同步了了。僅
需要開著 db proxy 與 resource management api 兩兩隻 process,相當省錢。
!52