zookeeperObservers.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <meta content="Apache Forrest" name="Generator">
  6. <meta name="Forrest-version" content="0.8">
  7. <meta name="Forrest-skin-name" content="pelt">
  8. <title>ZooKeeper Observers</title>
  9. <link type="text/css" href="skin/basic.css" rel="stylesheet">
  10. <link media="screen" type="text/css" href="skin/screen.css" rel="stylesheet">
  11. <link media="print" type="text/css" href="skin/print.css" rel="stylesheet">
  12. <link type="text/css" href="skin/profile.css" rel="stylesheet">
  13. <script src="skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="skin/fontsize.js" language="javascript" type="text/javascript"></script>
  14. <link rel="shortcut icon" href="images/favicon.ico">
  15. </head>
  16. <body onload="init()">
  17. <script type="text/javascript">ndeSetTextSize();</script>
  18. <div id="top">
  19. <!--+
  20. |breadtrail
  21. +-->
  22. <div class="breadtrail">
  23. <a href="http://www.apache.org/">Apache</a> &gt; <a href="http://hadoop.apache.org/">Hadoop</a> &gt; <a href="http://hadoop.apache.org/zookeeper/">ZooKeeper</a><script src="skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
  24. </div>
  25. <!--+
  26. |header
  27. +-->
  28. <div class="header">
  29. <!--+
  30. |start group logo
  31. +-->
  32. <div class="grouplogo">
  33. <a href="http://hadoop.apache.org/"><img class="logoImage" alt="Hadoop" src="images/hadoop-logo.jpg" title="Apache Hadoop"></a>
  34. </div>
  35. <!--+
  36. |end group logo
  37. +-->
  38. <!--+
  39. |start Project Logo
  40. +-->
  41. <div class="projectlogo">
  42. <a href="http://hadoop.apache.org/zookeeper/"><img class="logoImage" alt="ZooKeeper" src="images/zookeeper_small.gif" title="ZooKeeper: distributed coordination"></a>
  43. </div>
  44. <!--+
  45. |end Project Logo
  46. +-->
  47. <!--+
  48. |start Search
  49. +-->
  50. <div class="searchbox">
  51. <form action="http://www.google.com/search" method="get" class="roundtopsmall">
  52. <input value="hadoop.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp;
  53. <input name="Search" value="Search" type="submit">
  54. </form>
  55. </div>
  56. <!--+
  57. |end search
  58. +-->
  59. <!--+
  60. |start Tabs
  61. +-->
  62. <ul id="tabs">
  63. <li>
  64. <a class="unselected" href="http://hadoop.apache.org/zookeeper/">Project</a>
  65. </li>
  66. <li>
  67. <a class="unselected" href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
  68. </li>
  69. <li class="current">
  70. <a class="selected" href="index.html">ZooKeeper 3.4 Documentation</a>
  71. </li>
  72. </ul>
  73. <!--+
  74. |end Tabs
  75. +-->
  76. </div>
  77. </div>
  78. <div id="main">
  79. <div id="publishedStrip">
  80. <!--+
  81. |start Subtabs
  82. +-->
  83. <div id="level2tabs"></div>
  84. <!--+
  85. |end Endtabs
  86. +-->
  87. <script type="text/javascript"><!--
  88. document.write("Last Published: " + document.lastModified);
  89. // --></script>
  90. </div>
  91. <!--+
  92. |breadtrail
  93. +-->
  94. <div class="breadtrail">
  95. &nbsp;
  96. </div>
  97. <!--+
  98. |start Menu, mainarea
  99. +-->
  100. <!--+
  101. |start Menu
  102. +-->
  103. <div id="menu">
  104. <div onclick="SwitchMenu('menu_1.1', 'skin/')" id="menu_1.1Title" class="menutitle">Overview</div>
  105. <div id="menu_1.1" class="menuitemgroup">
  106. <div class="menuitem">
  107. <a href="index.html">Welcome</a>
  108. </div>
  109. <div class="menuitem">
  110. <a href="zookeeperOver.html">Overview</a>
  111. </div>
  112. <div class="menuitem">
  113. <a href="zookeeperStarted.html">Getting Started</a>
  114. </div>
  115. <div class="menuitem">
  116. <a href="releasenotes.html">Release Notes</a>
  117. </div>
  118. </div>
  119. <div onclick="SwitchMenu('menu_1.2', 'skin/')" id="menu_1.2Title" class="menutitle">Developer</div>
  120. <div id="menu_1.2" class="menuitemgroup">
  121. <div class="menuitem">
  122. <a href="api/index.html">API Docs</a>
  123. </div>
  124. <div class="menuitem">
  125. <a href="zookeeperProgrammers.html">Programmer's Guide</a>
  126. </div>
  127. <div class="menuitem">
  128. <a href="javaExample.html">Java Example</a>
  129. </div>
  130. <div class="menuitem">
  131. <a href="zookeeperTutorial.html">Barrier and Queue Tutorial</a>
  132. </div>
  133. <div class="menuitem">
  134. <a href="recipes.html">Recipes</a>
  135. </div>
  136. </div>
  137. <div onclick="SwitchMenu('menu_1.3', 'skin/')" id="menu_1.3Title" class="menutitle">BookKeeper</div>
  138. <div id="menu_1.3" class="menuitemgroup">
  139. <div class="menuitem">
  140. <a href="bookkeeperStarted.html">Getting started</a>
  141. </div>
  142. <div class="menuitem">
  143. <a href="bookkeeperOverview.html">Overview</a>
  144. </div>
  145. <div class="menuitem">
  146. <a href="bookkeeperConfig.html">Setup guide</a>
  147. </div>
  148. <div class="menuitem">
  149. <a href="bookkeeperProgrammer.html">Programmer's guide</a>
  150. </div>
  151. </div>
  152. <div onclick="SwitchMenu('menu_selected_1.4', 'skin/')" id="menu_selected_1.4Title" class="menutitle" style="background-image: url('skin/images/chapter_open.gif');">Admin &amp; Ops</div>
  153. <div id="menu_selected_1.4" class="selectedmenuitemgroup" style="display: block;">
  154. <div class="menuitem">
  155. <a href="zookeeperAdmin.html">Administrator's Guide</a>
  156. </div>
  157. <div class="menuitem">
  158. <a href="zookeeperQuotas.html">Quota Guide</a>
  159. </div>
  160. <div class="menuitem">
  161. <a href="zookeeperJMX.html">JMX</a>
  162. </div>
  163. <div class="menupage">
  164. <div class="menupagetitle">Observers Guide</div>
  165. </div>
  166. </div>
  167. <div onclick="SwitchMenu('menu_1.5', 'skin/')" id="menu_1.5Title" class="menutitle">Contributor</div>
  168. <div id="menu_1.5" class="menuitemgroup">
  169. <div class="menuitem">
  170. <a href="zookeeperInternals.html">ZooKeeper Internals</a>
  171. </div>
  172. </div>
  173. <div onclick="SwitchMenu('menu_1.6', 'skin/')" id="menu_1.6Title" class="menutitle">Miscellaneous</div>
  174. <div id="menu_1.6" class="menuitemgroup">
  175. <div class="menuitem">
  176. <a href="http://wiki.apache.org/hadoop/ZooKeeper">Wiki</a>
  177. </div>
  178. <div class="menuitem">
  179. <a href="http://wiki.apache.org/hadoop/ZooKeeper/FAQ">FAQ</a>
  180. </div>
  181. <div class="menuitem">
  182. <a href="http://hadoop.apache.org/zookeeper/mailing_lists.html">Mailing Lists</a>
  183. </div>
  184. </div>
  185. <div id="credit"></div>
  186. <div id="roundbottom">
  187. <img style="display: none" class="corner" height="15" width="15" alt="" src="skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
  188. <!--+
  189. |alternative credits
  190. +-->
  191. <div id="credit2"></div>
  192. </div>
  193. <!--+
  194. |end Menu
  195. +-->
  196. <!--+
  197. |start content
  198. +-->
  199. <div id="content">
  200. <div title="Portable Document Format" class="pdflink">
  201. <a class="dida" href="zookeeperObservers.pdf"><img alt="PDF -icon" src="skin/images/pdfdoc.gif" class="skin"><br>
  202. PDF</a>
  203. </div>
  204. <h1>ZooKeeper Observers</h1>
  205. <div id="minitoc-area">
  206. <ul class="minitoc">
  207. <li>
  208. <a href="#ch_Introduction">Observers: Scaling ZooKeeper Without Hurting Write Performance
  209. </a>
  210. </li>
  211. <li>
  212. <a href="#sc_UsingObservers">How to use Observers</a>
  213. </li>
  214. <li>
  215. <a href="#ch_UseCases">Example use cases</a>
  216. </li>
  217. </ul>
  218. </div>
  219. <a name="N10009"></a><a name="ch_Introduction"></a>
  220. <h2 class="h3">Observers: Scaling ZooKeeper Without Hurting Write Performance
  221. </h2>
  222. <div class="section">
  223. <p>
  224. Although ZooKeeper performs very well by having clients connect directly
  225. to voting members of the ensemble, this architecture makes it hard to
  226. scale out to huge numbers of clients. The problem is that as we add more
  227. voting members, the write performance drops. This is due to the fact that
  228. a write operation requires the agreement of (in general) at least half the
  229. nodes in an ensemble and therefore the cost of a vote can increase
  230. significantly as more voters are added.
  231. </p>
  232. <p>
  233. We have introduced a new type of ZooKeeper node called
  234. an <em>Observer</em> which helps address this problem and
  235. further improves ZooKeeper's scalability. Observers are non-voting members
  236. of an ensemble which only hear the results of votes, not the agreement
  237. protocol that leads up to them. Other than this simple distinction,
  238. Observers function exactly the same as Followers - clients may connect to
  239. them and send read and write requests to them. Observers forward these
  240. requests to the Leader like Followers do, but they then simply wait to
  241. hear the result of the vote. Because of this, we can increase the number
  242. of Observers as much as we like without harming the performance of votes.
  243. </p>
  244. <p>
  245. Observers have other advantages. Because they do not vote, they are not a
  246. critical part of the ZooKeeper ensemble. Therefore they can fail, or be
  247. disconnected from the cluster, without harming the availability of the
  248. ZooKeeper service. The benefit to the user is that Observers may connect
  249. over less reliable network links than Followers. In fact, Observers may be
  250. used to talk to a ZooKeeper server from another data center. Clients of
  251. the Observer will see fast reads, as all reads are served locally, and
  252. writes result in minimal network traffic as the number of messages
  253. required in the absence of the vote protocol is smaller.
  254. </p>
  255. </div>
  256. <a name="N1001C"></a><a name="sc_UsingObservers"></a>
  257. <h2 class="h3">How to use Observers</h2>
  258. <div class="section">
  259. <p>Setting up a ZooKeeper ensemble that uses Observers is very simple,
  260. and requires just two changes to your config files. Firstly, in the config
  261. file of every node that is to be an Observer, you must place this line:
  262. </p>
  263. <pre class="code">
  264. peerType=observer
  265. </pre>
  266. <p>
  267. This line tells ZooKeeper that the server is to be an Observer. Secondly,
  268. in every server config file, you must add :observer to the server
  269. definition line of each Observer. For example:
  270. </p>
  271. <pre class="code">
  272. server.1:localhost:2181:3181:observer
  273. </pre>
  274. <p>
  275. This tells every other server that server.1 is an Observer, and that they
  276. should not expect it to vote. This is all the configuration you need to do
  277. to add an Observer to your ZooKeeper cluster. Now you can connect to it as
  278. though it were an ordinary Follower. Try it out, by running:</p>
  279. <pre class="code">
  280. bin/zkCli.sh -server localhost:2181
  281. </pre>
  282. <p>
  283. where localhost:2181 is the hostname and port number of the Observer as
  284. specified in every config file. You should see a command line prompt
  285. through which you can issue commands like <em>ls</em> to query
  286. the ZooKeeper service.
  287. </p>
  288. </div>
  289. <a name="N1003B"></a><a name="ch_UseCases"></a>
  290. <h2 class="h3">Example use cases</h2>
  291. <div class="section">
  292. <p>
  293. Two example use cases for Observers are listed below. In fact, wherever
  294. you wish to scale the numbe of clients of your ZooKeeper ensemble, or
  295. where you wish to insulate the critical part of an ensemble from the load
  296. of dealing with client requests, Observers are a good architectural
  297. choice.
  298. </p>
  299. <ul>
  300. <li>
  301. <p> As a datacenter bridge: Forming a ZK ensemble between two
  302. datacenters is a problematic endeavour as the high variance in latency
  303. between the datacenters could lead to false positive failure detection
  304. and partitioning. However if the ensemble runs entirely in one
  305. datacenter, and the second datacenter runs only Observers, partitions
  306. aren't problematic as the ensemble remains connected. Clients of the
  307. Observers may still see and issue proposals.</p>
  308. </li>
  309. <li>
  310. <p>As a link to a message bus: Some companies have expressed an
  311. interest in using ZK as a component of a persistent reliable message
  312. bus. Observers would give a natural integration point for this work: a
  313. plug-in mechanism could be used to attach the stream of proposals an
  314. Observer sees to a publish-subscribe system, again without loading the
  315. core ensemble.
  316. </p>
  317. </li>
  318. </ul>
  319. </div>
  320. <p align="right">
  321. <font size="-2"></font>
  322. </p>
  323. </div>
  324. <!--+
  325. |end content
  326. +-->
  327. <div class="clearboth">&nbsp;</div>
  328. </div>
  329. <div id="footer">
  330. <!--+
  331. |start bottomstrip
  332. +-->
  333. <div class="lastmodified">
  334. <script type="text/javascript"><!--
  335. document.write("Last Published: " + document.lastModified);
  336. // --></script>
  337. </div>
  338. <div class="copyright">
  339. Copyright &copy;
  340. 2008 <a href="http://www.apache.org/licenses/">The Apache Software Foundation.</a>
  341. </div>
  342. <!--+
  343. |end bottomstrip
  344. +-->
  345. </div>
  346. </body>
  347. </html>