作者:王志斌,曾獲得中國(guó)PostgreSQL數(shù)據(jù)庫(kù)管理工程師(PGCE)卢未,是PostgreSQL官方認(rèn)證講師烦绳,盤古云課堂特邀金牌講師。
PgBouncer具有三種可用的池模式:事務(wù)池爽篷,會(huì)話池和語(yǔ)句池:
事務(wù)連接池
數(shù)據(jù)庫(kù)客戶端很少在不間斷的情況下執(zhí)行連續(xù)的事務(wù)。而是通常在事務(wù)之間執(zhí)行非數(shù)據(jù)庫(kù)工作慢睡。這意味著服務(wù)器連接在等待新工作到達(dá)時(shí)會(huì)花費(fèi)大量時(shí)間空閑逐工。
事務(wù)池模式試圖減少服務(wù)器連接的空閑時(shí)間铡溪,如下所示:
池程序在開(kāi)始事務(wù)時(shí)將服務(wù)器連接分配給客戶端。
客戶端的事務(wù)完成后泪喊,池程序?qū)⑨尫胚B接分配棕硫。
注意事項(xiàng):
如果客戶端運(yùn)行多個(gè)事務(wù),則每個(gè)事務(wù)可以在不同的服務(wù)器連接上執(zhí)行袒啼。
單個(gè)服務(wù)器連接可以在其生命周期內(nèi)運(yùn)行由不同客戶端發(fā)出的事務(wù)哈扮。
與服務(wù)器所允許的連接相比,允許活動(dòng)客戶端的數(shù)量要多得多蚓再。盡管取決于給定的工作負(fù)載滑肉,但經(jīng)常會(huì)看到10倍或更多的活動(dòng)客戶端連接與服務(wù)器連接比率。
這確實(shí)帶來(lái)了一個(gè)重要的警告:客戶端不再期望對(duì)數(shù)據(jù)庫(kù)會(huì)話狀態(tài)所做的更改在同一客戶端進(jìn)行的連續(xù)事務(wù)中繼續(xù)存在摘仅,因?yàn)檫@些事務(wù)可能在不同的服務(wù)器連接上運(yùn)行靶庙。此外,如果客戶端進(jìn)行會(huì)話狀態(tài)更改娃属,它們可能并且很可能會(huì)影響其他客戶端六荒。
以下是一些使用上面的事務(wù)池示例:
如果客戶端1在T1中的第一個(gè)服務(wù)器連接上將會(huì)話設(shè)置為只讀,而客戶端2的T3是寫(xiě)事務(wù)矾端,則T3將失敗掏击,因?yàn)樗诂F(xiàn)在的只讀服務(wù)器連接上運(yùn)行。
如果客戶端1運(yùn)行PREPARE a1 AS ...在T1上運(yùn)行EXECUTE a1 ...秩铆,在T2上砚亭,則T2將失敗,因?yàn)轭A(yù)編譯語(yǔ)句對(duì)于運(yùn)行T1的服務(wù)器連接是本地的殴玛。
如果客戶端2在T3中創(chuàng)建了一個(gè)臨時(shí)表并嘗試在T4中使用它钠惩,則T4將失敗,因?yàn)樵撆R時(shí)表對(duì)于運(yùn)行T3的服務(wù)器連接是本地的族阅。
有關(guān)使用事務(wù)池時(shí)不支持的會(huì)話狀態(tài)功能和操作的完整列表篓跛,請(qǐng)參見(jiàn)PgBouncer的列表
會(huì)話連接池
分配給客戶端的服務(wù)器連接在客戶端連接的整個(gè)生命周期內(nèi)持續(xù)。這看起來(lái)好像根本不使用連接池一樣坦刀,但是有一個(gè)重要的區(qū)別:當(dāng)分配的客戶端斷開(kāi)連接時(shí)愧沟,服務(wù)器連接不會(huì)被破壞。當(dāng)客戶端斷開(kāi)連接時(shí)鲤遥,池管理器將:
清除客戶端所做的任何會(huì)話狀態(tài)更改沐寺。
將服務(wù)器連接返回到池中,以供其他客戶端使用盖奈。
語(yǔ)句連接池
在此混坞,服務(wù)器連接分配僅在單個(gè)語(yǔ)句的持續(xù)時(shí)間內(nèi)持續(xù)。這具有與事務(wù)池模式相同的會(huì)話狀態(tài)限制,同時(shí)還破壞了事務(wù)語(yǔ)義究孕。
這使得所有客戶端連接的行為就像在“自動(dòng)提交”模式下一樣啥酱。如果客戶端嘗試開(kāi)始多語(yǔ)句事務(wù),則合并程序?qū)⒎祷劐e(cuò)誤厨诸。盡管這是
從上述對(duì)比情況來(lái)看镶殷,在連接池的選擇上,需要依據(jù)業(yè)務(wù)環(huán)境特點(diǎn)來(lái)進(jìn)行選擇微酬,默認(rèn)情況下推薦使用事務(wù)連接池绘趋,它兼顧了執(zhí)行事務(wù)的特性,尤其多語(yǔ)句的支持颗管,并且不會(huì)像會(huì)話連接池那樣陷遮,嘗嘗處于等待狀態(tài)。當(dāng)然事務(wù)模式并不支持預(yù)編譯語(yǔ)句垦江。而根據(jù)具體業(yè)務(wù)場(chǎng)景的特殊需要帽馋,有些時(shí)候需要客戶端與服務(wù)器端保持連接,或者支持預(yù)編譯語(yǔ)句疫粥,這樣只能選擇會(huì)話池模式茬斧。還有一些特例情況腰懂,某些業(yè)務(wù)場(chǎng)景只是單語(yǔ)句執(zhí)行梗逮,那么語(yǔ)句池模式可能更適合。因此對(duì)比這三種模式绣溜,可以發(fā)現(xiàn)從對(duì)客戶端操作的支持程度來(lái)講慷彤,會(huì)話池支持度最高,其次是事務(wù)池怖喻,最后是語(yǔ)句池模式底哗。但是從支持的連接數(shù)來(lái)講,可能剛好是相反的順序锚沸。
上表為會(huì)話連接池和事務(wù)連接池的SQL特性對(duì)比情況跋选,可以通過(guò)對(duì)比具體業(yè)務(wù)場(chǎng)景與SQL特性的符合度,來(lái)對(duì)連接池模式進(jìn)行選型哗蜈。
下面列舉了一些示例場(chǎng)景:
有些只運(yùn)行快速查詢前标,因此在沒(méi)有事務(wù)的情況下可以共享一個(gè)會(huì)話來(lái)處理上百個(gè)并發(fā)查詢。
一些角色成員對(duì)于會(huì)話級(jí)并發(fā)是安全的距潘,并且總是使用事務(wù)炼列。因此,他們可以安全地共享數(shù)百個(gè)并發(fā)事務(wù)的多個(gè)會(huì)話音比。
有些角色過(guò)于復(fù)雜俭尖,無(wú)法與其他人共享會(huì)話。因此,您對(duì)它們使用會(huì)話池模式可以避免當(dāng)所有“插槽”都已占用時(shí)連接錯(cuò)誤稽犁。
不要使用它代替HAProxy或其他負(fù)載均衡器焰望。盡管pgbouncer具有一些可配置的功能來(lái)解決負(fù)載均衡器要解決的問(wèn)題,例如dns_max_ttl缭付,并且可以為其設(shè)置DNS配置柿估,但是大多數(shù)產(chǎn)品環(huán)境都使用HAProxy或其他用于HA的負(fù)載均衡器。這是因?yàn)镠AProxy確實(shí)擅長(zhǎng)以循環(huán)方式在服務(wù)器之間實(shí)現(xiàn)負(fù)載平衡陷猫,而不是pgbouncer秫舌。盡管pgbouncer對(duì)于postgres連接池更好,但最好使用一個(gè)小型守護(hù)程序來(lái)完美地執(zhí)行一項(xiàng)任務(wù)绣檬,而不是使用較大的守護(hù)程序來(lái)完成兩項(xiàng)任務(wù)足陨,那樣效果更糟。
在對(duì)于連接數(shù)的建議值來(lái)講娇未,上文也給出了一個(gè)大致的結(jié)果墨缘,就是一般情況下設(shè)置為CPU核數(shù)的3-4倍左右,當(dāng)然這個(gè)不是絕對(duì)值零抬,應(yīng)該是在與業(yè)務(wù)場(chǎng)景類似的硬件環(huán)境中充分進(jìn)行測(cè)試后镊讼,才能夠得出具體的數(shù)值。
還有一點(diǎn)需要注意的是連接Pgbouncer的連接方式平夜,網(wǎng)絡(luò)連接和unix socket連接方式蝶棋,較網(wǎng)絡(luò)連接,unix socket方式可能更加節(jié)省網(wǎng)絡(luò)通信的開(kāi)銷忽妒,因此如果pgbouncer和數(shù)據(jù)庫(kù)在一臺(tái)機(jī)器部署玩裙,可以優(yōu)選該方式;如果處于不同服務(wù)器上段直,則選擇網(wǎng)絡(luò)連接吃溅。
了解更多PostgreSQL熱點(diǎn)資訊、新聞動(dòng)態(tài)鸯檬、精彩活動(dòng)决侈,請(qǐng)?jiān)L問(wèn)中國(guó)PostgreSQL官方網(wǎng)站
解決更多PostgreSQL相關(guān)知識(shí)、技術(shù)喧务、工作問(wèn)題赖歌,請(qǐng)?jiān)L問(wèn)中國(guó)PostgreSQL官方問(wèn)答社區(qū)
下載更多PostgreSQL相關(guān)資料、工具蹂楣、插件問(wèn)題俏站,請(qǐng)?jiān)L問(wèn)中國(guó)PostgreSQL官方下載網(wǎng)站