天天看點

《MySQL DBA修煉之道》——1.5 長連接配接、短連接配接、連接配接池

本節書摘來自華章出版社《mysql dba修煉之道》一書中的第1章,第1.5節,作者:陳曉勇,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

當資料庫伺服器和用戶端位于不同的主機時,就需要建立網絡連接配接來進行通信。用戶端必須使用資料庫連接配接來發送指令和接收應答、資料。通過提供給用戶端資料庫的驅動指定連接配接字元串後,用戶端就可以和資料庫建立連接配接了。可以查閱程式語言手冊來獲知通過何種方式使用短連接配接、長連接配接。

1.5.1 短連接配接

短連接配接是指程式和資料庫通信時需要建立連接配接,執行操作後,連接配接關閉。短連接配接簡單來說就是每一次操作資料庫,都要打開和關閉資料庫連接配接,基本步驟是:連接配接→資料傳

輸→關閉連接配接。

在慢速網絡下使用短連接配接,連接配接的開銷會很大;在生産繁忙的系統中,連接配接也可能會受到系統端口數的限制,如果要每秒建立幾千個連接配接,那麼連接配接斷開後,端口不會被馬上回收利用,必須經曆一個“fin”階段的等待,直到可被回收利用為止,這樣就可能會導緻端口資源不夠用。在linux上,可以通過調整/proc/sys/net/ipv4/ip_local_port_range 來擴大端口的使用範圍;調整/proc/sys/net/ipv4/tcp_fin_timeout來減少回收延期(如果想在應用伺服器上調整這個參數,一定要慎重!)。

另外一個辦法是主機使用多個ip位址。端口數的限制其實是基于同一個ip:port的,如果主機增加了ip,mysql就可以監聽多個ip位址,用戶端也可以選擇連接配接某個ip:port,這樣就增加了端口資源。

1.5.2 長連接配接

長連接配接是指程式之間的連接配接在建立之後,就一直打開,被後續程式重用。使用長連接配接的初衷是減少連接配接的開銷,盡管mysql的連接配接比其他資料庫要快得多。

以php程式為例,當收到一個永久連接配接的請求時,php 将檢查是否已經存在一個(前面已經開啟了的)相同的永久連接配接。如果存在,則将直接使用這個連接配接;如果不存在,則建立一個新的連接配接。所謂“相同”的連接配接是指用相同的使用者名和密碼到相同主機的連接配接。

從用戶端的角度來說,使用長連接配接有一個好處,可以不用每次建立新連接配接,若用戶端對mysql 伺服器的連接配接請求很頻繁,永久連接配接将更加高效。對于高并發業務,如果可能會碰到連接配接的沖擊,推薦使用長連接配接或連接配接池。

從伺服器的角度來看,情況則略有不同,它可以節省建立連接配接的開銷,但維持連接配接也是需要記憶體的。如果濫用長連接配接的話,可能會使用過多的mysql伺服器連接配接。現代的作業系統可以擁有幾千個mysql連接配接,但很有可能絕大部分都是睡眠(sleep)狀态的,這樣的工作方式不夠高效,而且連接配接占據記憶體,也會導緻記憶體的浪費。

對于擴充性好的站點來說,其實大部分的通路并不需要連接配接資料庫。如果使用者需要頻繁通路資料庫,那麼可能會在流量增大的時候産生性能問題,此時長短連接配接都是無法解決問題的,是以應該進行合理的設計和優化來避免性能問題。

如果用戶端和mysql資料庫之間有連接配接池或proxy代理,一般在用戶端推薦使用短

連接配接。

對于長連接配接的使用一定要慎重,不可濫用。如果沒有每秒幾百、上千的新連接配接請求,就不一定需要長連接配接,也無法從長連接配接中得到太多好處。在java語言中,由于有連接配接池,如果控制得當,則不會對資料庫有較大的沖擊,但php的長連接配接可能導緻資料庫的連接配接數超過限制,或者占用過多的記憶體。

對此,研發工程師、系統運維工程師、dba需要保持溝通,确定合理的連接配接政策,千萬不要不假思索就采用長連接配接。

1.5.3 連接配接池

由于一些資料庫建立和銷毀連接配接的開銷很大,或者相對于所執行的具體資料操作,連接配接所耗的資源過多,此時就可能需要添加連接配接池來改進性能。

資料庫連接配接池是一些網絡代理服務或應用伺服器實作的特性,如j2ee伺服器,它實作了一個持久連接配接的“池”,允許其他程式、用戶端來連接配接,這個連接配接池将被所有連接配接的用戶端共享使用,連接配接池可以加速連接配接,也可以減少資料庫連接配接,降低資料庫伺服器的負載。

1.5.4 持久連接配接和連接配接池的差別

長連接配接是一些驅動、驅動架構、orm工具的特性,由驅動來保持連接配接句柄的打開,以便後續的資料庫操作可以重用連接配接,進而減少資料庫的連接配接開銷。而連接配接池是應用伺服器的元件,它可以通過參數來配置連接配接數、連接配接檢測、連接配接的生命周期等。

如果連接配接池或長連接配接使用的連接配接數很多,有可能會超過資料庫執行個體的限制,那麼就需要留意連接配接相關的設定了,比如連接配接池的最小、最大連接配接數設定,以及php-fpm的程序個數等,否則程式将不能申請新的連接配接。