Return-Path: Delivered-To: apmail-zookeeper-commits-archive@www.apache.org Received: (qmail 26475 invoked from network); 28 Feb 2011 23:22:25 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 28 Feb 2011 23:22:25 -0000 Received: (qmail 16431 invoked by uid 500); 28 Feb 2011 23:22:25 -0000 Delivered-To: apmail-zookeeper-commits-archive@zookeeper.apache.org Received: (qmail 16405 invoked by uid 500); 28 Feb 2011 23:22:24 -0000 Mailing-List: contact commits-help@zookeeper.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ Delivered-To: mailing list commits@zookeeper.apache.org Received: (qmail 16397 invoked by uid 99); 28 Feb 2011 23:22:24 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 28 Feb 2011 23:22:24 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 28 Feb 2011 23:22:22 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 0DC1F2388A40; Mon, 28 Feb 2011 23:22:02 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: svn commit: r786254 [1/16] - in /websites/staging/zookeeper/trunk/content: ./ doc/r3.3.3/ doc/r3.3.3/images/ doc/r3.3.3/skin/ doc/r3.3.3/skin/images/ Date: Mon, 28 Feb 2011 23:22:00 -0000 To: commits@zookeeper.apache.org From: buildbot@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110228232202.0DC1F2388A40@eris.apache.org> Author: buildbot Date: Mon Feb 28 23:21:57 2011 New Revision: 786254 Log: Staging update by buildbot Added: websites/staging/zookeeper/trunk/content/doc/r3.3.3/ websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperConfig.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperConfig.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperOverview.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperOverview.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperProgrammer.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperProgrammer.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperStarted.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperStarted.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperStream.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperStream.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/broken-links.xml websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/ websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/2pc.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/bk-overview.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/built-with-forrest-button.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/favicon.ico (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/hadoop-logo.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/instruction_arrow.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/state_dia.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/zkcomponents.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/zknamespace.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/zkperfRW-3.2.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/zkperfRW.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/zkperfreliability.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/zkservice.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/images/zookeeper_small.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/index.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/index.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/javaExample.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/javaExample.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/linkmap.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/linkmap.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/recipes.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/recipes.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/releasenotes.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/releasenotes.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/ websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/CommonMessages_de.xml websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/CommonMessages_en_US.xml websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/CommonMessages_es.xml websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/CommonMessages_fr.xml websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/basic.css websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/breadcrumbs-optimized.js websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/breadcrumbs.js websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/fontsize.js websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/getBlank.js websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/getMenu.js websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/ websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/README.txt websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/add.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/built-with-forrest-button.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/chapter.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/chapter_open.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/current.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/error.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/external-link.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/fix.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/forrest-credit-logo.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/hack.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/header_white_line.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/info.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/instruction_arrow.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/label.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/page.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/pdfdoc.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/poddoc.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/printer.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/rc-b-l-15-1body-2menu-3menu.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/rc-b-r-15-1body-2menu-3menu.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/rc-b-r-5-1header-2tab-selected-3tab-selected.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/rc-t-l-5-1header-2searchbox-3searchbox.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/rc-t-l-5-1header-2tab-selected-3tab-selected.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/rc-t-l-5-1header-2tab-unselected-3tab-unselected.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/rc-t-r-15-1body-2menu-3menu.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/rc-t-r-5-1header-2searchbox-3searchbox.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/rc-t-r-5-1header-2tab-selected-3tab-selected.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/rc-t-r-5-1header-2tab-unselected-3tab-unselected.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/remove.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/rss.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/spacer.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/success.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/txtdoc.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/update.jpg (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/valid-html401.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/vcss.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/warning.png (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/images/xmldoc.gif (with props) websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/menu.js websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/note.txt websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/print.css websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/profile.css websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/prototype.js websites/staging/zookeeper/trunk/content/doc/r3.3.3/skin/screen.css websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperAdmin.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperAdmin.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperHierarchicalQuorums.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperHierarchicalQuorums.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperInternals.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperInternals.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperJMX.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperJMX.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperObservers.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperObservers.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperOtherInfo.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperOtherInfo.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperOver.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperOver.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperProgrammers.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperProgrammers.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperQuotas.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperQuotas.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperStarted.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperStarted.pdf websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperTutorial.html websites/staging/zookeeper/trunk/content/doc/r3.3.3/zookeeperTutorial.pdf Modified: websites/staging/zookeeper/trunk/content/bylaws.html websites/staging/zookeeper/trunk/content/credits.html websites/staging/zookeeper/trunk/content/index.html websites/staging/zookeeper/trunk/content/irc.html websites/staging/zookeeper/trunk/content/lists.html websites/staging/zookeeper/trunk/content/privacy.html websites/staging/zookeeper/trunk/content/releases.html websites/staging/zookeeper/trunk/content/svn.html Modified: websites/staging/zookeeper/trunk/content/bylaws.html ============================================================================== --- websites/staging/zookeeper/trunk/content/bylaws.html (original) +++ websites/staging/zookeeper/trunk/content/bylaws.html Mon Feb 28 23:21:57 2011 @@ -296,13 +296,10 @@ actions will also be referred to the Documentation Modified: websites/staging/zookeeper/trunk/content/credits.html ============================================================================== --- websites/staging/zookeeper/trunk/content/credits.html (original) +++ websites/staging/zookeeper/trunk/content/credits.html Mon Feb 28 23:21:57 2011 @@ -101,13 +101,10 @@

Documentation

Added: websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperConfig.html ============================================================================== --- websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperConfig.html (added) +++ websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperConfig.html Mon Feb 28 23:21:57 2011 @@ -0,0 +1,372 @@ + + + + + + + +BookKeeper Administrator's Guide + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + +
+
+
+
+ +
+ + +
+ +
+ +   +
+ + + + + +
+ +

BookKeeper Administrator's Guide

+

Setup Guide

+ + + + + + + + + +

Deployment

+
+

This section contains information about deploying BookKeeper and + covers these topics:

+ +

The first section tells you how many machines you need. The second explains how to bootstrap bookies + (BookKeeper storage servers). The third section explains how we use ZooKeeper and our requirements with + respect to ZooKeeper. +

+ +

System requirements

+

A typical BookKeeper installation comprises a set of bookies and a set of ZooKeeper replicas. The exact number of bookies + depends on the quorum mode, desired throughput, and number of clients using this installation simultaneously. The minimum number of + bookies is three for self-verifying (stores a message authentication code along with each entry) and four for generic (does not + store a message authentication codewith each entry), and there is no upper limit on the number of bookies. Increasing the number of + bookies, in fact, enables higher throughput. +

+

For performance, we require each server to have at least two disks. It is possible to run a bookie with a single disk, but + performance will be significantly lower in this case. Of course, it works with one disk, but performance is significantly lower. +

+

For ZooKeeper, there is no constraint with respect to the number of replicas. Having a single machine running ZooKeeper + in standalone mode is sufficient for BookKeeper. For resilience purposes, it might be a good idea to run ZooKeeper in quorum + mode with multiple servers. Please refer to the ZooKeeper documentation for detail on how to configure ZooKeeper with multiple + replicas +

+ +

Running bookies

+

+ To run a bookie, we execute the following command: +

+

+ + java -cp .:./zookeeper-<version>-bookkeeper.jar:./zookeeper-<version>.jar:../log4j/apache-log4j-1.2.15/log4j-1.2.15.jar\ + -Dlog4j.configuration=log4j.properties org.apache.bookkeeper.proto.BookieServer 3181 /path_to_log_device/\ + /path_to_ledger_device/ + +

+

+ The parameters are: +

+
    + +
  • + +

    + Port number that the bookie listens on; +

    + +
  • + + +
  • + +

    + Path for Log Device (stores bookie write-ahead log); +

    + +
  • + + +
  • + +

    + Path for Ledger Device (stores ledger entries); +

    + +
  • + +
+

+ Ideally, /path_to_log_device/ and /path_to_ledger_device/ are each + in a different device. +

+ +

ZooKeeper Metadata

+

+ For BookKeeper, we require a ZooKeeper installation to store metadata, and to pass the list + of ZooKeeper servers as parameter to the constructor of the BookKeeper class ( + org.apache.bookkeeper.client,BookKeeper). + To setup ZooKeeper, please check the + ZooKeeper documentation. +

+
+ +

+ +

+
+ +
 
+
+ + + Added: websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperConfig.pdf ============================================================================== --- websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperConfig.pdf (added) +++ websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperConfig.pdf Mon Feb 28 23:21:57 2011 @@ -0,0 +1,322 @@ +%PDF-1.3 +%ª«¬­ +4 0 obj +<< /Type /Info +/Producer (FOP 0.20.5) >> +endobj +5 0 obj +<< /Length 560 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gaua;9lldX&;KZO$JfG=\rd,Yi)mH[As19025`>m@!h8p22DOcN;n;P81^:QkJ_uS8D:7[(Z&:9SXdZP-U:8;Ni7FY,>'j+,LkP.A:@<$'OmJn]HVhP1Tg[`+uX,3j==<24.gn)_\aS;IA`GTUr#YUaFk6`VIK6^cS[cl0HIl,R=n@mD[`S.ctG_.Vq(lqP^"4A%G6js+LfUP/\n,3d@IpfV5]?96'P!1CDdcIu;=-pZIRIF:OrFD'j!8BlYX4TN=ETf+6[2,giCP-h:Bs8NPICr&E$=_[u-h!dq'!adIhkhGVr9ERYX>^0,iVoYdO%LD-1\m/Q-Rkto*kr.JG5/1^OGj5=$>m$tCiSNMZ\OUs:&C(31lq'Nc0No2;$G+-hcEC#$Y#4!US#rXCF.lILI0-H?][l,"CtDlbi,URqn$`hVVKt\+DBA3Yd!,OVI>bIi^d";@Q@c@p"J7=B!cWV]@sZse2<3?[bJ%MF-#D7@#O.hXrsD;#Fm/2O8~> +endstream +endobj +6 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 5 0 R +/Annots 7 0 R +>> +endobj +7 0 obj +[ +8 0 R +10 0 R +12 0 R +14 0 R +] +endobj +8 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 102.0 511.541 169.328 499.541 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 9 0 R +/H /I +>> +endobj +10 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.0 493.341 224.492 481.341 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 11 0 R +/H /I +>> +endobj +12 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.0 475.141 205.172 463.141 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 13 0 R +/H /I +>> +endobj +14 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.0 456.941 225.128 444.941 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 15 0 R +/H /I +>> +endobj +16 0 obj +<< /Length 2171 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +GatU4gQ(#H&:O:SkcMJ4R[0n!cka^29mT+Q1qQPcMa4^!Ru&[G'"&\QlTPJ__X[95;$!?6HenTD*;J=gY+5!bD(M,(#(DYGV4!k^j8+FJ)<6HelksYc/8H?b$5nsXH9pB5M"kuMk;%,+(;A,s*E)[FZg?@J`X:$QG2aLcjm.7=e!C&MgK$g[iF+)eu_i*G[Y7WER3smCsBDOMdi.-MF&Z&5YH?aM<^2dbE@iuj>9P7ms21-VXB05n/Gj`X3e!n`Km)tL$ZlDWu2h5P&KY&4W:A&c:ho%6KE?aXXWotHJL@Bm;$LrfMTE9%]oioa!IlIN-!0s1ICE\H8l/85G["9UZ(/cO3ertLLVph@Eu;n9Gn?n)*d""B\OtFr;+uS'cL)e1*;3*UDLh8I>mG0W'CT[DK*Y^[^',"'_dJl,6=doSe9h+[&Ao5?gXcla&%mfAS0-\R#>cAtV:"W1UT`^takP^@9[Z/']BVrUP4AUSs;B54?]B9?egK?4r,(\?.!Z)!j6M@D&Fk,%/9$t\\a%PGieU`(QQ;pgXRmoFK'5O?if2>Si:@kSc_S!URF'e9[Q!T"41Vl2KUDg!(L<,lme1AO8@i5jfqF)41d3=p(]V[sB1I4rP0A3j*C68>!478oWO>RM?$EYMs^]@J8:aF6?hI7d]97pj='0rNhp1PhHdrZ`8P'\D8h[e9C`%B6fE+I<HPYb61Y8\mJdb\VMn^I93J#U$_V8H.%qr5W/]MlDql(6N<(maBrUn)L>f8,H0fpWbNj1D2"CqbP?&2$q[;1[#T)QqDc='RuJL^A"V+`?;_JLj1stF+C$t7^AHSAg.J:e:N9R([,ZrIIW9@DE>$i_SOLkacg`nYhLCggX;<0#G.7\Y_0S2X+.tU2S7.N'oRWJ2_6Y3GcuYju!M5'c$QL(/pHd.>Xt361ao3T#]V#gMUoqE^@dC/F_&I=]%6;r=!4e@),de3>q)_94a/e+c4>ni<\rbU_(+ku3NaBNs)_FbA7gNQ/'MmZ^Dtr +endstream +endobj +17 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 16 0 R +/Annots 18 0 R +>> +endobj +18 0 obj +[ +19 0 R +20 0 R +21 0 R +] +endobj +19 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.0 612.466 208.992 600.466 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 11 0 R +/H /I +>> +endobj +20 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.0 595.266 189.672 583.266 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 13 0 R +/H /I +>> +endobj +21 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 108.0 578.066 209.628 566.066 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A 15 0 R +/H /I +>> +endobj +22 0 obj +<< /Length 1086 /Filter [ /ASCII85Decode /FlateDecode ] + >> +stream +Gat%"gMZ%0&:O:Sn?!1^AOoE-V=nWP2F27Hg\'$uMh&'G=bnVT.=-XFqi5gZaLCNQYb@1:B?o:mGe]XE\sRo;EDjUHEL&?%8T!?k)_2"6";[SttQn5],dsSDT2\<3IRI@N3>N:]Y_EI;1O#Q,aZM5G:q1q(#N+/6P4lT?F3BG4p#L:cK6dg5;n@*O("K_@PBB+U22qhaLnU7k>V*oK,2Vur>]WH[0P<2iFI33[);DE4DIM:_C/L(1l/Vggutd7H98FY:>(Pa7O"H#h9-Z>WM>#0FenErmP6jhI*`mAjW-#<\f:8PH7[S?Q:,0/W5*5fS/Tk`g,C.2:#]f]N5KS@t%bOsRKW-<4G.++0?+s7l'o-5JL'c.l!V\'@D+0GLZQlYVY?cMD:qgm+n<(S73MU`hM^bNNqj2]a;?qpM2GHQ0-BW=J(!:Dnk)#NhQB:,ci,-Mhl3X)i-:Z\7lmF1]0/]eSru<3R;]],1,2e0\^,(96QeIVcfY?m6h'GdD6,6'ii)37[a`'?"JWK:b6$\2H'fj?m,-U&p[i<#i.nELL&I!/>F)aD9;4p9iGs1dKKKOhtE!"-H]e2X1PXeeC3Oc'f(0]HG>tZ+Y<<>4%$HaYc9&l+d;BTWA9'@=fNi5i4;i)Xgp\D8!@I]kB8cPKPr:d]So:u!oSVD+g`rt'g(o'D='Poo\(dH1jMeT2siLO/>8Z2ok_HD@fUT%(p6ri/ CdO^M+N?PL>#X@)"='$0, +endstream +endobj +23 0 obj +<< /Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 612 792 ] +/Resources 3 0 R +/Contents 22 0 R +/Annots 24 0 R +>> +endobj +24 0 obj +[ +25 0 R +] +endobj +25 0 obj +<< /Type /Annot +/Subtype /Link +/Rect [ 138.648 477.947 266.952 465.947 ] +/C [ 0 0 0 ] +/Border [ 0 0 0 ] +/A << /URI (index.html) +/S /URI >> +/H /I +>> +endobj +27 0 obj +<< + /Title (\376\377\0\61\0\40\0\104\0\145\0\160\0\154\0\157\0\171\0\155\0\145\0\156\0\164) + /Parent 26 0 R + /First 28 0 R + /Last 30 0 R + /Count -3 + /A 9 0 R +>> endobj +28 0 obj +<< + /Title (\376\377\0\61\0\56\0\61\0\40\0\123\0\171\0\163\0\164\0\145\0\155\0\40\0\162\0\145\0\161\0\165\0\151\0\162\0\145\0\155\0\145\0\156\0\164\0\163) + /Parent 27 0 R + /Next 29 0 R + /A 11 0 R +>> endobj +29 0 obj +<< + /Title (\376\377\0\61\0\56\0\62\0\40\0\122\0\165\0\156\0\156\0\151\0\156\0\147\0\40\0\142\0\157\0\157\0\153\0\151\0\145\0\163) + /Parent 27 0 R + /Prev 28 0 R + /Next 30 0 R + /A 13 0 R +>> endobj +30 0 obj +<< + /Title (\376\377\0\61\0\56\0\63\0\40\0\132\0\157\0\157\0\113\0\145\0\145\0\160\0\145\0\162\0\40\0\115\0\145\0\164\0\141\0\144\0\141\0\164\0\141) + /Parent 27 0 R + /Prev 29 0 R + /A 15 0 R +>> endobj +31 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F1 +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding >> +endobj +32 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F5 +/BaseFont /Times-Roman +/Encoding /WinAnsiEncoding >> +endobj +33 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F3 +/BaseFont /Helvetica-Bold +/Encoding /WinAnsiEncoding >> +endobj +34 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F2 +/BaseFont /Helvetica-Oblique +/Encoding /WinAnsiEncoding >> +endobj +35 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F9 +/BaseFont /Courier +/Encoding /WinAnsiEncoding >> +endobj +36 0 obj +<< /Type /Font +/Subtype /Type1 +/Name /F7 +/BaseFont /Times-Bold +/Encoding /WinAnsiEncoding >> +endobj +1 0 obj +<< /Type /Pages +/Count 3 +/Kids [6 0 R 17 0 R 23 0 R ] >> +endobj +2 0 obj +<< /Type /Catalog +/Pages 1 0 R + /Outlines 26 0 R + /PageMode /UseOutlines + >> +endobj +3 0 obj +<< +/Font << /F1 31 0 R /F5 32 0 R /F3 33 0 R /F2 34 0 R /F9 35 0 R /F7 36 0 R >> +/ProcSet [ /PDF /ImageC /Text ] >> +endobj +9 0 obj +<< +/S /GoTo +/D [17 0 R /XYZ 85.0 659.0 null] +>> +endobj +11 0 obj +<< +/S /GoTo +/D [17 0 R /XYZ 85.0 501.466 null] +>> +endobj +13 0 obj +<< +/S /GoTo +/D [17 0 R /XYZ 85.0 249.413 null] +>> +endobj +15 0 obj +<< +/S /GoTo +/D [23 0 R /XYZ 85.0 545.8 null] +>> +endobj +26 0 obj +<< + /First 27 0 R + /Last 27 0 R +>> endobj +xref +0 37 +0000000000 65535 f +0000007234 00000 n +0000007306 00000 n +0000007398 00000 n +0000000015 00000 n +0000000071 00000 n +0000000722 00000 n +0000000842 00000 n +0000000888 00000 n +0000007532 00000 n +0000001023 00000 n +0000007595 00000 n +0000001160 00000 n +0000007661 00000 n +0000001297 00000 n +0000007727 00000 n +0000001434 00000 n +0000003698 00000 n +0000003821 00000 n +0000003862 00000 n +0000003999 00000 n +0000004136 00000 n +0000004273 00000 n +0000005452 00000 n +0000005575 00000 n +0000005602 00000 n +0000007791 00000 n +0000005766 00000 n +0000005943 00000 n +0000006158 00000 n +0000006363 00000 n +0000006572 00000 n +0000006680 00000 n +0000006790 00000 n +0000006903 00000 n +0000007019 00000 n +0000007125 00000 n +trailer +<< +/Size 37 +/Root 2 0 R +/Info 4 0 R +>> +startxref +7842 +%%EOF Added: websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperOverview.html ============================================================================== --- websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperOverview.html (added) +++ websites/staging/zookeeper/trunk/content/doc/r3.3.3/bookkeeperOverview.html Mon Feb 28 23:21:57 2011 @@ -0,0 +1,692 @@ + + + + + + + +BookKeeper overview + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + +
+
+
+
+ +
+ + +
+ +
+ +   +
+ + + + + +
+ +

BookKeeper overview

+ + + + + + +

BookKeeper overview

+
+ +

BookKeeper introduction

+

+ BookKeeper is a replicated service to reliably log streams of records. In BookKeeper, + servers are "bookies", log streams are "ledgers", and each unit of a log (aka record) is a + "ledger entry". BookKeeper is designed to be reliable; bookies, the servers that store + ledgers, can crash, corrupt data, discard data, but as long as there are enough bookies + behaving correctly the service as a whole behaves correctly. +

+

+ The initial motivation for BookKeeper comes from the namenode of HDFS. Namenodes have to + log operations in a reliable fashion so that recovery is possible in the case of crashes. + We have found the applications for BookKeeper extend far beyond HDFS, however. Essentially, + any application that requires an append storage can replace their implementations with + BookKeeper. BookKeeper has the advantage of scaling throughput with the number of servers. +

+

+ At a high level, a bookkeeper client receives entries from a client application and stores it to + sets of bookies, and there are a few advantages in having such a service: +

+
    + +
  • + +

    + We can use hardware that is optimized for such a service. We currently believe that such a + system has to be optimized only for disk I/O; +

    + +
  • + + +
  • + +

    + We can have a pool of servers implementing such a log system, and shared among a number of servers; +

    + +
  • + + +
  • + +

    + We can have a higher degree of replication with such a pool, which makes sense if the hardware necessary for it is cheaper compared to the one the application uses. +

    + +
  • + +
+ +

In slightly more detail...

+

BookKeeper implements highly available logs, and it has been designed with write-ahead logging in mind. Besides high availability + due to the replicated nature of the service, it provides high throughput due to striping. As we write entries in a subset of bookies of an + ensemble and rotate writes across available quorums, we are able to increase throughput with the number of servers for both reads and writes. + Scalability is a property that is possible to achieve in this case due to the use of quorums. Other replication techniques, such as + state-machine replication, do not enable such a property. +

+

An application first creates a ledger before writing to bookies through a local BookKeeper client instance. + Upon creating a ledger, a BookKeeper client writes metadata about the ledger to ZooKeeper. Each ledger currently + has a single writer. This writer has to execute a close ledger operation before any other client can read from it. + If the writer of a ledger does not close a ledger properly because, for example, it has crashed before having the + opportunity of closing the ledger, then the next client that tries to open a ledger executes a procedure to recover + it. As closing a ledger consists essentially of writing the last entry written to a ledger to ZooKeeper, the recovery + procedure simply finds the last entry written correctly and writes it to ZooKeeper. +

+

+ Note that currently this recovery procedure is executed automatically upon trying to open a ledger and no explicit action is necessary. + Although two clients may try to recover a ledger concurrently, only one will succeed, the first one that is able to create the close znode + for the ledger. +

+ +

Bookkeeper elements and concepts

+

+ BookKeeper uses four basic elements: +

+
    + +
  • + +

    + +Ledger: A ledger is a sequence of entries, and each entry is a sequence of bytes. Entries are + written sequentially to a ledger and at most once. Consequently, ledgers have an append-only semantics; +

    + +
  • + + +
  • + +

    + +BookKeeper client: A client runs along with a BookKeeper application, and it enables applications + to execute operations on ledgers, such as creating a ledger and writing to it; +

    + +
  • + + +
  • + +

    + +Bookie: A bookie is a BookKeeper storage server. Bookies store the content of ledgers. For any given + ledger L, we call an ensemble the group of bookies storing the content of L. For performance, we store on + each bookie of an ensemble only a fragment of a ledger. That is, we stripe when writing entries to a ledger such that + each entry is written to sub-group of bookies of the ensemble. +

    + +
  • + + +
  • + +

    + +Metadata storage service: BookKeeper requires a metadata storage service to store information related + to ledgers and available bookies. We currently use ZooKeeper for such a task. +

    + +
  • + +
+ +

Bookkeeper initial design

+

+ A set of bookies implements BookKeeper, and we use a quorum-based protocol to replicate data across the bookies. + There are basically two operations to an existing ledger: read and append. Here is the complete API list + (mode detail + here): +

+
    + +
  • + +

    + Create ledger: creates a new empty ledger; +

    + +
  • + + +
  • + +

    + Open ledger: opens an existing ledger for reading; +

    + +
  • + + +
  • + +

    + Add entry: adds a record to a ledger either synchronously or asynchronously; +

    + +
  • + + +
  • + +

    + Read entries: reads a sequence of entries from a ledger either synchronously or asynchronously +

    + +
  • + +
+

+ There is only a single client that can write to a ledger. Once that ledger is closed or the client fails, + no more entries can be added. (We take advantage of this behavior to provide our strong guarantees.) + There will not be gaps in the ledger. Fingers get broken, people get roughed up or end up in prison when + books are manipulated, so there is no deleting or changing of entries. +

+ + + + + + + +
BookKeeper Overview
+ + + +
+

+ A simple use of BooKeeper is to implement a write-ahead transaction log. A server maintains an in-memory data structure + (with periodic snapshots for example) and logs changes to that structure before it applies the change. The application + server creates a ledger at startup and store the ledger id and password in a well known place (ZooKeeper maybe). When + it needs to make a change, the server adds an entry with the change information to a ledger and apply the change when + BookKeeper adds the entry successfully. The server can even use asyncAddEntry to queue up many changes for high change + throughput. BooKeeper meticulously logs the changes in order and call the completion functions in order. +

+

+ When the application server dies, a backup server will come online, get the last snapshot and then it will open the + ledger of the old server and read all the entries from the time the snapshot was taken. (Since it doesn't know the + last entry number it will use MAX_INTEGER). Once all the entries have been processed, it will close the ledger and + start a new one for its use. +

+

+ A client library takes care of communicating with bookies and managing entry numbers. An entry has the following fields: +

+ + +Entry fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Entry fields
FieldTypeDescription
Ledger numberlongThe id of the ledger of this entry
Entry numberlongThe id of this entry
last confirmed (LC)longid of the last recorded entry
databyte[]the entry data (supplied by application)
authentication codebyte[]Message authentication code that includes all other fields of the entry
+

+ The client library generates a ledger entry. None of the fields are modified by the bookies and only the first three + fields are interpreted by the bookies. +

+

+ To add to a ledger, the client generates the entry above using the ledger number. The entry number will be one more + than the last entry generated. The LC field contains the last entry that has been successfully recorded by BookKeeper. + If the client writes entries one at a time, LC is the last entry id. But, if the client is using asyncAddEntry, there + may be many entries in flight. An entry is considered recorded when both of the following conditions are met: +

+
    + +
  • + +

    + the entry has been accepted by a quorum of bookies +

    + +
  • + + +
  • + +

    + all entries with a lower entry id have been accepted by a quorum of bookies +

    + +
  • + +
+

+ +LC seems mysterious right now, but it is too early to explain how we use it; just smile and move on. +

+

+ Once all the other fields have been field in, the client generates an authentication code with all of the previous fields. + The entry is then sent to a quorum of bookies to be recorded. Any failures will result in the entry being sent to a new + quorum of bookies. +

+

+ To read, the client library initially contacts a bookie and starts requesting entries. If an entry is missing or + invalid (a bad MAC for example), the client will make a request to a different bookie. By using quorum writes, + as long as enough bookies are up we are guaranteed to eventually be able to read an entry. +

+ +

Bookkeeper metadata management

+

+ There are some meta data that needs to be made available to BookKeeper clients: +

+
    + +
  • + +

    + The available bookies; +

    + +
  • + + +
  • + +

    + The list of ledgers; +

    + +
  • + + +
  • + +

    + The list of bookies that have been used for a given ledger; +

    + +
  • + + +
  • + +

    + The last entry of a ledger; +

    + +
  • + +
+

+ We maintain this information in ZooKeeper. Bookies use ephemeral nodes to indicate their availability. Clients + use znodes to track ledger creation and deletion and also to know the end of the ledger and the bookies that + were used to store the ledger. Bookies also watch the ledger list so that they can cleanup ledgers that get deleted. +

+ +

Closing out ledgers

+

+ The process of closing out the ledger and finding the last ledger is difficult due to the durability guarantees of BookKeeper: +

+
    + +
  • + +

    + If an entry has been successfully recorded, it must be readable. +

    + +
  • + + +
  • + +

    + If an entry is read once, it must always be available to be read. +

    + +
  • + +
+

+ If the ledger was closed gracefully, ZooKeeper will have the last entry and everything will work well. But, if the + BookKeeper client that was writing the ledger dies, there is some recovery that needs to take place. +

+

+ The problematic entries are the ones at the end of the ledger. There can be entries in flight when a BookKeeper client + dies. If the entry only gets to one bookie, the entry should not be readable since the entry will disappear if that bookie + fails. If the entry is only on one bookie, that doesn't mean that the entry has not been recorded successfully; the other + bookies that recorded the entry might have failed. +

+

+ The trick to making everything work is to have a correct idea of a last entry. We do it in roughly three steps: +

+
    + +
  1. + +

    + Find the entry with the highest last recorded entry, LC; +

    + +
  2. + + +
  3. + +

    + Find the highest consecutively recorded entry, LR; +

    + +
  4. + + +
  5. + +

    + Make sure that all entries between LC and LR are on a quorum of bookies; +

    + +
  6. + + +
+
+ +

+ +

+
+ +
 
+
+ + +