1. 程式人生 > >讓天下沒有難用的資料庫 » RDS最佳實踐(一)

讓天下沒有難用的資料庫 » RDS最佳實踐(一)

我該如何選擇RDS?我要購買多大規格的RDS?RDS的連線數,iops指的是什麼?上訴這些問題相信是每一個RDS使用者在開始使用的時候都會有這樣的疑問。首先我們要了解一下RDS的組成包括哪一些,從阿里雲官網的購買頁面中我們可以看到RDS包括了以下引數:資料庫型別,版本,儲存空間,規格:記憶體+連線數+io,地域,那我們就一個個來分析一下:

一.資料庫的型別:

RDS目前支援的資料庫型別有兩種:mysql,sqlserver,為什麼這裡要特別提出來講一講?原因有以下兩個方面:
a.由於受到sqlserver和windows license的影響,sqlserver價格會比mysql高出近50%,一個2G Mem+50GB Disk的Mysql一年的價格是:4480 RMB;一個2G Mem+50GB Disk的Sqlserver一年的價格是:6420 RMB;
b.sqlserver處於閉源狀態,在出現異常疑難問題排查的時候,往往需要藉助微軟官方的幫助,同時RDS如果想在sqlserver上面定製出一些自己特色的功能時候,往往其封閉的協議讓RDS望而退步;相對於mysql的開源而言,RDS依託了阿里強大的mysql核心開發和運維經驗,能夠很好的定製出一些RDS自己的特色功能,在出現疑難問題上能夠迅速的進行debug排查。二.資料庫的版本:

RDS mysql目前支援5.5和5.1兩個版本,sqlserver支援2008一個版本,通常在高版本中會:修復掉低版本中一些bug提高系統的穩定和安全性,優化改進低版本的設計提升系統的效能,推出一些新的功能豐富提升系統的易用性。所以這裡我們我們以mysql為例,看一看在5.5與5.1相比較有哪些改動:
1)預設儲存引擎更改為InnoDB
2)提高效能和可擴充套件性
. 提高了預設執行緒併發數(innodb_thread_concurrency)
. 後臺輸入/輸出執行緒控制(innodb_read_io_threads、innodb_write_io_threads)
. 適應性雜湊索引(Hash Index)控制,使用者可以關閉適應性雜湊功能
. 插入緩衝(Insert Buffering)控制,使用者可以關閉innodb的插入緩衝功能
. 恢復組提交(Restored Group Commit)
. 多個回滾段(Multiple Rollback Segments),之前的innodb版本最大能處理1023個併發處理操作,現在mysql5.5可以處理高達128K的併發事物,
. 改善了日誌系統互斥和單獨重新整理(Flush)列表互斥
. 改善清除程式進度,在mysql5.5中清楚操作執行緒是獨立的執行緒,並支援併發,可以使用innodb_purge_treads配置。

3)提高實用性
. 半同步複製(Semi-synchronous Replication)
. 複製Heartbeat
. 中繼日誌自動恢復(Automatic Relay Log Recovery)

4)提高易管理性和效率
. 建立快速索引(Faster Index Creation)
. 高效的資料壓縮(Efficient Data Compression)
. 為大物件和可變長度列提供高效儲存
. 增加了INFORMATION_SCHEMA表,新的表提供了與InnoDB壓縮和事務處理鎖定有關的具體資訊
. 支援utf8mb4字符集

5)提高可用性
. 新的表/索引分割槽選項。MySQL5.5將表和索引RANG和LIST分割槽範圍擴充套件到了非整數列和日期,並增加了在多個列上分割槽的能力。

6)改善檢測和診斷
. Mysql5.5引入了一種新的效能架構(performancn_shema,P_S),用於監控mysql監控伺服器執行時的效能。

有了這麼多功能的改進提升,還有什麼理由不使用5.5.

三.儲存空間:

在RDS的工單問題中,空間問題的諮詢應該可以算得上是top 5,當RDS的實際使用空間超過了購買的空間後,例項就會被鎖定了,這樣就會導致應用無法再寫入,更新資料,造成應用的報錯,在RDS的控制檯中可以設定空間的報警閥值,當例項空間到達報警閥值後用戶就會收到報警簡訊,這個時候使用者則需要對判斷當前的空間增長是否合理,如果合理的增長則需要對例項的進行彈性升級,如果增長不合理,則需要進行快速的判斷。所以在這裡我們就需要了解RDS的空間組成到底包括了哪些?

RDS的例項空間主要包括了:資料檔案,日誌檔案,其他檔案(包括系統檔案,臨時檔案)

下面我們來詳細介紹一下這些檔案組成:

  1. 資料檔案:顧名思義該檔案空間則是指的存放用資料的檔案,對應到資料庫中就是一張張的表,表的組成主要包括:資料和索引兩類,所以當你看到你的資料檔案佔用例項的空間非常多的時候,你需要看一下到底是哪一張表佔用了我的空間,RDS在控制檯中提供了:效能優化–>大表優化的效能報表,使用者則可以在這裡找到系統中佔用最大的檔案。但是凡事需要未雨綢繆,我們在設計應用的時候,就要考慮未來資料的增長趨勢(資料的生命保留週期),合理的設計資料的存放位置(存放檔案or資料庫),儲存格式(資料型別,欄位大小),存放方式(儲存引擎選擇,分割槽還是分表)。下圖的案例案例中,資料空間佔用了例項大量的空間,使用者可以通過排查資料庫中到底是哪一張表佔用導致的(可以參考性能優化–>大表優化)     data-pic
  2. 日誌檔案:RDS採用的主備M-M的高可用架構,其主備之間的資料同步依靠日誌的方式,mysql:binlog,sqlserver:transaction log;同時RDS支援將例項恢復到任何一個時間點,這個功能需要依靠運用備份和日誌。為了減少日誌空間對使用者的空間的佔用,RDS mysql會定時的把日誌備份到oss中,然後再將其清除,這樣使用者需要下載RDS日誌的時候可以從oss中獲取;對於sqlserver,rds對定期的對資料庫進行備份,然後將事務日誌進行回收。當日志空間出現異常的時候,如下圖,由於應用寫入資料壓力過大,導致binlog日誌增加的速度大於了RDS上傳到oss的速度,造成了binlog日誌增長迅猛,這時候需要使用者對資料庫的update,insert,delete進行優化,減小對資料庫的變更操作:
    log-pic
  3. 其他檔案:
    a.系統檔案,每個資料庫在安裝的時候會初始化一些系統檔案,這些系統檔案是資料庫正常執行的前提,mysql:ibdata1,ib_logfile0,sqlserver:MSDBLog,master.mdf,下面的這幅圖反映了RDS“其他檔案”佔用達到了非常多的問題,可以參考blog:ibdata1檔案持續增加的問題定位

ibdata-pic

b.臨時檔案:通常可以理解為資料庫做一個大的操作,由於記憶體不足,資料庫需要將記憶體中的檔案       寫到磁碟上,這樣則有可能導致臨時檔案寫的非常大,通常出現這種情況的時候,資料庫在做大         的排序操作(order by,group by),由於記憶體不足,需要將資料刷寫到臨時檔案中,下圖的案         例中,由於資料庫中一條order by的語句頻繁的執行,但是排序的sql沒有索引,導致了臨時檔案        的頻繁寫操作:

tmp-pic

Ps.RDS已經計劃在idb中整合例項的空間診斷這個功能,幫助使用者分析例項空間的使用,診斷問題的根源。

四.例項規格:

不同的RDS例項規格提供了不同的效能指標,可以參考RDS不同規格的測試報告。如何選擇RDS的規格,由於該選項會直接關係你的應用是否在RDS上正常的運作起來,同時還關係成本的問題,所以深刻的理解這些引數,有助於你更好的使用RDS,更低成本的使用RDS。下面來分析一下RDS規格中這3個關鍵指標:

  1. 記憶體(mem):記憶體是例項的核心指標之一,比如2400M Mem記憶體的例項,記憶體引數大小配置在例項的引數檔案中,限定了例項能夠使用的記憶體大小為2400M。由於記憶體的訪問速度遠遠大於磁碟,所以通常情況下,記憶體中快取的資料越多,資料庫的響應就越快;如果記憶體較小,當資料超過一定量後,就會被重新整理到磁碟上,如果新的請求再次訪問該資料,就要從磁碟上把它從磁碟中讀取進記憶體,消耗磁碟io,這個時候資料庫響應就會變慢。
  2. IOPS:剛才提到資料從磁碟讀取到記憶體,或者資料從記憶體寫到磁碟都需要消耗io,而磁碟的io能力是有一定,比如新1型提供的iops為150個,也就是每秒能夠提供150次的隨機磁碟io操作,所以如果使用者的資料量很大,記憶體很小,而寫入,更新,刪除,查詢的壓力很大,由於iops的限制,對於資料庫來說就是一條sql需要執行很長的時間才能返回結果,對於應用來說就會造成整體響應的變慢;
  3. 連線數:連線數是資料庫中的一個概念,在RDS中的連線數是指使用者最多能夠建立多少個連線。使用者的連線數使用的多少取決於使用者的連線型別,例如使用者使用了連線池管理連線的長連線應用(如java類應用),在連線池中配置的最大連線數為100,那麼在RDS中看到的連線數應該為:app伺服器×100;對於短連線的應用而言(如php應用,C/S結構的應用),一個請求到到資料庫,就會產生一個連線,當請求完畢後就會釋放連線。當用戶使用的連線數超過了例項規定的連線數後,RDS會直接拋錯給應用,mysql:too many connections,sqlserver:Logon failed for login ‘u_xxxx’ due to trigger execution.

     可以看到上面的3個核心指標都能夠直接影響使用者使用,下圖展示了不同規格能夠達到的QPS指標,該測試報告採用標準的sysbench oltp(讀寫混合)測試模型,可以作為每種例項規格的吞吐能力的參考,使用者可以根據自己的業務壓力來選擇合適的例項規格:

五.地域選擇:

RDS的叢集主要分佈在杭州和青島兩個地域,使用者往往採用SLB+ECS+RDS的架構,所以保持著三者在同一個地域就可以了,杭州到青島的網路訪問延遲大概在20ms左右,所以應當避免跨地域的訪問情況。

希望這篇文章對你使用RDS有幫助。