以上从多个角度阐述了Laxcus主要组成部分和应用情况。所有设计都是基于现实环境下的评估、对比、测试和考量。设计的基本思路很明确,就是将各项功能分解、细化、归类,形成一个个可以独立、小的模块,每个模块承担一项职能,再把这些模块组织起来,在一个松耦合框架管理下,协同合作,来完成大规模的数据存储和计算工作。
设计中的主要问题源自有限的基础设施和变化中的应用需求之间的矛盾。如何在不损失处理性能的前提下,将有限的基础设施资源利用率做到最大化,是设计考虑的重点。这也是一个和硬件密切相关的问题。
在核定系统设计目标时,我们面临多种选择。大多数情况下,没有鱼和熊掌兼得的可能,只能二选一做出取舍。考虑到系统虽然经过很多简化处理,但是为了满足需求,仍然存在太多环节,加之这些环节之间各种关联导致的复杂性,我们将稳定、可靠、“大”这三项指标放在首位,其它指标则做为次要需求放在后面。所以,从这一点来说,Laxcus虽然能够管理百万级的计算机节点,实现了EB级的数据存储计算能力,也提供了基于内存的快速数据处理解决方案,但并不是一个为追求“快”而设计的大数据系统。
现在再回过头,根据我们的经历,来看一个我们组织实施并投入运营的集群基本配置情况:拥有从数百台到千台左右规模的计算机,采用X86架构的32/64位芯片,每台计算机配置2 - 8G的内存,2 - 4TB储量的温彻斯特硬盘。计算机被部署在多个机架上,采用千兆的光纤网络,通过多台交换机实现连接。不同的时段内,会有数百到数万个用户,每个用户并发多个任务使用着这个集群。
可以看到,在这样的网络环境中,每台计算机能够分到的带宽并不多,考虑到Laxcus是多用户系统,每个用户又并行执行多个任务,实际分配给每个任务的带宽就更低。集群在执行正常的数据处理业务之外,还有大量辅助业务也要通过网络传输数据,如果把全部数据用量统计起来,这样的带宽很容易发生超载现象,而集群运行也严重依赖着网络通信,这部分的带宽资源是不能够被挤占的。所以,如何节约数据处理过程中的各种存储和计算开销就变得非常关键。
节约的一个办法是杜绝冗余数据。
冗余数据主要产生在数据生成阶段,预防手段也很简单:对数据进行精确的筛选和抓取。这就涉及到存储方案的设计。
为了适应不同业务需要,我们设计了行/列两个存储模型。存储模型的最小存储单位是列。在列这个层面上,数据可以随意地组织、置换和计算,在保证灵活性的同时不失其精准性。与之相关的,把SQL融入分布描述语言,与分布环境结合具有一举多得之效。比如借助Where子句的多条件组合查询能力,通过SELECT语句将其分散作用到数据存取层面后,以列为单位的检索结果可以直接在计算机生成,从而避免了冗余数据在网络上传输。这种数据处理方案,非常符合分布环境下在数据源位置进行计算的原则。即以移动计算代替移动数据计算的原则。
节约原则还体现在对数据格式的原始定义上。
Laxcus设计规定,数值统一采用二进制格式表述。比如一个整型值,二进制格式固定为4个字节,如果换作字符串表述再加上符号位,最大将达到11个字节。这就使得二进制数值无论是在磁盘和内存里存储,还是在网络上传输,数据量都比其它格式要少。而且因为数值的长度固定,当进入CPU层面进行处理时,不需要转换数据类型,就能够被CPU识别和计算,比如C语言就可以通过指针可以直接引用。这在执行数据密集的计算任务时,能够显著提高计算效率。
FIXP协议也是体现二进制优势的又一个例证。在网络通信中,基于UDP传输的监控包占了很大比例,因为二进制使得FIXP包的数据长度相对较小,通常都小于一个IP包的长度,也低于链路层对数据包的尺寸限制。这样的结果使得FIXP包能够被直接传输,避免了在网络两端对数据包进行的分组和重组操作。这个小小的改进使得FIXP协议的丢包率大为减少,不可靠的UDP通信成功率大为增加,获得了更高的通信稳定性。
设计中另外着力考虑的是网络环境下数据计算面临的诸多问题。
数据块成为解决这些问题的关键。
如第3章所述,数据块的基本特点是长度固定。只此一点,就避免了磁盘碎片和减轻了数据维护的难度。也是因为这个原因,使得数据在网络间的传播极为简单,为网络环境下的数据备份和负载平衡奠定了基础。同时,把对磁盘影响最大的写操作转移到内存执行,以空间换时间的手法,将磁盘的写操作延迟降到最低,使磁盘更专注于读操作。更进一步,通过引入数据优化和数据构建,使得用户更能够按照自己的意愿组织和检索数据。表现在磁盘上,直接的反映就是减少了读操作次数。这些都对改善磁盘处理性能、提高数据计算效率甚为重要。
在数据块之外,最需要提及的当属Diffuse/Converge算法,这是整个网络计算的核心。算法将网络计算过程分为两个步骤:Diffuse向网络上查找数据后进行分配,Converge在已经分配的数据的基础上,对数据进行再组织和再分配,数据的每一次的输出做为下一次的输入,通过数次迭代得出计算结果。围绕着Diffuse/Converge算法,又进行了一系列的配套设计。通过将系统和用户功能的分离,用户实现网络计算接口可派生编程,系统实现热发布、任务调度,模平均分配数据,任务命名,Conduct语句,使得这些模块在其中各司其职,运行时组织起来,形成从终端到数据存储层面,一个完整的网络计算体系。在保持了简单和易用性的同时,也实现了大规模数据并行计算的目的。
冗灾处理也纳入了网络计算体系中。因为具有弱中心化管理和故障主动判断的能力,系统能够在很短时间内感知到故障的存在,并主动回避故障源。对于故障节点,系统一旦确定就会将其隔离,不会再出现在集群里,同时采用数据冗余和再恢复的办法,保护正常的数据处理业务。
另外,在许多技术细节上,也进行了优化处理。比如在执行底层计算时,针对数据密集的这个特点,加入X86架构的SSE指令后,能够使计算效率取得成倍的增长。或者在计算中使用更多的加、减、移位指令,取代乘、除指令,也能够达到减少指令计算周期、提高计算效率的目的。还有一个更直接的手段是采用64位的CPU,根据测试统计,经过LINUX GCC64位编译器编译的C/C++语言代码,在执行密集型数据计算时,效率比32位代码普遍提高15%-20%。
对于未来,应该根据集群和数据处理业务的具体特点,选择合适的软硬件组合。如文章开篇所言,集群计算不在意个体计算单元性能的强弱,它是把众多且分散的计算单元通过网络组织起来,以协同工作的方式,取代那些单一但性能强大的集中计算。这种以多胜强特点,为实现低成本的计算业务带来福音。这种情况,在数据中心表现尤其明显。在现在的数据中心内部,计算机和维持计算机运行的制冷设备,它们消耗的电量非常庞大。如果采用移动架构的硬件设备,不单计算机能耗会显著下降,计算机体积缩小,单位空间内的计算机布署数量增加,制冷的需求也会大幅降低。这样的基础设施被部署到数据中心后,将直接降低数据的运营成本。其所产生的影响,正如PC架构取代了当年的小型机一样,现在移动架构取代PC架构已经露出峥嵘之势。在强调总体拥有成本(TCO)的今天,配合大数据的到来,将掀起一场新的数据计算革命。
这可能不是一个太漫长的过程,这里面还有许多工作要做。
现在只是刚刚开始。