一年一度的Hadoop中国2011云计算大会,作为Hadoop in China社区的一次年度技术盛会,于12月2日至3日在北京成功举行。大会的亮点之一就是邀请了多位Apache软件基金会的专家,例如Apache软件基金会主席兼Apache Hadoop项目负责人Doug Cutting先生等。大会的第二天,记者参加的“Hadoop生态系统”分会场报告环节。Trend Micro的专家兼Apache Incubator Flume的提交者,从非结构化数据库的安全性角度作了一场题为“HBase Coprocessors and Security”的主题报告。
众所周知,大数据时代为类似HBase等非结构化数据库提供了诸多机会。HBase凭借其在海量数据的良好扩展性和高效的读写能力,吸引了更多公司的重视。然而,在众多机遇的背后,HBase也面临着很多挑战,比如构建和运维HBase集群是一个非常有挑战性的工作。而如何保证HBase的安全性自然就成了一个绕不开的话题,实际上,NoSQL存在的产品安全性不高的问题一直成为各路反对者的诟病。现在部署在云计算公有云的HBase集群也在日益增多,试想一下,如果没有访问控制,存储其中的数据可以被随意访问甚至执行删改等误操作,会造成很多潜在的风险,对企业而言,也是无法接受的。但是,如果所有事情都由管理员处理,沟通的代价就会很高,而且管理员不得不处理一些Application相关的工作,导致管理低效。因此,HBase的访问控制,就成为了一个很重要的需求。这次围绕HBase 安全性的演讲,让我们有理由相信HBase提供了足够的安全支持。
首先谈到的是HBase的新版本特性。作为最新版本,HBase 0.92马上要发布RC版了, 0.92支持最新的Hadoop版本0.20.205,该版本对于HBase有了很大的改进。具体表现在:Distributed WAL splitting策略,Coprocessor框架等等。
Distributed WAL splitting
所谓WAL(write-ahead logging)策略指的是Region servers每次将内存数据更新到磁盘之前都需要先写到一个log里,只有当写入成功后才通知客户端该操作成功了。之后,Region servers服务端就可以根据需要在内存中对数据进行随意批处理或者是聚合。WAL策略的工作流程如下:客户端发起数据修改动作,比如产生一个put(),delete()及increment()调用。每个修改操作都会被包装为一个KeyValue对象实例,然后通过RPC调用发送给对应regions的HRegionServer。一旦KeyValue实例到达,它们就会被发送到给定的行所对应的HRegion。数据就会被写入WAL,然后被存入相应的MemStore中。最终,当memstore达到一定大小后,或者过了特定时间段后,数据就会异步地持久化到文件系统中。在此期间数据都是保存在内存中的。WAL可以保证数据不会丢失,即使是在服务端完全失败的情况下。
WAL是灾难发生时的救生索。与MySQL中的binary log类似,它会记录下针对数据的所有变更。如果服务器crash了,它就可以通过重放日志让一切恢复到服务器crash之前的那个状态。
而所谓的WAL splitting指的是在log中的修改操作可以被replay之前,把它们按照region分离出来的过程。读取日志然后按照每条记录所属的region分组。这些分好组的修改操作将会保存在目标region附近的一个文件中,用于后续的恢复。
WAL splitting的实现在几乎每个HBase版本中都有些不同:早期版本通过master上的单个进程读取文件。后来对它进行了优化改成了多线程的。0.92版本中,最终引入了分布式log splitting的概念,将实际的工作从master转移到了所有的region servers中。
Coprocessors
Coprocessor Framework, 允许HBase 管理员在Region server中载入定制的代码。Coprocessor的机制可以理解为,server端添加了一些回调函数。coprocessors由3个部分组成:
Coprocessor interface定义的回调函数如下:
1、preOpen, postOpen: Called before and after the region is reported as online to the master.
2、preFlush, postFlush: Called before and after the memstore is flushed into a new store file.
3、preCompact, postCompact: Called before and after compaction.
4、preSplit, postSplit: Called after the region is split.
5、preClose and postClose: Called before and after the region is reported as closed to the master.
RegionObserver interface定义的回调函数如下:
1、 preGet, postGet: Called before and after a client makes a Get request.
2、 preExists, postExists: Called before and after the client tests for existence using a Get.
3、 prePut and postPut: Called before and after the client stores a value.
4、 preDelete and postDelete: Called before and after the client deletes a value.
5、 preScannerOpen postScannerOpen: Called before and after the client opens a new scanner.
6、 preScannerNext, postScannerNext: Called before and after the client asks for the next row on a scanner.
7、 preScannerClose, postScannerClose: Called before and after the client closes a scanner.
8、 preCheckAndPut, postCheckAndPut: Called before and after the client calls checkAndPut().
9、 preCheckAndDelete, postCheckAndDelete: Called before and after the client calls checkAndDelete().
EndPoint可以让我们将执行代码逻辑动态进入Server端,并让其执行。
通过coprocessors,HBase将获得许多新的特性,比如:HBase access control,Column aggregate,Region level indexing,Table metacolumns,New filtering,HBase table, region access statistic,HLog extension。
在给出相应定义,原理等理论之后,分别从列式聚合,定制WAL行为,安全性三方面给出一些Use case。
HBase Observers
HBase Observers类似关系数据库的触发器,提供了与HBase交互过程中的基于事件的回调函数。按类别分,HBase Observers分为RegionObserver,MasterObserver,WALObserver。
具体来说,RegionObserver在下列事件发生时被触发:
- · CRUD(增删改查)或者DML操作
- · 表数据的Get, Put, Scan等操作的Pre/post-hooks 回调
- · 对客户端数据的响应结果的数据追加或替代
- · 覆盖正常的请求处理
MasterObservers适用场景为DDL操作,元数据操作,集群管理等。WALObserver针对的是WAL的追加或还原。
值得一提的是,这些HBase Observers可以协同工作,形成一个完整的Observer链,如图:
(责任编辑:安博涛)