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

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

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

0

639

0

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

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

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

因?yàn)槊看慰蛻?hù)端嘗試訪問(wèn)后端服務(wù)時(shí),都需要OS資源來(lái)創(chuàng)建、維護(hù)和關(guān)閉到數(shù)據(jù)存儲(chǔ)的連接。這會(huì)產(chǎn)生大量開(kāi)銷(xiāo),導(dǎo)致數(shù)據(jù)庫(kù)性能下降。

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

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

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

我們將研究如何使用pgbench對(duì)Postgres數(shù)據(jù)庫(kù)進(jìn)行基準(zhǔn)測(cè)試,因?yàn)樗荘ostgreSQL提供的標(biāo)準(zhǔn)工具。

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

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

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

  • Postgres 9.5版

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

  • 存儲(chǔ):2GB

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

創(chuàng)建池連接

連接到后端服務(wù)是一項(xiàng)昂貴的操作,因?yàn)樗ㄒ韵虏襟E:

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

  • 為CRUD操作打開(kāi)TCP套接字。

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

  • 關(guān)閉連接。

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

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

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

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

池包含兩種類(lèi)型的連接:

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

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

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

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

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

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

如何添加連接池?它和安裝實(shí)用程序一樣簡(jiǎn)單嗎?

集成連接池的兩種方法

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

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

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

2.客戶(hù)端庫(kù),如c3p0

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

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

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

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

{xunruicms_img_title}

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

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

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

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

pgbench  -i  -s 50  database_name

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

pgbench  -c 10  -j 2  -t  10000  database_name  

{xunruicms_img_title}

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

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

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

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

{xunruicms_img_title}

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

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

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

Pgbouncer提供三種類(lèi)型的池:

  1. 會(huì)話(huà)池:池中的一個(gè)連接被分配給客戶(hù)端,直到達(dá)到超時(shí)。

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

  3. 語(yǔ)句池:第一個(gè)查詢(xún)完成后,連接就返回到池中。

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

max_client_conn = 100

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

default_pool_size = 25  

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

reserve_pool_size = 5     

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

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

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

{xunruicms_img_title}

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

現(xiàn)在讓我們看看如何使用pgpool II提高事務(wù)吞吐量,因?yàn)樗哂羞B接池特性。

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

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

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

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

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

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

{xunruicms_img_title}

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

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

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

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

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

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

流式復(fù)制

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

集中密碼管理

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

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

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

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

結(jié)論

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

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

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