中文字幕一区二区人妻电影,亚洲av无码一区二区乱子伦as ,亚洲精品无码永久在线观看,亚洲成aⅴ人片久青草影院按摩,亚洲黑人巨大videos

通過連接池提高數(shù)據(jù)庫性能

發(fā)布于:2021-01-28 14:46:41

0

639

0

連接池 數(shù)據(jù)庫 性能

我們傾向于依靠緩存解決方案來提高數(shù)據(jù)庫性能。在內(nèi)存中或通過數(shù)據(jù)庫緩存頻繁訪問的查詢可以優(yōu)化寫/讀性能并減少網(wǎng)絡(luò)延遲,特別是對于工作量大的應(yīng)用程序,如游戲服務(wù)和Q&a門戶。但是,您可以通過將用戶連接到數(shù)據(jù)庫來進(jìn)一步提高性能。

客戶端用戶需要先創(chuàng)建到web服務(wù)的連接,然后才能執(zhí)行CRUD操作。大多數(shù)web服務(wù)都由Postgres或MySQL等關(guān)系數(shù)據(jù)庫服務(wù)器支持。使用PostgreSQL,每個新連接最多占用1.3MB內(nèi)存。在一個生產(chǎn)環(huán)境中,我們希望接收數(shù)千或數(shù)百萬個到后端服務(wù)的并發(fā)連接,這可能會很快超過您的內(nèi)存資源(或者如果您有一個可擴(kuò)展的云,它可能會很快變得非常昂貴)。

因為每次客戶端嘗試訪問后端服務(wù)時,都需要OS資源來創(chuàng)建、維護(hù)和關(guān)閉到數(shù)據(jù)存儲的連接。這會產(chǎn)生大量開銷,導(dǎo)致數(shù)據(jù)庫性能下降。

您服務(wù)的用戶期望快速響應(yīng)時間。如果性能惡化,可能會導(dǎo)致糟糕的用戶體驗、收入損失,甚至計劃外停機(jī)。如果您將后端服務(wù)公開為API,那么重復(fù)的減速和失敗可能會導(dǎo)致級聯(lián)問題并失去客戶。

連接池使用數(shù)據(jù)庫連接的緩存,而不是為每個請求打開和關(guān)閉連接,這些緩存可以在將來需要對數(shù)據(jù)庫進(jìn)行請求時重用。它可以讓您的數(shù)據(jù)庫隨著存儲在那里的數(shù)據(jù)和訪問它的客戶端數(shù)量的增長而有效地擴(kuò)展。流量從來都不是恒定的,因此池可以更好地管理流量峰值,而不會造成停機(jī)。生產(chǎn)數(shù)據(jù)庫不應(yīng)該成為瓶頸。

在本文中,我們將探討如何使用連接池中間件(如pgpool和pgbouncer)來減少開銷和網(wǎng)絡(luò)延遲。為了便于說明,我將使用pgpool II和pgbouncer來解釋連接池的概念,并比較哪一個在連接池中更有效,因為有些連接池甚至?xí)绊憯?shù)據(jù)庫性能。

我們將研究如何使用pgbench對Postgres數(shù)據(jù)庫進(jìn)行基準(zhǔn)測試,因為它是PostgreSQL提供的標(biāo)準(zhǔn)工具。

不同的硬件根據(jù)您設(shè)置的計劃提供不同的基準(zhǔn)測試結(jié)果。對于下面的測試,我使用這些規(guī)范。

我的試驗機(jī)規(guī)格:

  • Linode服務(wù)器:Ubuntu 16–64位(虛擬機(jī))

  • Postgres 9.5版

  • 內(nèi)存:2GB數(shù)據(jù)庫大?。?00MB

  • 存儲:2GB

另外,將Postgres數(shù)據(jù)庫服務(wù)器與其他框架(如logstashshipper)以及收集性能指標(biāo)的其他服務(wù)器隔離開來也很重要,因為這些組件中的大多數(shù)會消耗更多內(nèi)存,并會影響測試結(jié)果。

創(chuàng)建池連接

連接到后端服務(wù)是一項昂貴的操作,因為它包括以下步驟:

  • 使用數(shù)據(jù)庫驅(qū)動程序打開與數(shù)據(jù)庫的連接。

  • 為CRUD操作打開TCP套接字。

  • 通過套接字執(zhí)行CRUD操作。

  • 關(guān)閉連接。

  • 關(guān)閉套接字。

在一個生產(chǎn)環(huán)境中,我們期望來自客戶機(jī)的數(shù)千個并發(fā)的打開和關(guān)閉連接,對每個連接執(zhí)行上述步驟可能會導(dǎo)致數(shù)據(jù)庫性能不佳。

我們可以通過匯集來自客戶端的連接來解決這個問題。連接池不會為每個請求創(chuàng)建新的連接,而是重用一些現(xiàn)有的連接。因此,不需要通過打開和關(guān)閉到后端服務(wù)的連接來執(zhí)行多個昂貴的完整數(shù)據(jù)庫訪問。它可以防止每次請求具有相同屬性(即名稱、數(shù)據(jù)庫、協(xié)議版本)的數(shù)據(jù)庫連接時創(chuàng)建到數(shù)據(jù)庫的新連接的開銷。

像pgbouncer這樣的池中間件附帶了一個池管理器。通常,連接池管理器維護(hù)一個開放數(shù)據(jù)庫連接池。如果沒有池管理器,則不能將連接池化。

池包含兩種類型的連接:

  • 活動連接:由應(yīng)用程序使用。

  • 空閑連接:可由應(yīng)用程序使用。

當(dāng)從后端服務(wù)訪問數(shù)據(jù)的新請求傳入時,池管理器檢查池是否包含任何未使用的連接,如果可用,則返回一個連接。如果池中的所有連接都處于活動狀態(tài),則池管理器將創(chuàng)建一個新連接并將其添加到池中。當(dāng)池達(dá)到其最大大小時,所有新連接都將排隊,直到池中的連接可用為止。

盡管大多數(shù)數(shù)據(jù)庫都沒有內(nèi)置的連接池系統(tǒng),但是我們可以使用中間件解決方案來匯集來自客戶端的連接。

對于PostgreSQL數(shù)據(jù)庫服務(wù)器,pgbouncer和pgpool II都可以作為web服務(wù)和Postgres數(shù)據(jù)庫之間的池接口。兩個實用程序使用相同的邏輯來匯集來自客戶端的連接。

pgpool II提供了連接池之外的更多特性,如復(fù)制、負(fù)載平衡和并行查詢特性。

如何添加連接池?它和安裝實用程序一樣簡單嗎?

集成連接池的兩種方法

有兩種方法可以實現(xiàn)PostgreSQL應(yīng)用程序的連接池:

1.作為外部服務(wù)或中間件,如pgbouncer

連接池(如pgbouncer和pgpool II)可用于將客戶機(jī)到PostgreSQL數(shù)據(jù)庫的連接池化。連接池位于應(yīng)用程序和數(shù)據(jù)庫服務(wù)器之間。Pgbouncer或pgpool II可以配置為將來自應(yīng)用程序的請求中繼到數(shù)據(jù)庫服務(wù)器。

2.客戶端庫,如c3p0

存在一些庫,例如c3p0,它們擴(kuò)展了數(shù)據(jù)庫驅(qū)動程序功能,以包括連接池支持。

但是,為應(yīng)用程序?qū)崿F(xiàn)連接池的最佳方法是使用外部服務(wù)或中間件,因為它更易于設(shè)置和管理。此外,像pgpool2這樣的外部中間件除了池連接之外還提供了負(fù)載平衡等其他特性。

現(xiàn)在,讓我們更深入地了解一下當(dāng)后端服務(wù)連接到Postgres數(shù)據(jù)庫時會發(fā)生什么,包括有池和沒有池。

在不使用連接池的情況下擴(kuò)展數(shù)據(jù)庫性能

{xunruicms_img_title}

我們不需要連接池來連接到后端服務(wù)。我們可以直接連接到Postgres數(shù)據(jù)庫。為了檢查在沒有連接池的情況下執(zhí)行到數(shù)據(jù)庫的并發(fā)連接需要多長時間,我們將使用pgbench對到Postgres數(shù)據(jù)庫的連接進(jìn)行基準(zhǔn)測試。

Pgbench基于TPC-B。TPC-B根據(jù)系統(tǒng)每秒可以執(zhí)行多少事務(wù)來衡量吞吐量。Pgbench對每個事務(wù)執(zhí)行五個SELECT、INSERT和UPDATE命令。

基于類TPC-B事務(wù),pgbench在多個并發(fā)數(shù)據(jù)庫會話中重復(fù)運(yùn)行相同的SQL命令序列,并計算平均事務(wù)速率。

在運(yùn)行pgbench之前,我們需要使用以下命令對其進(jìn)行初始化,以創(chuàng)建pgbench_history、pgbench_branches、pgbench_tellers和pgbench_accounts表。Pgbench使用下表運(yùn)行事務(wù)以進(jìn)行基準(zhǔn)測試。

pgbench  -i  -s 50  database_name

之后,我執(zhí)行下面的命令,用150個客戶機(jī)測試數(shù)據(jù)庫。

pgbench  -c 10  -j 2  -t  10000  database_name  

{xunruicms_img_title}

如您所見,在我們的初始基線測試中,我指示pgbench使用十個不同的客戶端會話執(zhí)行。每個客戶端會話將執(zhí)行10000個事務(wù)。

從這些結(jié)果來看,我們的初始基線測試似乎是每秒486個事務(wù)。

讓我們看看如何使用連接池(如pgbouncer和pgpool)來提高事務(wù)吞吐量并避免“抱歉!,已經(jīng)有太多客戶端“錯誤。

使用pgbouncer擴(kuò)展數(shù)據(jù)庫性能

{xunruicms_img_title}

讓我們看看如何使用pgbouncer來提高事務(wù)吞吐量。

Pgbouncer幾乎可以安裝在所有Linux發(fā)行版上。您可以在這里查看如何設(shè)置pgbouncer?;蛘?,可以使用包管理器安裝pgbouncer,如apt-get或yum。

如果您發(fā)現(xiàn)很難用pgbouncer對客戶機(jī)進(jìn)行身份驗證,您可以查看GitHub以了解如何進(jìn)行身份驗。

Pgbouncer提供三種類型的池:

  1. 會話池:池中的一個連接被分配給客戶端,直到達(dá)到超時。

  2. 事務(wù)池:與會話輪詢類似,它從池中獲取連接。它會一直保存到交易完成。如果同一個客戶端要運(yùn)行另一個事務(wù),它必須等待,直到它獲得分配給它的另一個事務(wù)。

  3. 語句池:第一個查詢完成后,連接就返回到池中。

我們將使用事務(wù)池模式。在pgbouncer.ini文件中,我修改了以下參數(shù):

max_client_conn = 100

max_client_conn參數(shù)定義允許多少客戶端連接到pgbouncer(而不是Postgres)。

default_pool_size = 25  

default_pool_size參數(shù)定義每個用戶/數(shù)據(jù)庫對允許多少個服務(wù)器連接。

reserve_pool_size = 5     

reserve_pool_size參數(shù)定義允許到池的附加連接數(shù)。 

在上一個測試中,我使用10個不同的客戶端會話執(zhí)行pgbench。每個客戶機(jī)執(zhí)行1000個事務(wù),如下所示

pgbench  -c 10  -p -j 2  -t 1000 database_name    

{xunruicms_img_title}

如您所見,事務(wù)吞吐量從每秒486個事務(wù)增加到每秒566個事務(wù)。在pgbouncer的幫助下,事務(wù)吞吐量提高了約60%。

現(xiàn)在讓我們看看如何使用pgpool II提高事務(wù)吞吐量,因為它具有連接池特性。

與pgbouncer不同,pgpool II提供了連接池以外的功能。該文檔提供了有關(guān)pgpool II特性的詳細(xì)信息,以及如何從源代碼或通過包管理器進(jìn)行設(shè)置。

我更改了pgpool.conf文件中的以下參數(shù),使其將客戶端連接從pgpool2路由到Postgres數(shù)據(jù)庫服務(wù)器。

connection_cache  = on  listen_addresses  = ‘postgres_database_name’’  port  = 5432 

將connection_cache參數(shù)設(shè)置為on將激活pgpool2池功能。

與前面的測試一樣,pgbench執(zhí)行了10個不同的客戶端會話。每個客戶機(jī)向Postgres數(shù)據(jù)庫服務(wù)器執(zhí)行1000個事務(wù)。因此,我們預(yù)計所有客戶共有10000筆交易。

gbench  -p 9999  -c  10  -C  -t 1000  postgres_database  

{xunruicms_img_title}

與我們使用pgbouncer增加事務(wù)吞吐量的方式相同,與初始測試相比,pgpool2似乎也將事務(wù)吞吐量增加了75%。

Pgbouncer實現(xiàn)“開箱即用”的連接池,而無需微調(diào)參數(shù),而pgpool2允許您微調(diào)參數(shù)以增強(qiáng)連接池。

選擇連接池:pgpool II還是pgbouncer?

在選擇要使用的連接池時,有幾個因素需要考慮。盡管pgbouncer和pgpool II是連接池的優(yōu)秀解決方案,但每種工具都有其優(yōu)缺點

內(nèi)存/資源消耗

如果您對后端服務(wù)的輕量級連接池感興趣,那么pgbouncer就是您的合適工具。與pgpool II不同,pgbouncer默認(rèn)允許分叉32個子進(jìn)程,而pgpool II只使用一個進(jìn)程。因此,pgbouncer比pgpool2消耗更少的內(nèi)存。

流式復(fù)制

除了池連接之外,您還可以使用pgpool II通過流復(fù)制管理Postgres集群。流復(fù)制將數(shù)據(jù)從主節(jié)點復(fù)制到輔助節(jié)點。Pgpool II支持Postgres流復(fù)制,而pgbouncer不支持。這是實現(xiàn)高可用性和防止數(shù)據(jù)丟失的最佳方法。

集中密碼管理

在希望許多客戶機(jī)/應(yīng)用程序同時通過連接池連接到數(shù)據(jù)庫的生產(chǎn)環(huán)境中,有必要使用集中式密碼管理系統(tǒng)來管理客戶機(jī)的憑據(jù)。

您可以使用pgbouncer中的authu query從數(shù)據(jù)庫加載客戶端憑據(jù),而不是將客戶端憑據(jù)存儲在userlist.txt文件中,并將連接字符串中的憑據(jù)與userlist.txt文件進(jìn)行比較。

負(fù)載平衡和高可用性

最后,如果您想將負(fù)載平衡和高可用性添加到池連接中,那么pgpool2是合適的工具。pgpool2通過內(nèi)置的看門狗進(jìn)程支持Postgres的高可用性。此pgpool2子進(jìn)程監(jiān)視參與監(jiān)視程序群集的pgpool2節(jié)點的運(yùn)行狀況以及多個pgpool2節(jié)點之間的協(xié)調(diào)。

結(jié)論

除了連接池之外,還可以提高數(shù)據(jù)庫性能。復(fù)制、負(fù)載平衡和內(nèi)存緩存有助于提高數(shù)據(jù)庫性能。

如果一個web服務(wù)被設(shè)計為對一個數(shù)據(jù)庫進(jìn)行大量的讀寫查詢,那么您就有多個Postgres數(shù)據(jù)庫實例,通過負(fù)載均衡器(如pgpool II)處理來自客戶端的寫查詢,而內(nèi)存緩存可以用來優(yōu)化讀查詢。

盡管pgpool II能夠充當(dāng)加載程序平衡器和連接池,但pgbouncer是連接池的首選中間件解決方案,因為它易于設(shè)置,不太難管理,主要用作連接池,不需要任何其他功能。