1. 程式人生 > >BookKeeper全解(1)-BookKeeper簡介和快速上手

BookKeeper全解(1)-BookKeeper簡介和快速上手

什麼是BookKeeper

BookKeeper是一個提供日誌條目流儲存持久化的服務框架。特別適合日誌流儲存,一個比較經典的應用是作為訊息佇列Pulsar的持久框架。

那麼BookKeeper是怎樣產生的呢?

這個靈感來源於Hadoop生態系統。我們知道,Haddop生態系統的檔案儲存是HDFS,HDFS包含一種節點叫做NameNode,用於記錄所有的操作,在宕機的時候可以通過這些記錄進行恢復。
基於NameNode,BookKeeper拓展了其功能,設計成了一個基於遞增儲存的儲存系統,主要用於:

  • 高效寫
  • 基於複製的高容錯(訊息在ensembles之間複製,這個概念之後會講)
  • 高吞吐量寫

快速部署

我們這裡只為了部署一個除錯環境,並不是生產環境:
首先,拉下來BookKeeper的程式碼:

git clone https://github.com/apache/bookkeeper.git

之後,我們在conf目錄下可以看到:

conf
└─bk_cli_env.sh
└─bk_server.conf
└─bkenv.sh
└─jaas_example.conf
└─log4j.properties
└─log4j.cli.properties
└─log4j.shell.properties
└─nettyenv.sh
└─standalone.conf
└─zookeeper.conf
└─zookeeper.conf.dynamic

Bookeeper提供了本地啟動測試的類org.apache.bookkeeper.util.LocalBookKeeper,但是這個不太好除錯,我們想搞清楚實際BookKeeper的工作模式還有部署,最好做一個相對完整的本地環境出來

編譯程式碼,之後先在本地啟用一個ZooKeeper,這個直接下載最新版的,直接預設配置啟動即可(預設埠是2181)

之後,我們編寫三個不同Bookie(就是一個BookKeeper Server)的配置檔案,用於之後啟動:
Bookie1:

#############################################################################
## Server parameters
#############################################################################

bookiePort=3181
extraServerComponents=

#############################################################################
##  server settings
#############################################################################

httpServerEnabled=false
httpServerPort=8080
httpServerClass=org.apache.bookkeeper.http.vertx.VertxHttpServer

############################################## Bookie Storage ##############################################


#############################################################################
## Journal settings
#############################################################################

journalDirectories=d:/tmp1/bk-txn

#############################################################################
## Ledger storage settings
#############################################################################

ledgerDirectories=d:/tmp1/bk-data
indexDirectories=d:/tmp1/bk-data

############################################## Metadata Services ##############################################


#############################################################################
## Metadata Service settings
#############################################################################

metadataServiceUri=zk+hierarchical://localhost:2181/ledgers

#############################################################################
## ZooKeeper Metadata Service settings
#############################################################################

zkServers=localhost:2181
zkTimeout=10000
zkEnableSecurity=false

##################################################################
##################################################################
# Settings below are used by stream/table service
##################################################################
##################################################################

### Grpc Server ###
storageserver.grpc.port=4181

### Dlog Settings for table service ###

#### Replication Settings
dlog.bkcEnsembleSize=3
dlog.bkcWriteQuorumSize=2
dlog.bkcAckQuorumSize=2

### Storage ###

# local storage directories for storing table ranges data (e.g. rocksdb sst files)
storage.range.store.dirs=d:/tmp1/bookkeeper/ranges

# whether the storage server capable of serving readonly tables. default is false.
storage.serve.readonly.tables=false

# the cluster controller schedule interval, in milliseconds. default is 30 seconds.
storage.cluster.controller.schedule.interval.ms=30000

Bookie2:

#############################################################################
## Server parameters
#############################################################################

bookiePort=3182
extraServerComponents=

#############################################################################
##  server settings
#############################################################################

httpServerEnabled=false
httpServerPort=8081
httpServerClass=org.apache.bookkeeper.http.vertx.VertxHttpServer

############################################## Bookie Storage ##############################################


#############################################################################
## Journal settings
#############################################################################

journalDirectories=d:/tmp2/bk-txn

#############################################################################
## Ledger storage settings
#############################################################################

ledgerDirectories=d:/tmp2/bk-data
indexDirectories=d:/tmp2/bk-data

############################################## Metadata Services ##############################################


#############################################################################
## Metadata Service settings
#############################################################################

metadataServiceUri=zk+hierarchical://localhost:2181/ledgers

#############################################################################
## ZooKeeper Metadata Service settings
#############################################################################

zkServers=localhost:2181
zkTimeout=10000
zkEnableSecurity=false

##################################################################
##################################################################
# Settings below are used by stream/table service
##################################################################
##################################################################

### Grpc Server ###
storageserver.grpc.port=4182

### Dlog Settings for table service ###

#### Replication Settings
dlog.bkcEnsembleSize=3
dlog.bkcWriteQuorumSize=2
dlog.bkcAckQuorumSize=2

### Storage ###

# local storage directories for storing table ranges data (e.g. rocksdb sst files)
storage.range.store.dirs=d:/tmp2/bookkeeper/ranges

# whether the storage server capable of serving readonly tables. default is false.
storage.serve.readonly.tables=false

# the cluster controller schedule interval, in milliseconds. default is 30 seconds.
storage.cluster.controller.schedule.interval.ms=30000

Bookie3:

#############################################################################
## Server parameters
#############################################################################

bookiePort=3183
extraServerComponents=

#############################################################################
##  server settings
#############################################################################

httpServerEnabled=false
httpServerPort=8082
httpServerClass=org.apache.bookkeeper.http.vertx.VertxHttpServer

############################################## Bookie Storage ##############################################


#############################################################################
## Journal settings
#############################################################################

journalDirectories=d:/tmp3/bk-txn

#############################################################################
## Ledger storage settings
#############################################################################

ledgerDirectories=d:/tmp3/bk-data
indexDirectories=d:/tmp3/bk-data

############################################## Metadata Services ##############################################


#############################################################################
## Metadata Service settings
#############################################################################

metadataServiceUri=zk+hierarchical://localhost:2181/ledgers

#############################################################################
## ZooKeeper Metadata Service settings
#############################################################################

zkServers=localhost:2181
zkTimeout=10000
zkEnableSecurity=false

##################################################################
##################################################################
# Settings below are used by stream/table service
##################################################################
##################################################################

### Grpc Server ###
storageserver.grpc.port=4182

### Dlog Settings for table service ###

#### Replication Settings
dlog.bkcEnsembleSize=3
dlog.bkcWriteQuorumSize=2
dlog.bkcAckQuorumSize=2

### Storage ###

# local storage directories for storing table ranges data (e.g. rocksdb sst files)
storage.range.store.dirs=d:/tmp3/bookkeeper/ranges

# whether the storage server capable of serving readonly tables. default is false.
storage.serve.readonly.tables=false

# the cluster controller schedule interval, in milliseconds. default is 30 seconds.
storage.cluster.controller.schedule.interval.ms=30000

可以看到,這三個例項用的是同一個ZK,這樣他們就形成了叢集。
但是ZK中的原始元資料,需要手工初始化,這就用到了一個類:org.apache.bookkeeper.bookie.BookieShell
我們用任意一個配置檔案作為引數,即可完成初始化

我用的IDE是IDEA,這裡配置BookieShell執行初始化:

  • 主類選擇org.apache.bookkeeper.bookie.BookieShell
  • VM options填寫:-DentryFormatterClass=${ENTRY_FORMATTER_CLASS:-org.apache.bookkeeper.util.StringEntryFormatter}
  • Program aruguments填寫:--conf ./conf/bk_server_1.conf metaformat
    image

之後啟動,可以看到日誌:

2018-10-16 15:43:14,766 - INFO  - [main:[email protected]] - BookKeeper metadata driver manager initialized

然後,開始配置三個Bookie的啟動:

  • 主類選擇org.apache.bookkeeper.server.Main
  • Program aruguments填寫:--conf ./conf/bk_server_1.conf, 另外兩個分別填寫--conf ./conf/bk_server_2.conf--conf ./conf/bk_server_3.conf

image

編寫配置好後,啟動三個Bookie(為何啟動三個,預設配置情況下,一個ledger至少要寫到兩個Bokkie中,Bookies需要選舉出最合適的,這個選舉演算法至少需要三個Bookie):

2018-10-16 16:00:01,923 - INFO  - [main:[email protected]] - Using configuration file ./conf/bk_server_1.conf
2018-10-16 16:00:01,935 - INFO  - [main:[email protected]] - Hello, I'm your bookie, listening on port 3181. Metadata service uri is zk+hierarchical://localhost:2181/ledgers. Journals are in [d:/tmp1/bk-txn]. Ledgers are stored in d:/tmp1/bk-data.
2018-10-16 16:00:02,045 - INFO  - [main:[email protected]] - Load lifecycle component : org.apache.bookkeeper.server.service.StatsProviderService
2018-10-16 16:00:02,304 - INFO  - [main:[email protected]] - {
  "storage.cluster.controller.schedule.interval.ms" : "30000",
  "zkEnableSecurity" : "false",
  "dlog.bkcAckQuorumSize" : "2",
  "indexDirectories" : "d:/tmp1/bk-data",
  "zkServers" : "localhost:2181",
  "storage.range.store.dirs" : "d:/tmp1/bookkeeper/ranges",
  "httpServerPort" : "8080",
  "dlog.bkcWriteQuorumSize" : "2",
  "bookiePort" : "3181",
  "storage.serve.readonly.tables" : "false",
  "ledgerDirectories" : "d:/tmp1/bk-data",
  "zkTimeout" : "10000",
  "httpServerClass" : "org.apache.bookkeeper.http.vertx.VertxHttpServer",
  "httpServerEnabled" : "false",
  "metadataServiceUri" : "zk+hierarchical://localhost:2181/ledgers",
  "dlog.bkcEnsembleSize" : "3",
  "journalDirectories" : "d:/tmp1/bk-txn",
  "storageserver.grpc.port" : "4181",
  "extraServerComponents" : ""
}
2018-10-16 16:00:03,032 - INFO  - [main:[email protected]] - BookKeeper metadata driver manager initialized
2018-10-16 16:00:03,033 - INFO  - [main:[email protected]] - BookKeeper metadata driver manager initialized
2018-10-16 16:00:03,033 - INFO  - [main:[email protected]] - BookKeeper metadata driver manager initialized
2018-10-16 16:00:03,167 - INFO  - [main:[email protected]] - Stamping new cookies on all dirs [d:\tmp1\bk-txn\current] [d:\tmp1\bk-data\current, d:\tmp1\bk-data\current]
2018-10-16 16:00:03,368 - WARN  - [main:[email protected]] - Dirs: [d:\tmp1\bk-data\current, d:\tmp1\bk-data\current] are in same DiskPartition/FileSystem: (d:)
2018-10-16 16:00:03,373 - INFO  - [main:[email protected]] - instantiate ledger manager org.apache.bookkeeper.meta.HierarchicalLedgerManagerFactory
2018-10-16 16:00:03,415 - ERROR - [main:[email protected]] - Problems reading from d:\tmp1\bk-data\current\lastMark (this is okay if it is the first time starting this bookie
2018-10-16 16:00:03,420 - INFO  - [main:[email protected]] - Using ledger storage: org.apache.bookkeeper.bookie.SortedLedgerStorage
2018-10-16 16:00:03,500 - INFO  - [main:[email protected]] - openFileLimit = 20000
2018-10-16 16:00:03,539 - INFO  - [main:[email protected]] - maxDirectMemory = 259522560, pageSize = 8192, pageLimit = 10560
2018-10-16 16:00:03,594 - INFO  - [main:[email protected]] - Over Replicated Ledger Deletion : enabled=true, interval=86400000
2018-10-16 16:00:03,603 - INFO  - [main:[email protected]] - Minor Compaction : enabled=true, threshold=0.20000000298023224, interval=3600000
2018-10-16 16:00:03,603 - INFO  - [main:[email protected]] - Major Compaction : enabled=true, threshold=0.800000011920929, interval=86400000
2018-10-16 16:00:03,734 - INFO  - [main:[email protected]] - Load lifecycle component : org.apache.bookkeeper.server.service.BookieService
2018-10-16 16:00:03,748 - INFO  - [main:[email protected]] - Starting component bookie-server.
2018-10-16 16:00:03,753 - INFO  - [main:[email protected]] - Finished replaying journal in 3 ms.
2018-10-16 16:00:03,756 - INFO  - [SyncThread-7-1:[email protected]] - Flush ledger storage at checkpoint CheckpointList{checkpoints=[LogMark: logFileId - 0 , logFileOffset - 0]}.
2018-10-16 16:00:03,786 - INFO  - [main:[email protected]] - Finished reading journal, starting bookie
2018-10-16 16:00:03,787 - INFO  - [BookieJournal-3181:[email protected]] - Starting journal on d:\tmp1\bk-txn\current
2018-10-16 16:00:03,789 - INFO  - [ForceWriteThread:[email protected]] - ForceWrite Thread started
2018-10-16 16:00:03,828 - INFO  - [BookieJournal-3181:[email protected]] - Opening journal d:\tmp1\bk-txn\current\1667be392ce.txn
2018-10-16 16:00:04,078 - INFO  - [main:[email protected]] - Started component bookie-server.
2018-10-16 16:00:04,309 - INFO  - [BookieJournal-3181:[email protected]] - Unable to link C library. Native methods will be disabled.

之後我們簡單編寫個測試程式,來看下日誌寫入讀取效果:

public class TestClient {
    public static void main(String[] args) throws InterruptedException, BKException, IOException {
        BookKeeper bkc = new BookKeeper("localhost:2181");
        // A password for the new ledger
        byte[] ledgerPassword = "test".getBytes();

        // Create a new ledger and fetch its identifier
        LedgerHandle lh = bkc.createLedger(BookKeeper.DigestType.MAC, ledgerPassword);
        long ledgerId = lh.getId();

        // Create a buffer for four-byte entries
        ByteBuffer entry = ByteBuffer.allocate(4);

        int numberOfEntries = 10;

        // Add entries to the ledger, then close it
        for (int i = 0; i < numberOfEntries; i++) {
            entry.putInt(i);
            entry.position(0);
            lh.addEntry(entry.array());
        }
        lh.close();

        // Open the ledger for reading
        lh = bkc.openLedger(ledgerId, BookKeeper.DigestType.MAC, ledgerPassword);

        // Read all available entries
        Enumeration<LedgerEntry> entries = lh.readEntries(0, numberOfEntries - 1);

        while (entries.hasMoreElements()) {
            ByteBuffer result = ByteBuffer.wrap(entries.nextElement().getEntry());
            Integer retrEntry = result.getInt();

            // Print the integer stored in each entry
            System.out.println(String.format("Result: %s", retrEntry));
        }

        // Close the ledger and the client
        lh.close();
        bkc.close();
    }
}

執行,可以看到輸出:

Result: 0
Result: 1
Result: 2
Result: 3
Result: 4
Result: 5
Result: 6
Result: 7
Result: 8
Result: 9

BookKeeper基本概念

在BookKeeper中:

  • 每一塊日誌是一個entry
  • 日誌流被定義為ledgers
  • 每個獨立的儲存ledges的伺服器叫做bookies

Entries

Entries包含真正的資料,其中也包含一些元資料:
每個entry有如下的fields:

Field 型別 描述
Ledger number long 屬於的Ledger的ID標識
Entry number long 標識自身的全域性唯一ID
Last confirmed (LC) long 上一個entry的全域性唯一ID
Data byte[] 日誌資料
Authentication code byte[] 校驗碼

Ledgers

Ledgers是BookKeeper中的基本儲存單元
Ledgers是一組Entries,每個Entry有序的並且至多一次寫入到Ledgers中。一旦寫入Ledgers,將不能再修改。所以,寫入保持有序寫入是客戶端應用應該考慮的事情。

Bookies 和 Ensemble

Bookie是一個獨立的BookKeeper伺服器,處理Ledgers片段(因為每個Bookie儲存的是每個Ledgers的片段,不是完整的Ledgers)。

一個Ensemble是一個Bookies集合,他們共同儲存著一個Ledger的所有entries。通常一個Ensemble是整個Bookies叢集的子集。

BookKeeper API簡介

BookKeeper的客戶端主要負責建立刪除ledgers,並且從ledgers中讀取entries。

BookKeeper提供兩種API,Ledger API還有DistributedLog API;顧名思義,Ledger API提供了直接與Ledger互動的介面,DistributedLog API不直接與ledger互動而是與Bookeeper叢集互動。

BookKeeper 元資料儲存

BookKeeper需要第三方儲存用於儲存關於ledgers的資訊還有可用的Bookies(相當於分散式協調)。
目前BookKeeper利用ZooKeeper實現元資料儲存

相關推薦

BookKeeper1-BookKeeper簡介快速上手

什麼是BookKeeper BookKeeper是一個提供日誌條目流儲存持久化的服務框架。特別適合日誌流儲存,一個比較經典的應用是作為訊息佇列Pulsar的持久框架。 那麼BookKeeper是怎樣產生的呢? 這個靈感來源於Hadoop生態系統。我們知道,Had

Hibernate1Hibernate簡介簡單示例,瞭解Hibernate事務回滾用法

1 Hibernate簡介 Hibernate是一個orm(object relation mapping 物件關係對映)框架,處於專案的持久層,也叫持久層框架(持久層框架還有ojb等)。 Hibernate本質就是對JDBC進行了輕量級的封裝。 2

J2EE基礎教程1簡介windows下環境配置

(1)相關概念 我們以前在linux作業系統初級教程中,介紹過LAMP架構伺服器技術。現在,我們來介紹J2EE。 通過J2EE開發的應用程式屬於分散式多層應用程式,包括 (1)客戶層:客戶應用,web瀏覽器的動態網頁(含applet) (2)web層:

ArcGIS API for JavaScript 實戰與解析簡介快速上手

在這篇文章之前廢話幾句。 自從過完十一假期,每天都在奔波和加班中度過,直到今天才真正能夠休息。隱約記得去年是同樣的情形,但並不是相同的事由,希望明年十月對我好一點。 從二月到十月的八個月裡,我幾乎每天都堅持學習,從程式語言、軟體開發到機器學習、WebGIS,還有

淘寶JAVA中介軟體Diamond詳1-簡介&快速使用

感謝有奉獻精神的人 轉自:http://my.oschina.net/u/435621/blog/270483?p=1 淘寶JAVA中介軟體Diamond詳解(一)---簡介&快速使用 大家好,今天開始為大家帶來我們通用產品團隊的產品 —— diamon

ArcGIS Pro 簡明教程1Pro簡介

配置 動畫 name app 產品 版本 鼠標拖動 nal mage ArcGIS Pro 簡明教程(1)Pro簡介 轉載地址:http://www.cnblogs.com/lazygis/p/5870545.html ArcGIS Pro 簡明教程(1)Pro簡

MongoDB執行計劃分析詳1

mongo smu pre als comm 計劃 -- {} direct 正文 queryPlanner queryPlanner是現版本explain的默認模式,queryPlanner模式下並不會去真正進行query語句查詢,而是針對query語句進行執行計劃分析並

Java IO編程——傳統的BIO編程

sys .net 由於 啟動 code esp 溢出 無限循環 .html 前面講到:Java IO編程全解(一)——Java的I/O演進之路   網絡編程的基本模型是Client/Server模型,也就是兩個進程之間進行相互通信,其中服務端提供位置信息(綁定的IP地址和監

Java IO編程——4種I/O的對比與選型

log jdk 狀態 來源 回調 現在 概念 core avr   轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/7804185.html   前面講到:Java IO編程全解(五)——AIO編程   為了防止由於對一些技術概念和

跟開濤學SpringMVC4.1:Controller接口控制器詳1

詳解 shu fix gmv 控制器 input abstract pre pdf http://www.importnew.com/19397.html http://blog.csdn.net/u014607184/article/details/5207453

指標詳1-- 軌道線指標ENE

本質 平均值 width 簡單 公式 方向 重新 alt 改變 軌道線指標(ENE): 1、定義:軌道線(ENE)由上軌線(UPPER)和下軌線(LOWER)及中軌線(ENE)組成,軌道線的優勢在於其不僅具有趨勢軌道的研判分析作用,也可以敏銳的覺察股價運行過程中方向的改

JAVA線程池原理詳1

err 最大 RKE private queue 分享 ren ++ ant 線程池的優點 1、線程是稀缺資源,使用線程池可以減少創建和銷毀線程的次數,每個工作線程都可以重復使用。 2、可以根據系統的承受能力,調整線程池中工作線程的數量,防止因為消耗過多內存導致服務器崩潰。

1MFC簡介及MFC Object與Windows Object之間的比較

libraries 並且 bsp 應用 ets 銷毀 靈活 eight 公司 MFC(微軟基礎類庫)   微軟基礎類庫(Microsoft Foundation Classes,簡稱MFC)是微軟公司提供的一個類庫(class libraries),以C++類的形式封裝了W

Spring框架學習1Spring簡介

校驗和 遵從 直接 特定 cto 適合 配置 有意 允許 內容源自:Spring 框架簡介 Spring 是一個開源框架,是為了解決企業應用程序開發復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許您選擇使用哪一個組件,同時為 J2EE 應用程序開發提供集成的框

Spring Boot中使用MyBatis註解配置詳1

sql type .org 實體 sch 整合 PE 匯總 同傳 之前在Spring Boot中整合MyBatis時,采用了註解的配置方式,相信很多人還是比較喜歡這種優雅的方式的,也收到不少讀者朋友的反饋和問題,主要集中於針對各種場景下註解如何使用,下面就對幾種常見的情況舉

Spring Cloud Spring Boot mybatis分布式微服務雲架構屬性配置文件詳1

定義 public 配置數據庫連接 clas cep and xml配置 其他 PE 相信很多人選擇Spring Boot主要是考慮到它既能兼顧Spring的強大功能,還能實現快速開發的便捷。我們在Spring Boot使用過程中,最直觀的感受就是沒有了原來自己整合Spri

基於Tomcat的JSP 詳1—— 概述

normal pad san borde orm ace text pin style 們使用。 一.為什麽使用JSP 下面基於Tomcat的JSP 詳解(1)—— 概述

Java詳1--知識點總結1

大資料NP知識點總結1 ---------------------  作者:文動天下 來源:CSDN  連結:https://blog.csdn.net/li_yi_kun?t=1 版權宣告:本文為博主原創文章,轉載請附上博文連結! 目錄 上午

pg資料庫詳1--Mac安裝postgreSQL詳

Mac安裝postgreSQL詳解 ---------------------  作者:文動天下 來源:CSDN  連結:https://blog.csdn.net/li_yi_kun?t=1 版權宣告:本文為博主原創文章,轉載請附上博文連結! 建議用

PHP入門1PHP簡介及常用工具

簡介 PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文字前處理器”)是一種通用開源指令碼語言,主要適用於Web開發領域。 特性(不限於以下幾點) (1)易學。由於PHP 獨特的語法混合了 C、Java、Perl 以及 PHP 自創新的語法,