聊聊虛擬化和容器對資料庫的影響

xuexiaogang發表於2022-01-04

虛擬機器上執行資料庫和物理機上執行資料庫哪個好?這裡說的好應該說是效能好,穩定性好。以我之前的認識是物理機較好。虛擬機器執行的資料庫在高負荷時候表現不佳。為什麼?今天來談談。

   有一次我們談及到物理機,有人問一個物理機的CPU相當於多少個虛擬機器的CPU。說這個話其實就已經定性了,一個物理機的CPU會強於虛擬機器的CPU,至於強多少那麼是需要定量的。我們來看一個圖,這是一臺普通PC伺服器。

這個是2個插槽的,也就是2C的物理機伺服器,每個CPU8核,也就是16核,由於開了超執行緒所以邏輯上CPU是32個。假如通常用Oracle的CPU其實我也不知道應該是2還是32.不過國人這種通常是以2來算的。

這個機器上開了多少機器?

從匯出的列表上看有114個CPU(遠大於32個),212G記憶體(也遠大於實際)。為什麼可以做到這個?這就從CPU的原理說起。(我爸以前總說我不要開很多東西,計算機是分時處理系統。他學計算機的時候我還沒出生)。這是什麼意思?

      我們有的時候聽著音樂,寫文件,還能開著網頁和下載電影,同時還聊天。就是同一時刻(我們人的)計算機在多很多事情。其實現代計算機普通的CPU一般每秒能運算幾億到幾十億次,比如我們用一個CPU邊放影片邊和別人打字聊天,CPU就會以極快的速度來切換兩個任務(其實任務的切換是作業系統來做的,作業系統就是計算機的管家,管理和排程計算機資源,讓計算機資源更高效地被我們利用),快到讓你感覺兩件事情好像在同時發生的。因為她快到我們無法感知到他切換了。我們的交流電220V 50赫茲。也就是每秒切換50次,我們分不出來,覺得他是一直恆定的。同樣計算機也是快的我們以為她是持續工作,其實他在嘲笑人類,我換來換去你都不知道。說這個有什麼用呢?有。虛擬化就是在這個上面做文章,我32C的物理機虛擬出來114個CPU,也就是說只要不是上面的30個多機器的都在同一時(每一個微妙納秒)刻滿負荷執行,他是可以來回切換的,而我們又感知不到。所以從這個角度來說,這個上面虛擬出來1000個CPU也是可以的。那麼一個物理機的CPU對應多少個虛擬機器的CPU就沒有一個準確的資料,甚至可以說沒法對比。

     大家用過雲盤吧?看上去每個人都有好幾T。其實也是商家知道不是所有人都同時會用滿。所以10T可以分給1000個人。只要不是說有人都用10G以上就可以支援。我2013年參加SACC的時候聽到360的人說(那時候360還有云盤)。他們的硬碟使用率只要超過70%就是事故。所以你能理解了吧。因為大家同時發力就會讓泡沫破滅。虛擬化很大程度上是超賣了計算和儲存資源。這裡用泡沫形容不知道是不是貼切。虛擬化你就當是是保險吧。不能所有投保人同時都出事了。

      為什麼我說虛擬化不適合資料庫。資料庫是高(CPU IO)密集度產品。計算資源和儲存資源有的時候獨享還不夠,更別說來共享分出去了。專心做本職工作效率高還是不停的切換效率高?

    同樣docker容器也是一樣。但是非正式環境學習拿來用沒有問題。每個容器就會一個程式,每個程式都是共享作業系統的資源的。正式環境如果說沒什麼業務,那個業務人工做都來得及,用虛擬化和容器也不是不行。(估計沒人願意承認自己業務這麼小)

     說回資料庫,PostgreSQL和MySQL都是有多個database,Oracle是好多PDB。在物理機環境下,每個子db可能峰值不一樣,這樣在一個物理機下,不同時刻執行的子db峰值不一樣,所以能夠內部平衡一下。如果全面滿負荷那就沒辦法了。我見過有人在Oracle的資料庫上特意去繫結CPU的,就是為了這個。虛擬機器不代表雲,雲的特點是彈性伸縮,快速獲得。但是一般VM是做不到自動伸縮的。所以虛擬機器申請環境都是按照峰值申請,日常是浪費的。雲是可以做到。在CPU 記憶體和磁碟達到最大範圍臨時擴大一下,然後再回收。這部分彈性計費。

    僅從技術上以我個人觀點說明物理機為什麼比虛擬機器更加合適資料庫。或者說資料庫部署在虛擬機器上的弊端。所以單純以CPU來衡量物理機甚至是一體機與虛擬機器的對比其實他們不在一個頻道上。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2850483/,如需轉載,請註明出處,否則將追究法律責任。

相關文章