元核云如何解决Ceph分布式存储中碰到的坑

最近有很多朋友拿着一篇关于“ceph运维那些坑”的文章来找我,起初我并没有在意,毕竟对于一个“新物种”来说,存在质疑是再正常不过的。不过,陆续有更多的合作伙伴甚至圈内同行来问我如何看待这篇文章时,我觉得做为一名Ceph开发和运维的技术者,理应站出来为Ceph说点什么。

首先,原作者分析Ceph运维中遇到的问题是真实存在的,甚至在实际的运维过程中还出现过其他更复杂的问题。因为最初的Ceph只是社区提供的一套开源版,因而想要实现产品化需要趟过很多次“坑”,就像最早的安卓系统一样。我想任何产品在一开始都难以做到十全十美,因为技术本身就是在发现问题与解决问题的道路上不断前进发展的。不过,在这里我想澄清的事实是:连初涉Ceph的运维人员都能发现的问题,研究Ceph多年的资深技术人员们肯定也早已发现。

接下来我就根据那篇文章中提到的坑,来说一说在实际产品化过程中我们是如何解决它们的。

一、扩容问题

Ceph本身基于Crush算法,具备了多种数据复制策略,可以选择在磁盘、主机、机柜等等位置附着。例如:如果采取3副本的数据保护策略,就可以通过复制策略来决定这3个副本是否同时分布在不同的磁盘、不同的主机、不同的隔离域、不同的机柜等位置来保证部分硬件故障后数据安全性和服务运行不中断。

Ceph底层是用资源池(POOL)来实现数据逻辑隔离,往往我们会出现因容量或性能不足需要对资源池进行扩容的问题,但是在容量扩容过程中,势必会带来进行数据重新平衡的要求。Ceph中数据以PG为单位进行组织,因此当数据池中加入新的存储单元(OSD)时,通过调整OSDMAP会带来数据重平衡。正如文章所提到的,如果涉及到多个OSD的扩容是可能导致可用PG中OSD小于min_size,从而发生PG不可用、IO阻塞的情况。为了尽量避免这种情况的出现,只能将扩容粒度变小,比如每次只扩容一个OSD或者一个机器、一个机柜(主要取决于存储隔离策略),但是这样注定会带来极大的运维工作量,甚至连扩容速度可能都赶不上数据增长速度。

正是针对这个问题,元核云分布式存储产品在运维管理平台层面进行了优化。扩容发生时,运维人员只需要将待扩容的服务器信息以及策略加入到运维管理平台中,后面的事情都由运维管理平台进行自动化处理。简单来说,运维平台会根据PG的状态和待扩容OSD资源,寻求一个最优的扩容方式,即在不影响PG可用性的情况下,循序渐进地进行OSD扩容,直到扩容动作完全完成为止。例如:在三副本的场景下,当某一个PG加入两个OSD后,运维平台会通过算法把扩容分为两次完成,每次仅扩容一个OSD,这样就能保证PG的min_size始终大于1。而这整个过程完全由运维平台自动完成,对运维管理员完全透明。

二、数据迁移过程中的IO争用问题

文章中提到的第二个问题主要是讲在频繁数据迁移过程中带来的IO争用问题。当集群规模变大后,硬盘损坏、PG数量扩充可能会变得常态化。

以我们的运维经验来看,客户大概每年都会有几次的相关运维操作。在我们运维过的所有集群中,最大的超过了1000个存储节点,而在这过程中会遭遇到每个月损坏1-2台硬盘、3个月左右进行一次集中换盘的情况。这些运维操作都需要通过数据迁移来进行数据恢复,数据恢复过程中会对硬盘的IO进行争用,如何有效、智能地控制并恢复IO,并做到使业务IO不受影响,是Ceph运维管理的核心工作。

在元核云自动化运维管理平台中,会采用时间策略、流量策略来控制数据恢复的速率。我们会在业务的高峰期,8:00——18:00这一时间段内使用某种流量恢复策略,在业务的低峰期,18:00——第二天8:00这一时间段使用另一种流量恢复策略。在流量恢复策略中,可以基于磁盘的IO利用率情况,来动态调整数据流量恢复速率,比如说设置恢复流量占用IO利用率阈值不能超过50%,则总会保证不因恢复流量导致IO的利用率超过50%,当业务IO占比越大,恢复IO占比就越小,当业务IO利用率超过50%时,则停止恢复IO。此种方式可以灵活有效地利用闲时IO,在不影响业务IO的情况下,快速完成数据迁移恢复。

三、PG数量调整问题

当解决了数据迁移过程中的PG可用性问题和IO争用问题后,关于文章中提到的PG数量调整问题自然也就解决了。数据迁移本身是一个常态化的过程,当控制了数据在迁移过程中的不良影响,同时在OSDMap变化过程中,PG始终能够保持可用状态,那么就并不会像那篇文章中所说的那样,调整PG数量会带来灾难性的后果。况且,PG的调整确实也不是一个经常性的动作。

四、集群利用率问题

文章中提到的存储成本问题主要是讲集群可用率问题,即Ceph集群规模增大后,伪随机算法导致了存储资源分布不均衡,磁盘利用率方差过大的问题。

其实要做到保证每块盘的数据均衡,这是一个比较复杂的过程。因为首先要确保数据分布能够遵循每个Pool的Rule-Set规则,同时又要保证每个Pool对应的PG较为合理的分布在每个OSD中(因为有些Pool是放元数据的,并不会承载大量的数据),同时还要保证当PG数量发生变化时不会发生灾难性的数据迁移(stable_mod)。元核云在Ceph基础上开发了智能数据分布管理特性,它能通过预先设定好的计算模型,反复迭代计算,预测出一个最优的数据分布,在现实运维经验中,我们可以保证OSD之间的数据容量之差不超过2%,存储集群空间可用率达到95%以上。此特性功能会对因集群初始化、扩容、硬件故障等原因导致的数据迁移后的数据失衡进行管控,实现较优的空间使用率。

五、运维复杂度问题

正如文章所提到的,Ceph本身是一个十分复杂的体系,要做到稳定运维非常看重团队的实力。元核云除了对Ceph核心进行了深度优化,还提供了一套支持跨数据中心多Ceph集群的自动化运维管理平台,能极大提高运维效率、降低Ceph存储集群运维成本。目前我们通过这套运维平台,做到了五个数据中心上千个节点的存储集群,每年仅需一个运维人力的案例。

总而言之,对于那篇文章中提到的“坑”,其实我们早已做好了充分的预防策略。纸上谈兵都是容易的,实际操作却比之复杂千万倍。怎样才能跳出人云亦云的圈子,真正认识到事实的本来面目,还是需要有长久的实践操作经验才能够看清楚。元核云主导负责的某大型金融集团近50PB+的分布式存储方案,属于国内金融行业最大的Ceph存储案例,达到了4年的软件存储产品本身零故障记录,期间也经历了各种网络异常、服务器和硬盘故障、服务器扩容、操作系统打补丁和升级、存储软件打补丁和升级等运维问题,仍然完好地维护了存储数据。软件定义存储软件系统属于工程型项目,需要大规模的生产实践经验和时间积累,遇“坑”填“坑”,才能保证其产品的成熟度。存储毕竟是底层核心的关键技术产品,数据的最后一道防线,如果要正式进行生产应用,还是建议大家使用成熟的商业化Ceph存储产品。