數(shù)據(jù)庫熱點問題的產(chǎn)生和避免

數(shù)據(jù)庫的熱點,最終都會在操作系統(tǒng)層面反映出來,表現(xiàn)為CPU高或者IO高。所以這里先討論一下硬件對數(shù)據(jù)庫性能的影響。

本文來自微信公眾號“twt企業(yè)IT社區(qū)”,作者/胡晶玉海通證券數(shù)據(jù)庫架構(gòu)師。

關(guān)系型數(shù)據(jù)庫的性能問題的產(chǎn)生很大程度上都是因為熱點問題的存在,熱點問題主要是因為硬件、數(shù)據(jù)庫參數(shù)配置、數(shù)據(jù)庫設(shè)計、應(yīng)用程序設(shè)計、數(shù)據(jù)庫日常維護對于性能的影響。只有在問題發(fā)生前發(fā)現(xiàn)問題、解決問題,才能避免性能問題的發(fā)生。

前言

傳統(tǒng)關(guān)系型數(shù)據(jù)庫的性能問題,主要出現(xiàn)在CPU、磁盤、數(shù)據(jù)庫本身(鎖,Latch)這幾個方面。而這些問題的產(chǎn)生很多時候都是因為存在熱點,比如大量的全表掃描,會產(chǎn)生IO熱點;對一張表的頻繁修改,會產(chǎn)生鎖沖突的熱點;對一個數(shù)據(jù)庫頁的頻繁訪問會造成數(shù)據(jù)庫內(nèi)部(比如Latch)的熱點。本文將從服務(wù)器資源,數(shù)據(jù)庫配置,應(yīng)用設(shè)計等幾個方面來討論熱點的產(chǎn)生及如何避免。補充說明,因為本文作者具有DB2技術(shù)背景,所以有些術(shù)語主要參照DB2,對于其他數(shù)據(jù)庫產(chǎn)品可能名稱不一樣,但基本原理相似,希望為同行帶來參考。

一、概述

作為DBA,最關(guān)心和平時做的最多的就是數(shù)據(jù)庫的性能。定位性能問題首先要根據(jù)系統(tǒng)資源使用率來分析。如果出現(xiàn)CPU、IO等出現(xiàn)100%繁忙現(xiàn)象,可以定義為熱點問題。數(shù)據(jù)庫的性能問題主要發(fā)生在幾個層面,首先是硬件,即CPU、內(nèi)存、磁盤這些因素,其次是數(shù)據(jù)庫的參數(shù)配置,之后是數(shù)據(jù)庫設(shè)計,包括表結(jié)構(gòu),索引等,最后是應(yīng)用設(shè)計,包括程序接口、編程方式、程序設(shè)計等。下面將分別從這幾個方面進行探討。

二、硬件對數(shù)據(jù)庫性能的影響

數(shù)據(jù)庫的熱點,最終都會在操作系統(tǒng)層面反映出來,表現(xiàn)為CPU高或者IO高。所以這里先討論一下硬件對數(shù)據(jù)庫性能的影響。

數(shù)據(jù)庫服務(wù)器的硬件配置決定了單臺服務(wù)器的服務(wù)能力。硬件的性能越好,出問題的頻率越低,問題持續(xù)時間越短,高性能的硬件也可以掩蓋一些數(shù)據(jù)庫配置和應(yīng)用設(shè)計上的問題。硬件的基本配置要滿足應(yīng)用正常的需求,在系統(tǒng)上線前一定要進行壓力測試,來找到應(yīng)用系統(tǒng)對硬件的最低要求。下面從存儲、CPU、內(nèi)存幾個方面進行討論。

一般而言,最容易出現(xiàn)瓶頸的是磁盤。磁盤的IO速度相對是最慢的,所以也最容易出問題。在幾年前,大多通過使用高性能存儲來提高IO吞吐能力,隨著固態(tài)硬盤的出現(xiàn),對一些小型應(yīng)用,使用固態(tài)盤也能滿足部分場景的需求。現(xiàn)在使用固態(tài)盤代替機械盤的存儲也已經(jīng)非常的成熟了,在存儲小型化,高性能方面出現(xiàn)了質(zhì)的飛躍。超過百萬IOPS的產(chǎn)品越來越多,性價比也非常好,極大減少了IO瓶頸的問題。在實際生產(chǎn)環(huán)境中,也有直接使用固態(tài)硬盤而不使用存儲的,這種情況建議使用多塊磁盤來提高性能和可靠性。

CPU一般不會成為瓶頸,在服務(wù)器選型的時候,CPU一般來說都是高配的,OLTP類的應(yīng)用平時的CPU使用率一般在20%以下,峰值50-70%,在CPU這塊會留很大的余量。但是CPU滿的問題,還是非常常見的,這主要是因為CPU被濫用導(dǎo)致的,比如一個SQL語句占滿一顆CPU,那么并發(fā)高的時候,就會把所有CPU資源用盡。即使有再多的CPU,也只是延遲問題發(fā)生而已。所以在CPU這塊根據(jù)業(yè)務(wù)規(guī)模和壓力測試結(jié)果選擇即可。

內(nèi)存這塊變化很大,以前內(nèi)存還是稀缺資源,采用32G,64G內(nèi)存的服務(wù)器比較常見,現(xiàn)在的服務(wù)器在內(nèi)存一般都很大,256G、512G的配置很常見了。所以對于大內(nèi)存的服務(wù)器,充分利用服務(wù)器的內(nèi)存資源,不要拿以前的32G服務(wù)器上數(shù)據(jù)庫參數(shù)照搬,要按照新服務(wù)器內(nèi)存大小對參數(shù)進行相應(yīng)的調(diào)整。對于數(shù)據(jù)庫獨用服務(wù)器,內(nèi)存可以使用到總內(nèi)存的70%。

網(wǎng)絡(luò)一般不會成為瓶頸,服務(wù)器一般都配置多塊網(wǎng)卡,注意和應(yīng)用服務(wù)器一定要使用萬兆網(wǎng)卡相連。另外需要注意,應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器需要在同一個機房,不能跨城市訪問。

三、數(shù)據(jù)庫參數(shù)配置對性能的影響

數(shù)據(jù)庫的參數(shù)分為幾類:與共享內(nèi)存相關(guān)、與私有內(nèi)存相關(guān)、與進程(線程)數(shù)相關(guān)。這些參數(shù)都要根據(jù)應(yīng)用特點,數(shù)據(jù)庫壓力情況進行適當(dāng)?shù)恼{(diào)整。目前傳統(tǒng)的數(shù)據(jù)庫都能做到參數(shù)的自動調(diào)整,大大減少問題發(fā)生的概率。但是一些新興的數(shù)據(jù)庫,在這塊做的還不好,需要DBA繼續(xù)關(guān)注。

數(shù)據(jù)庫最重要的參數(shù)就是緩沖池的大小,各種數(shù)據(jù)庫對緩沖池的命名不一樣,但本質(zhì)是一樣的,就是緩存數(shù)據(jù)的一塊內(nèi)存區(qū)域,是整個數(shù)據(jù)庫的一塊共享內(nèi)存區(qū)域。當(dāng)緩沖池過小時,會發(fā)生頻繁的內(nèi)存與磁盤之間的數(shù)據(jù)交換,形成熱點,表現(xiàn)為CPU繁忙或者IO繁忙。數(shù)據(jù)庫緩沖池的內(nèi)存從資源角度看可以使用到整個服務(wù)器的50%左右,從數(shù)據(jù)庫容量的角度看不應(yīng)低于數(shù)據(jù)庫大小的5%。

數(shù)據(jù)庫訪問計劃緩存,首先訪問計劃內(nèi)存要足夠大,盡量提高訪問計劃命中率;其次通過參數(shù)化等手段,減少需要緩存的訪問計劃數(shù)量,這個和程序編寫方式有關(guān),也和數(shù)據(jù)庫參數(shù)配置有關(guān)。

數(shù)據(jù)庫的私有內(nèi)存主要關(guān)注工作空間這塊,一個數(shù)據(jù)庫連接,在處理SQL語句的時候,需要一個工作空間,就像一個人在工作時使用的辦公桌一樣,這個空間占用的內(nèi)存屬于這個連接的私有內(nèi)存。這個內(nèi)存也要足夠大,否則處理的數(shù)據(jù)量過大時,容易成為熱點。

數(shù)據(jù)庫的排序內(nèi)存,哈希內(nèi)存空間,有的數(shù)據(jù)庫使用一個參數(shù)控制,有的數(shù)據(jù)庫使用不同的參數(shù)控制,這個內(nèi)存也非常重要,一般在線交易系統(tǒng)不大會有問題,分析性的數(shù)據(jù)庫這方面需求比較大,可以用的總內(nèi)存的20%以上,可以根據(jù)實際情況調(diào)整。

四、數(shù)據(jù)庫設(shè)計對性能的影響

在設(shè)計數(shù)據(jù)庫表的時候,謹(jǐn)慎使用Lob字段類型,這種類型的數(shù)據(jù)不能使用緩沖池,容易成為熱點。有些數(shù)據(jù)庫為了提高性能,提供了Lob字段表內(nèi)存儲的功能,雖然有長度限制,只要大部分實際數(shù)據(jù)都小于這個限制,數(shù)據(jù)就可以和普通字段一樣,存在表中,可以使用緩沖池,這樣就大大提高了性能,避免成為熱點。

再談一下數(shù)據(jù)庫的索引設(shè)計。一種情況是沒有索引,一種情況是索引選擇的字段不合適。

如果表沒有合適的索引,那么只能對該表進行全表掃描,當(dāng)高并發(fā)時,對單張表的頻繁掃描就會成為熱點。這是一個非常普遍的現(xiàn)象,所以平時的數(shù)據(jù)庫監(jiān)控中關(guān)注全表掃描情況非常重要。

索引的字段要用那些選擇性高(即鍵值多)的字段,復(fù)合索引要把選擇性高的字段放在索引的前面。如果用選擇性很低的字段,而且放在索引的第一個字段,就非常容易形成熱點。

還有一種情況需要注意,就是對于高頻訪問的小表,數(shù)據(jù)可能集中在一個頁面上,這個很容易成為熱點,可以通過調(diào)整建表參數(shù),盡量讓數(shù)據(jù)分布在多個頁面,可有效避免熱點。

五、應(yīng)用程序設(shè)計對性能的影響

應(yīng)用程序?qū)?shù)據(jù)庫性能有著根本的影響,良好的程序設(shè)計可以避免很多的性能問題。有些問題是無法通過優(yōu)化數(shù)據(jù)庫,增加資源能夠解決的,最終只能去修改應(yīng)用程序。

開發(fā)人員要有基本的SQL能力,掌握基本的聚合函數(shù)等。否則用程序來實現(xiàn)SQL可以實現(xiàn)的功能,很容易出現(xiàn)熱點問題。例如用一個循環(huán)來實現(xiàn)統(tǒng)計的功能,會造成大量SQL同時執(zhí)行,非常容易產(chǎn)生熱點。

SQL語句要避免全表掃描,對于可以分頁展示的查詢,按照展示的頁面進行查詢,不要一下子把所有數(shù)據(jù)都查出來。

應(yīng)用設(shè)計上避免單表瓶頸。比如在秒殺場景中,一個商品的庫存是有限的,每一筆交易都要進行庫存的更新,那么這里就會形成熱點,一旦阻塞,數(shù)據(jù)庫層面是無法解決的。必須從設(shè)計上進行解決。

對SQL語句進行參數(shù)化,例如Java程序中要使用Prepared Statement,C程序中使用靜態(tài)語句,參數(shù)化的語句在數(shù)據(jù)庫中會生成訪問計劃緩存,可以復(fù)用,避免每次都進行硬解析,大量的語句硬解析也很容易成為熱點。

插入性能是應(yīng)用非常關(guān)心的,由于插入需要記錄日志,是成本非常高的操作,所以對于大量的數(shù)據(jù)插入操作,要進行適當(dāng)?shù)脑O(shè)計,比如采用一個語句插入多條記錄的方式,或者一個事務(wù)提交多條記錄的方式減少日志瓶頸。

六、數(shù)據(jù)庫日常維護對性能的影響

日常維護強調(diào)一下數(shù)據(jù)庫統(tǒng)計信息收集和歷史數(shù)據(jù)清理。

統(tǒng)計信息不準(zhǔn)確容易導(dǎo)致生成錯誤的訪問計劃,出現(xiàn)性能問題。最常見的是一個大表有很多記錄,但是統(tǒng)計信息卻是零條記錄,這種情況非常容易出現(xiàn)錯誤的全表掃描,從而導(dǎo)致性能熱點。

歷史數(shù)據(jù)清理也非常重要,不要將歷史數(shù)據(jù)和交易數(shù)據(jù)放在同一張表中。對一些日志類的記錄表要定期的進行清理和歸檔。

總結(jié)

數(shù)據(jù)庫熱點問題和交通阻塞特別的像,當(dāng)沒有發(fā)生時,一切正常,發(fā)生之后,系統(tǒng)的吞吐量會急劇的下降。所以要在問題發(fā)生前通過蛛絲馬跡來發(fā)現(xiàn)問題,提前解決以避免發(fā)生問題。

THEEND

最新評論(評論僅代表用戶觀點)

更多
暫無評論