閱讀990 返回首頁    go 阿裏雲 go 技術社區[雲棲]


RDS最佳實踐(一)–如何選擇RDS

在去年雙11之前,為了幫助商家準備天貓雙11的大促,讓用戶更好的使用RDS,把RDS的性能發揮到最佳,保障雙11當天麵對爆發性增加的壓力,不會由於RDS的瓶頸導致係統出現問題,編寫了RDS的最佳實踐。該文檔的內容全部出自於生產實踐,但由於篇幅的限製,我隻是把其中的概要羅列到了ppt中,並沒有展開詳細的介紹,後續計劃寫一個係列,把ppt中的內容進一步展開來講一講,也算是對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排查。
在阿裏的電商雲平台聚石塔,已經有大量的isv,商家正在改造自己的後台係統從sqlserver轉向的mysql,你還在猶豫什麼?

 

二.數據庫的版本:
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數據庫),存儲格式(數據類型,字段大小),存放方式(存儲引擎選擇,分區還是分表)。下圖的案例案例中,數據空間占用了實例大量的空間,用戶可以通過排查數據庫中到底是哪一張表占用導致的(可以參考性能優化–>大表優化)     圖1

2.  日誌文件:RDS采用的主備M-M的高可用架構,其主備之間的數據同步依靠日誌的方式,mysql:binlog,sqlserver:transaction log;同時RDS支持將實例恢複到任何一個時間點,這個功能需要依靠運用備份和日誌。為了減少日誌空間對用戶的空間的占用,RDS mysql會定時的把日誌備份到oss中,然後再將其清除,這樣用戶需要下載RDS日誌的時候可以從oss中獲取;對於sqlserver,rds對定期的對數據庫進行備份,然後將事務日誌進行回收。當日誌空間出現異常的時候,如下圖,由於應用寫入數據壓力過大,導致binlog日誌增加的速度大於了RDS上傳到oss的速度,造成了binlog日誌增長迅勐,這時候需要用戶對數據庫的update,insert,delete進行優化,減小對數據庫的變更操作:圖2

3.  其他文件:

  1. a.係統文件,每個數據庫在安裝的時候會初始化一些係統文件,這些係統文件是數據庫正常運行的前提,mysql:ibdata1,ib_logfile0,sqlserver:MSDBLog,master.mdf,下麵的這幅圖反映了RDS“其他文件”占用達到了非常多的問題,可以參考blog:ibdata1文件持續增加的問題定位

圖3

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

圖4

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左右,所以應當避免跨地域的訪問情況。

 

最後更新:2017-04-03 08:26:18

  上一篇:go 互聯網金融加速引發人才荒 或現“薪水泡沫”
  下一篇:go RDS-SQLSERVER不支持MSDTS的原因分析