PgDog:一個PostgreSQL分布式集群中間件
PgDog 是一個實(shí)現(xiàn)了 PostgreSQL 分片、連接池以及負(fù)載均衡功能的中間。PgDog 使用 Rust 語言編寫,支持跨平臺(Linux、Mac OS、Windows),具有高性能和高可靠性,可以在不需要修改任何應(yīng)用程序的前提下實(shí)現(xiàn) PostgreSQL 數(shù)據(jù)庫的水平擴(kuò)展。
如果你使用過 PgCat 連接池,可以把 PgDog 看作它的新一代繼承者。
以下是 PgDog 支持的主要功能特性。
分片功能
PgDog 分片(Sharding)可以將數(shù)據(jù)庫和數(shù)據(jù)表等拆分到多個 PostgreSQL 服務(wù)器中,每個分片包含數(shù)據(jù)的一個子集,PgDog 負(fù)責(zé)解決查詢路由、跨分片查詢和數(shù)據(jù)移動。
每個分片可以包含多個數(shù)據(jù)庫,其中一個是主節(jié)點(diǎn)(Primary),負(fù)責(zé)讀寫操作;其他節(jié)點(diǎn)是副本(Replica),只能執(zhí)行查詢操作。
負(fù)載均衡
PgDog 工作在 OSI 模型的應(yīng)用層,支持多個 PostgreSQL 副本的負(fù)載均衡。
對于查詢(SELECT)語句,PgDog 提供了三種可配置的策略:隨機(jī)(默認(rèn))、最小連接、輪詢。
對于修改(INSERT、UPDATE 等)操作,PgDog 指定了一個主節(jié)點(diǎn)(Primary),這類操作只會發(fā)送到主節(jié)點(diǎn)。
健康檢查
PgDog 定期針對副本進(jìn)行健康檢查,確保數(shù)據(jù)庫節(jié)點(diǎn)能夠接受連接并執(zhí)行查詢。如果一個節(jié)點(diǎn)的健康檢查失效,PgDog 會將其列入禁用主機(jī)列表,無法再接受客戶端的請求。
主機(jī)禁用具有一定的時效性,如果被禁用的主機(jī)恢復(fù)了健康檢查,可以自動加入負(fù)載均衡的目標(biāo)中。
事務(wù)模式
事務(wù)模式使得 PgDog 通過共享少量 PostgreSQL 連接服務(wù)數(shù)千個客戶端。這是默認(rèn)的模式。
這種模式下 PgDog 提供了一個連接池,如果連接池建立的上百個 PostgreSQL 連接,那么它就可以支持?jǐn)?shù)十萬個客戶端同時連接。
插件系統(tǒng)
PgDog 支持插件開發(fā),用戶可以開發(fā)自定義的插件,用于修改查詢路由、重新查詢或者返回定制結(jié)果。PgDog 插件可以使用任何語言進(jìn)行開發(fā),以共享代碼庫的形式提供,在應(yīng)用啟動時加載。
認(rèn)證機(jī)制
PostgreSQL 支持各種認(rèn)證方式,目前 PgDog 實(shí)現(xiàn)了其中一部分,例如常用的 SCRAM-SHA-256;PgDog 未來會實(shí)現(xiàn)全部認(rèn)證方式。
會話模式
PgDog 會話模式為每一個客戶端分配一個 PostgreSQL 連接,可以確保提供全部 PostgreSQL 功能,包括持久性會話變量、設(shè)置和基于進(jìn)程的功能(例如 LISTEN/NOTIFY)。一些批處理的任務(wù)(例如導(dǎo)入大量數(shù)據(jù))在會話模式下的性能會更好。
雖然會話模式不支持共享的服務(wù)器連接,但是 PgDog 連接池仍然可以保留一定數(shù)量的連接復(fù)用,可以減少 PostgreSQL 服務(wù)器的消耗。