磁盘阵列是服务器上历史悠久的一项技术,它能够通过不同的阵列模式合理利用空间和性能配比出性价比极高的磁盘阵列,被大部分服务器OEM厂商所广泛采用。其中以LSI公司的MegaRAID SAS产品为主,广泛用于各品牌(除惠普外)x86服务器。

 

为何有缓存?

阵列卡核心技术包含三部分内容:1、数据条带化;2、数据冗余;3、高速缓存。其中高速缓存即所谓的阵列卡内存(以下简称缓存):阵列卡控制器通过一系列算法将上层应用下发的写请求进行优化并存储在阵列卡的高速缓存内以此提高应用的写性能(上层应用不必等待数据实际Flush到磁盘上即可完成写操作)。由于阵列卡缓存也属于RAM(易失性存储)的一种,因此也存在掉电丢数据的风险。一旦服务器断电,阵列卡缓存中的数据就会丢失,这会给应用造成数据一致性的风险。

电池的诞生

为了保障断电后数据的一致性,于是一种可循环充电式的电池被应用到阵列卡缓存单元上。如今大部分阵列卡缓存单元都会外接一个可充电式的电池包,以此来为断电后的缓存提供电源支持,同时保障数据在一定时间内不丢失(这个时间通常为48小时)。待到下一次服务器再次恢复电源后,阵列卡控制器会将缓存中的数据Flush到磁盘,以避免脏数据的产生。

缓存的供电方式

1、一般情况下服务器通电时阵列卡缓存使用的是主板供电;
2、服务器断电后阵列卡板卡电路自动将缓存的供电方式由主板切换到电池;

电池为何要进行充放电操作?

LSI阵列卡用的是锂电池方案,我们知道锂电池有较强的惰性,它在非充电状态下会缓慢地自放电(电池特性),一段时间后电量就会下降。为了能够及时校准电量避免电池因为自放电而导致电量不明确,于是阵列卡控制器会对电池进行周期性地充放电操作(Relearn),以此保证电量的准确性,同时还可以判断电池是否故障或者老化。

电池充放电会有哪些操作?

1、控制器首先对电池进行完全放电直至零电量;

2、控制器重新对电池进行充电操作直至充满;

3、控制器对电池的电量重新进行计算校准;

4、等待下一个充放电时间点;

为何充放电会引发性能问题?

充放电操作时由于电池电量无法提供足够的数据保障时间,为了避免风险发生阵列卡控制器默认会将缓存关闭,正是由于缓存被关闭而引发了写性能急剧下降的问题。

 

惠普服务器为何没有同类问题?

1、惠普服务器使用的是自家设计的基于PMC控制器的阵列卡,它采用的是镍氢电池。镍氢电池没有太强的惰性,并且特性和锂电池不同,它并不需要通过完全放电来校准电量。
2、当镍氢电池由于自放电而导致电量降低时到一定程度时(比如80%),阵列卡控制器会检测到电量下降并对电池进行娟流充电以补充失去的电量。整个过程对用户是透明的,也不需要关闭缓存,因此并不会影响IO性能。

 

是否存在可充电式电池的替代方案?

有!闪存式电容方案不但可以替代电池提供几乎无限的数据保护时间,并且控制器也不会因为充放电操作而关闭缓存。闪存式电容能够在服务器断电时,由高容量电容向阵列卡短暂地供电(大约几分钟),随后阵列卡控制器会将缓存中的数据全部复制到同等容量的闪存介质上。因为闪存是非易失性存储器,因此可以认为数据保护时间是无限的。待下一次服务器正常通电开机,阵列卡控制器在初始化阶段会将闪存中的脏数据重新Flush到磁盘上。

当然闪存式电容方案也不是绝对完美的,缺点也显而易见,就是成本太高!

 

为何采用可充电式电池?

1、基于可充电式电池的缓存单元价格低廉,比起基于闪存式电容的缓存单元要便宜许多;
2、可充电式电池通过循环充电已经能够满足一定的数据保护时间。

说到底还是因为成本!

 

阵列卡自动充放电带来的运维问题?
1、电池寿命有限,更换周期通常是2-3年,更换需要停机操作,增加运维工作量;
2、电池自动充放电时会强制关闭缓存影响写性能,给业务性能造成很大影响,给运维带来压力;
3、由于电池问题引发的问题和故障数不胜数,增加运维团队的工作量。

 

为何放弃阵列卡自动充放电功能?
1、通常服务器都是双电方案,单电源故障的更换操作可在线完成;
2、绑线规范使得电源和插头之间不会出现松动脱离的情况,更加减少了掉电的风险;
3、单个电源的月故障率远远低于磁盘、内存、阵列卡,双电同时故障概率极其低;

 

充放电问题的解决方案:

1、缓存单元的供电方案更换成闪存式电容;

2、缓存设置为WT(写缓存开启)和CachedBadBBU(强制写缓存开启),AutoLearn仍旧周期性进行只是该过程进行阶段缓存不会被关闭;(推荐)

3、担心AutoLearn期间电池的数据保护时间不够的话,也可以选择不强制打开写缓存,仅在业务低峰期时通过MegaCli工具人为地进行电池Relearn操作。