直擊Hadoop中國雲計算大會:HBase安全性

一年一度的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鏈,如圖:

  EndPoint

  如果說HBase Observers類似關係數據庫的觸發器,那麼HBase的EndPoint概念上則類似存儲過程,提供了顯式參數RPC函數調用。如圖,客戶端自定義接口,調用RPC方法。其中,HTable.coprocessorExec()調用返回列數的大小,而此調用又會跨越不同的Region Server,然後分割,並行執行,最後返回結果。

訪問控制器

  訪問控制器(AccessController)作爲HBase的核心,主要負責訪問控制列表(ACL)與權限管理。從ACL的角度看,AccessControllerProtocol提供RPC調用,更新與查詢用戶權限。而ZooKeeper作爲監聽器,通過集羣同步ACL的變更。從權限管理的角度看,RegionObserver觸發的對象爲DML操作,而MasterObserver針對的是DDL操作。

  作爲一個具體例子,AccessControllerProtocol作爲一個EndPoint,實現AccessControllerProtocol接口,代碼如下:

  另一個例子,AccessController提供函數preGet通過RegionObserver與MasterObserver實現權限訪問檢查,代碼如下:

 

爲更加便於理解,這裏給出preGet()用例圖。這裏驗證的是用戶的credential,如果驗證成功,則繼續下一步操作,如果失敗則拋出AccessDeniedException。

 

  Secure ZooKeeper                      

  ZooKeeper作爲監聽器,在HBase集羣起到關鍵作用,具體表現在:

  •   · Root catalog table location
  •   · Region assignment
  •   · Server "liveness"
  •   · Synchronizes ACLs throughout cluster
  •   · Synchronizes secret key rolling for token authentication

  如前所述,ZooKeeper能監聽ACL的變更,如圖:

  我們可以看到,綠色的znode爲public,一般來說,該作用域適用於客戶端所需操作。紅色的znode爲private,通常爲集羣操作安全性要求較高的znode。

  總之,安全性是企業應用繞不開的話題。HBase 0.92在安全性方面有非常大的改進,相信越來越多的公司會選擇HBase。通過HBase讀寫數據的產品也會越來越多。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章