天天看點

PostgreSQL 會話級資源隔離探索

如果一個資料庫對外提供的服務,或者承載的業務很多時,你首先想到的肯定是拆分資料庫。

但是,拆分畢竟是有成本的,而且有時并不是所有的場景都适合拆分來解決。

如果多個業務混合在一起使用一個資料庫,就容易造成資源的争搶。

那麼不拆分的情況下,控制每個業務或者每個會話的資源使用呢?

要隔離應用使用資料庫的資源,首先要區分應用。

通常如果一個資料庫提供了多個業務服務時,會給每個業務建立不同的庫或者配置設定不同的使用者。

PostgreSQL 會話級資源隔離探索

當然,如果你用了同一個庫,或者同一個資料庫,就分不清業務了嗎?

當然不是,你還可以從業務的來源ip區分。

PostgreSQL 會話級資源隔離探索

如果業務部署在同一個ip上,就沒有辦法區分業務了吧?

當然也不是,你還可以通過application_name來區分業務。

PostgreSQL 會話級資源隔離探索

postgresql 是程序模式的,如果結合cgroup,就可以做到會話級别的資源隔離。

用戶端向postmaster發起連接配接請求,postmaster fork一個backend process處理該連接配接請求,以及将來改用戶端的sql請求。

根據前面區分來源應用的方法,找到對應的應用。(這個區分方法應該首先要存儲在資料庫的表中,或者使用函數的手段獲得)

根據應用于cgroup的映射關系,找到對應的cgroup,然後将這個pid寫入對應cgroup的tasks檔案即可。

PostgreSQL 會話級資源隔離探索
PostgreSQL 會話級資源隔離探索

步驟

建立cgroup,包括mem, net, cpu, iops

在每個cgroup中為每個業務建立對應的subcgroup,并配置對應的資源限制。

例如(記憶體,網絡包轉發限制,網絡帶寬限制,cpu時間片配置設定限制,塊裝置的讀寫iops和讀寫帶寬限制)

修改核心,在fork後,需要處理将pid寫入cgroup的動作。

建立對應的函數,将指定的pid放到指定的cgroup中。

postgresql的程序模式,為會話級資源隔離提供了便利。

即使不改核心,你也可以通過在作業系統層部署程式的方式,做到對postgresql會話級的資源隔離管理。

pg_stat_activity中有你需要的用來區分用戶端應用的資訊(包括用戶端ip, username, dbname, pid, application_name)。

祝大家玩得開心,歡迎随時來 阿裡雲促膝長談 業務需求 ,恭候光臨。

阿裡雲的小夥伴們加油,努力做 最貼地氣的雲資料庫 。