淺談Raid Cache Memory上應用的問題和實踐
作者：Michael Zhang
 $1, Raid和Cache Memory
通常，出於二個目標：安全和性能，我們在生產環境的服務器上會設置Raid功能。最常見的場景是，我們會由於安全性的考慮將磁盤設置成Raid 1 或Raid 5、Raid6等模式保障在 ...
Raid Cache Memory 性能 电池
作者：Michael Zhang
 $1, Raid和Cache Memory
通常，出於二個目標：安全和性能，我們在生產環境的服務器上會設置Raid功能。最常見的場景是，我們會由於安全性的考慮將磁盤設置成Raid 1 或Raid 5、Raid6等模式保障在 ...
### $1, Raid和Cache Memory


通常，出於二個目標：安全和性能，我們在生產環境的服務器上會設置Raid功能。最常見的場景是，我們會由於安全性的考慮將磁盤設置成Raid 1 或Raid 5、Raid6等模式保障在一塊或多塊硬盤故障時數據不丟失。或者是由於Dis IO性能上的考慮將硬盤設置成Raid 0或Raid 10來擴展有限的IO。


無論DELL/HP/IBM等服務器廠商，都會OEM一些Raid控制器在實現Raid功能，而為了保障和提升讀寫性能，Raid控制卡裏都會內置128MB 至 1GB不等的Cache Memory，而我們對磁盤的讀和寫操作都會通過事先在Cache Memory中Hit或緩存，這樣一來就可以大大提高了實際IO性能。


![](/data/attachment/album/201401/22/094816h6mveopi336pyie6.png)


OS也認為只要讀或寫到Cache Memory以後即算操作成功，而Cache Memory中的數據如何Flush到物理磁盤中的Policy控制則由Raid控制器來解決。這種通過寫入Cache Memory的Policy我們稱為WriteBack，而如果不通過Cache Memory直接寫入磁盤的Policy我們稱為WriteThrough。


![](/data/attachment/album/201401/22/094900u522whinoixbd2fh.png)


任何一條數據寫入Memory和寫入磁盤的性能差別之巨大，不用比較都可想像得到是天壤之別。特別是當我們遇到MySQL等數據庫或其他IO要求壓力非常大的環境，這是我們實際生產環境中不得不要考慮的因素。


### $2, BBU,TBBU在實際應用中的問題和運維


什麼是BBU/TBBU呢？其實BBU就是Raid卡中的一個電池備用模塊，因為之前我們說到在Raid的環境下很多情況下數據都是通過Cache Memory和磁盤交換的，而Memory本身並無法保障數據持久性，萬一電源中斷，而數據沒來得及flush到物理磁盤上，就會造成數據丟失的悲劇。為此硬件廠商提供了BBU和TBBU，其中包含了一塊鋰電池來保障萬一電源中斷的情況下，Cache Memory中的數據不至於丟失，直至電源恢復。TBBU的不同區別是Cache Memory和電池是做成一個模塊，以防止Raid控制器如果硬件故障的時候，在更換Raid控制卡過程中可以不更換TBBU及其中的Cache Memory，防止這一過程中的數據不丟失。


就是這麼樣的一個模塊，如圖：


![](/data/attachment/album/201401/22/094954qfibmrzwfgsvrzzh.jpg) ![](/data/attachment/album/201401/22/095014fr3tlrrrga6lh465.jpg) ![](/data/attachment/album/201401/22/0950307t5o75wsfqmghcsl.jpg) ![](/data/attachment/album/201401/22/095051l87qq0m1ylv1bqzz.jpg) 正是由於使用電池做為持續Memory是數據的可靠性，而存在一個尷尬的隱患。以目前的技術水平，電池是不可以長期不充放電的，否則會造成電池損壞而無法起到保護數據的特性。所以Raid卡廠商在設計BBU/TBBU中加入了一個自動充放電的維護過程，每過一段時間（通常是數個月左右）會自動對電池放電，然後再自動充電，以保證電池的可用性。


![](/data/attachment/album/201401/22/095148zptihiic8t8hctcv.png)


而在電池放電的時候，出於數據安全性的考慮，Cache Policy默認從WriteBack改成WriteThrough。這段時間會持續數小時或更久，IO性能會因此大幅下降，如果正好這個時間你有數據庫或其他大量IO壓力的服務，性能會急劇下降，如果系統沒有足夠的Capacity的話，嚴重的話會導致服務可用性的賁潰。


為了防止出現這種情況，通常業內大家會使用各種想法：


a) 給系統留出足夠的Capacity，即使WriteThrough的時候也可以保障服務的性能是可接受的


b) 自動或半自動的地設定在系統負載最低的時候提前去觸發電池的充放電過程


c) 將Cache Policy設置為CachedBadBBU，也就是即使在充放電過程中，還是使用寫入Cache的WriteBack，而不是默認的WriteThrough，這存在的風險是這一過程中的服務器電源中斷會造成數據丟失，這不是一個最安全的選擇，但如果業務上可以接受這個風險，如果Data Center的供電足夠安全，如果服務器有冗餘的電源的話，未必不是一個好的選擇。


d) 當A服務器發生這一情況時能自動或半自動地切換到Backup的節點上，必竟二臺服務器同時發生這一自動維護過程是不太可能的，但同一批次的服務器是有可能的，並且這可以從時間和過程中去人工調節。


e) 從軟件、業務程序上來保障對數據持久性或一致性的取捨。


 


目前國內大家常用的DELL和HP服務器多數都已經集成了LSI公司的Raid控制器，以上的這些狀態和Policy的調整在Linux中都可以通過其MegaCLI工具包操作：


![](/data/attachment/album/201401/22/095225znalkapp69cgpkvz.png)


### $3, ZMCP,CacheCade技術的原理和應用


單從硬件運維角度來看，BBU和TBBU帶來的Cache Policy問題如果在幾百臺或上千臺服務器環境下維護將會是一個非常繁瑣的過程，除非從軟件上來對安全性和數據一致性的取捨。


所以新的一代的Raid控制器出現了另一種選擇。其中Adaptec公司提供了ZMCP模塊，而LSI公司提供了CacheCade的軟件支持。


ZMCP就是Zero-Maintenance Cache Protection的意思，在支持ZMCP的Raid控制器上加裝一個ZMCP模塊將不再依賴電池對Cache Memory的保護，而是通過SLC的Flash NAND和電容來保證在電力中斷時數據的可靠性：


![](/data/attachment/album/201401/22/095351lx9lis9ljl9cicxq.png)


而LSI的CacheCade是一個軟件的License，可以支持通過SSD來持久化Cache Memory，而不是通過不能持久化的Memory。優點是可以讓Cache Memory更大，並缺點也顯而易見。


![](/data/attachment/album/201401/22/095441zqbi66sr0dzpx7s7.png)


從性能上的測試來看明顯ZMCP會占有優勢，但同時也是成本上的劣勢。而且無論是哪種新的技術都暫時性地會帶來相對BBU/TBBU技術的成本增加，出於成本上的考慮，所以目前大部分DELL/HP服務器依舊會OEM原有的方案。


但是從更專業的業務環境下去定制的服務器上，在軟件、性能、硬件等方面做更合適自己的取舎將是給每個人更自由的選擇範圍。在此希望我在實踐和看到的information希望能給到大家有益的幫助。


### $4, 引用和參考資料


* Dell™ PowerEdge™ 可扩充 RAID 控制器 5/i 和 5/E 用户指南  
<ftp://ftp.dell.com/Manuals/all-products/esuprt_ser_stor_net/esuprt_dell_adapters/poweredge-rc-5i_User's%20Guide_zh-cn.pdf>
* Dell h700 adaptor vs integrated 的分別  
<http://www.hkepc.com/forum/viewthread.php?tid=1681179>
* 零维护缓存保护 Zero-Maintenance Cache Protection  
<http://www.adaptec.com/nr/pdfs/cn-ZMCP_wp.pdf>
* LSI® MegaRAID® CacheCade™ Pro 2.0 Read/Write Caching Software  
<http://www.lsi.com/downloads/Public/Advanced%20Software/LSI%20MegaRAID%20CacheCade%20Software/CacheCadePro2_PB.pdf>
