kafka-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jkr...@apache.org
Subject svn commit: r1575124 - in /kafka/site: 081/documentation.html 081/introduction.html 081/ops.html diagrams/mirror-maker.graffle images/mirror-maker.png
Date Fri, 07 Mar 2014 02:01:53 GMT
Author: jkreps
Date: Fri Mar  7 02:01:52 2014
New Revision: 1575124

URL: http://svn.apache.org/r1575124
Log:
Add a documentation section on basic ops.


Added:
    kafka/site/diagrams/mirror-maker.graffle
    kafka/site/images/mirror-maker.png   (with props)
Modified:
    kafka/site/081/documentation.html
    kafka/site/081/introduction.html
    kafka/site/081/ops.html

Modified: kafka/site/081/documentation.html
URL: http://svn.apache.org/viewvc/kafka/site/081/documentation.html?rev=1575124&r1=1575123&r2=1575124&view=diff
==============================================================================
--- kafka/site/081/documentation.html (original)
+++ kafka/site/081/documentation.html Fri Mar  7 02:01:52 2014
@@ -47,15 +47,25 @@ Prior releases: <a href="/07/documentati
 		</ul>
 	<li><a href="#operations">6. Operations</a>
 		<ul>
-			  <li><a href="#datacenters">6.1 Datacenters</a>
-			  <li><a href="#config">6.2 Config</a>
+			 <li><a href="#basic_ops">6.1 Basic Kafka Operations</a>
+				<ul>
+  			 		<li><a href="#basic_ops_add_topic">Adding and removing topics</a>
+			 		<li><a href="#basic_ops_modify_topic">Modifying topics</a>
+			 		<li><a href="#basic_ops_restarting">Graceful shutdown</a>
+			 		<li><a href="#basic_ops_leader_balancing">Balancing leadership</a>
+					<li><a href="#basic_ops_consumer_lag">Checking consumer position</a>
+			 		<li><a href="#basic_ops_mirror_maker">Mirroring data between clusters</a>
+			 		<li><a href="#basic_ops_cluster_expansion">Expanding your cluster</a>
+				</ul>
+			 <li><a href="#datacenters">6.2 Datacenters</a>
+			 <li><a href="#config">6.3 Important Configs</a>
 				 <ul>
 					 <li><a href="#serverconfig">Important Server Configs</a>
 					 <li><a href="#clientconfig">Important Client Configs</a>
 					 <li><a href="#prodconfig">A Production Server Configs</a>
         		 </ul>
-     		  <li><a href="#java">6.3 Java Version</a>
-	 		  <li><a href="#hwandos">6.4 Hardware and OS</a>
+     		  <li><a href="#java">6.4 Java Version</a>
+	 		  <li><a href="#hwandos">6.5 Hardware and OS</a>
 				<ul>
 					<li><a href="#os">OS</a>
 					<li><a href="#diskandfs">Disks and Filesystems</a>
@@ -63,8 +73,8 @@ Prior releases: <a href="/07/documentati
 					<li><a href="#linuxflush">Linux Flush Behavior</a>
 					<li><a href="#ext4">Ext4 Notes</a>
 				</ul>
-			  <li><a href="#monitoring">6.5 Monitoring</a>
-			  <li><a href="#zk">6.6 Zookeeper</a>
+			  <li><a href="#monitoring">6.6 Monitoring</a>
+			  <li><a href="#zk">6.7 Zookeeper</a>
 				<ul>
 					<li><a href="#zkversion">Stable Version</a>
 					<li><a href="#zkops">Operationalization</a>

Modified: kafka/site/081/introduction.html
URL: http://svn.apache.org/viewvc/kafka/site/081/introduction.html?rev=1575124&r1=1575123&r2=1575124&view=diff
==============================================================================
--- kafka/site/081/introduction.html (original)
+++ kafka/site/081/introduction.html Fri Mar  7 02:01:52 2014
@@ -45,7 +45,7 @@ Each partition has one server which acts
 
 Producers publish data to the topics of their choice. The producer is able to choose which
message to assign to which partition within the topic. This can be done in a round-robin fashion
simply to balance load or it can be done according to some semantic partition function (say
based on some key in the message). More on the use of partitioning in a second.
 
-<h4>Consumers</h4>
+<h4><a id="intro_consumers">Consumers</a></h4>
 
 Messaging traditionally has two models: <a href="http://en.wikipedia.org/wiki/Message_queue">queuing</a>
and <a href="http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern">publish-subscribe</a>.
In a queue, a pool of consumers may read from a server and each message goes to one of them;
in publish-subscribe the message is broadcast to all consumers. Kafka offers a single consumer
abstraction that generalizes both of these&mdash;the <i>consumer group</i>.
 <p>

Modified: kafka/site/081/ops.html
URL: http://svn.apache.org/viewvc/kafka/site/081/ops.html?rev=1575124&r1=1575123&r2=1575124&view=diff
==============================================================================
--- kafka/site/081/ops.html (original)
+++ kafka/site/081/ops.html Fri Mar  7 02:01:52 2014
@@ -1,21 +1,148 @@
 Here is some information on actually running Kafka as a production system based on usage
and experience at LinkedIn. Please send us any additional tips you know of.
 
-<h3><a id="datacenters">6.1 Datacenters</a></h3>
-Some deployments will need to manage a data pipeline that spans multiple datacenters. Our
approach to this is to deploy a local Kafka cluster in each datacenter and machines in each
location interact only with their local cluster.
+<h3><a id="basic_ops">6.1 Basic Kafka Operations</a></h3>
+
+This section will review the most common operations you will perform on your Kafka cluster.
All of the tools reviewed in this section are available under the <code>bin/</code>
directory of the Kafka distribution and each tool will print details on all possible commandline
options if it is run with no arguments.
+	
+<h4><a id="basic_ops_add_topic">Adding and removing topics</a></h4>
+
+You have the option of either adding topics manually or having them be created automatically
when data is first published to a non-existent topic. If topics are auto-created then you
may want to tune the default <a href="#topic-config">topic configurations</a>
used for auto-created topics.
+<p>
+Topics are added and modified using the topic tool:
+<pre>
+ &gt; bin/kafka-topics.sh --zookeeper zk_host:port/chroot --create --topic my_topic_name
--partitions 20 --replication-factor 3 --config x=y
+</pre>
+The replication factor controls how many servers will replicate each message that is written.
If you have a replication factor of 3 then up to 2 servers can fail before you will lose access
to your data. We recommend you use a replication factor of 2 or 3 so that you can transparently
bounce machines without interrupting data consumption.
+<p>
+The partition count controls how many logs the topic will be sharded into. There are several
impacts of the partition count. First each partition must fit entirely on a single server.
So if you have 20 partitions the full data set (and read and write load) will be handled by
no more than 20 servers (no counting replicas). Finally the partition count impacts the maximum
parallelism of your consumers. This is discussed in greater detail in the <a href="intro_consumers">concepts
section</a>.
+<p>
+The configurations added on the command line override the default settings the server has
for things like the length of time data should be retained. The complete set of per-topic
configurations is documented <a href="#topic-config">here</a>.
+
+<h4><a id="basic_ops_modify_topic">Modifying topics</a></h4>
+
+You can change the configuration or partitioning of a topic using the same topic tool.
+<p>
+To add partitions you can do
+<pre>
+ &gt; bin/kafka-topics.sh --zookeeper zk_host:port/chroot --alter --topic my_topic_name
--partitions 40 
+</pre>
+Be aware that one use case for partitions is to semantically partition data, and adding partitions
doesn't change the partitioning of existing data so this may disturb consumers if they rely
on that partition. That is if data is partitioned by <code>hash(key) % number_of_partitions</code>
then this partitioning will potentially be shuffled by adding partitions but Kafka will not
attempt to automatically redistribute data in any way.
+<p>
+To add configs:
+<pre>
+ &gt; bin/kafka-topics.sh --zookeeper zk_host:port/chroot --alter --topic my_topic_name
--config x=y
+</pre>
+To remove a config:
+<pre>
+ &gt; bin/kafka-topics.sh --zookeeper zk_host:port/chroot --alter --topic my_topic_name
--deleteConfig x
+</pre>
+And finally deleting a topic:
+<pre>
+ &gt; bin/kafka-topics.sh --zookeeper zk_host:port/chroot --delete --topic my_topic_name
+</pre>
+
+Kafka does not currently support reducing the number of partitions for a topic or changing
the replication factor.
+
+<h4><a id="basic_ops_restarting">Graceful shutdown</a></h4>
+
+The Kafka cluster will automatically detect any broker shutdown or failure and elect new
leaders for the partitions on that machine. This will occur whether a server fails or it is
brought down intentionally for maintenance or configuration changes. For the later cases Kafka
supports a more graceful mechanism for stoping a server then just killing it.
+
+When a server is stopped gracefully it has two optimizations it will take advantage of:
+<ol>
+	<li>It will sync all its logs to disk to avoid needing to do any log recovery when
it restarts (i.e. validating the checksum for all messages in the tail of the log). Log recovery
takes time so this speeds up intentional restarts.
+	<li>It will migrate any partitions the server is the leader for to other replicas
prior to shutting down. This will make the leadership transfer faster and minimize the time
each partition is unavailable to a few milliseconds.
+</ol>
+
+Syncing the logs will happen automatically happen whenever the server is stopped other than
by a hard kill, but the controlled leadership migration requires using a special tool.
+<pre>
+ &gt; bin/kafka-run-class.sh kafka.admin.ShutdownBroker --zookeeper zk_host:port/chroot
--broker broker.id
+</pre>
+
+Since graceful shutdown is a good thing and you may automatically be stopping and starting
the broker through a deployment tool you can also make the broker do this automatically by
setting the following server configuration:
+<pre>
+	controlled.shutdown.enable=true
+</pre>
+Note that controlled shutdown will only succeed if <i>all</i> the partitions
hosted on the broker have replicas (i.e. the replication factor is greater than 1 <i>and</i>
at least one of these replicas is alive). This is generally what you want since shutting down
the last replica would make that topic partition unavailable.
+
+<h4><a id="basic_ops_leader_balancing">Balancing leadership</a></h4>
+
+Whenever a broker stops or crashes leadership for that broker's partitions transfers to other
replicas. This means that by default when the broker is restarted it will only be a follower
for all its partitions, meaning it will not be used for client reads and writes.
+<p>
+To avoid this imbalance, Kafka has a notion of preferred replicas. If the list of replicas
for a partition is 1,5,9 then node 1 is preferred as the leader to either node 5 or 9 because
it is earlier in the replica list. You can have the Kafka cluster try to restore leadership
to the restored replicas by running the command:
+<pre>
+ &gt; bin/kafka-preferred-replica-election.sh --zookeeper zk_host:port/chroot
+</pre>
+
+Since running this command can be tedious you can also configure Kafka to do this automatically
by setting the following configuration:
+<pre>
+	auto.leader.rebalance.enable=true
+</pre>
+
+<h4><a id="basic_ops_mirror_maker">Mirroring data between clusters</a></h4>
+
+We refer to the process of replicating data <i>between</i> Kafka clusters "mirroring"
to avoid confusion with the replication that happens amongst the nodes in a single cluster.
Kafka comes with a tool for mirroring data between Kafka clusters. The tool reads from one
or more source clusters and writes to a destination cluster, like this:
+<p>
+<img src="/images/mirror-maker.png">
+<p>
+A common use case for this kind of mirroring is to provide a replica in another datacenter.
This scenario will be discussed in more detail in the next section.
+<p>
+You can run many such mirroring processes to increase throughput and for fault-tolerance
(if one process dies, the others will take overs the additional load).
 <p>
-For applications that need a global view of all data we use the <a href="#tools">mirror
maker tool</a> to provide clusters which have aggregate data mirrored from all datacenters.
These aggregator clusters are used for reads by applications that require this.
+Data will be read from topics in the source cluster and written to a topic with the same
name in the destination cluster. In fact the mirror maker is little more than a Kafka consumer
and producer hooked together.
+<p>
+The source and destination clusters are completely independent entities: they can have different
numbers of partitions and the offsets will not be the same. For this reason the mirror cluster
is not really intended as a fault-tolerance mechanism (as the consumer position will be different);
for that we recommend using normal in-cluster replication. The mirror maker process will,
however, retain and use the message key for partitioning so order is preserved on a per-key
basis.
+<p>
+Here is an example showing how to mirror a single topic (named <i>my-topic</i>)
from two input clusters:
+<pre>
+ &gt; bin/kafka-run-class.sh kafka.admin.ShutdownBroker --zookeeper zk_host:port/chroot
--consumer.config consumer-1.properties --consumer.config consumer-2.properties --producer.config
producer.properties --whitelist my-topic
+</pre>
+Note that we specify the list of topics with the <code>--whitelist</code> option.
This option allows any regular expression using <a href="http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html">Java-style
regular expressions</a>. So you could mirror two topics named <i>A</i> and
<i>B</i> using <code>--whitelist 'A|B'</code>. Or you could mirror
<i>all</i> topics using <code>--whitelist '*'</code>. Make sure to
quote any regular expression to ensure the shell doesn't try to expand it as a file path.
For convenience we allow the use of ',' instead of '|' to specify a list of topics.
+<p>
+Sometime it is easier to say what it is that you <i>don't</i> want. Instead of
using <code>--whitelist</code> to say what you want to mirror you can use <code>--blacklist</code>
to say what to exclude. This also takes a regular expression argument.
+<p>
+Combining mirroring with the configuration <code>auto.create.topics.enable=true</code>
makes it possible to have a replica cluster that will automatically create and replicate all
data in a source cluster even as new topics are added.
+
+<h4><a id="basic_ops_consumer_lag">Checking consumer position</a></h4>
+Sometimes it's useful to see the position of your consumers. We have a tool that will show
the position of all consumers in a consumer group as well as how far behind the end of the
log they are. To run this tool on a consumer group named <i>my-group</i> consuming
a topic named <i>my-topic</i> would look like this:
+<pre>
+ &gt; bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zkconnect localhost:2181
--group test
+Group           Topic                          Pid Offset          logSize         Lag  
          Owner
+my-group        my-topic                       0   0               0               0    
          test_jkreps-mn-1394154511599-60744496-0
+my-group        my-topic                       1   0               0               0    
          test_jkreps-mn-1394154521217-1a0be913-0
+</pre>
+
+<h4><a id="basic_ops_cluster_expansion">Expanding your cluster</a></h4>
+
+Adding servers to a Kafka cluster is easy, just assign them a unique broker id and start
up Kafka on your the new servers. However these new servers will not automatically be assigned
any data partitions, so unless partitions are moved to them they won't be doing any work until
new topics are created. So usually when you add machines to your cluster you will want to
migrate some existing data to these machines.
+<p>
+The process of migrating data is manually initiated but fully automated. Under the covers
what happens is that Kafka will add the new server as a follower of the partition it is migrating
and allow it to fully replicate the existing data in that partition. When the new server has
fully replicated the contents of this partition and joined the in-sync replica one of the
existing replicas will delete their partition's data.
+
+<h5>Automatically migrating data to new machines</h5>
+Cover the case where we just want to migrate a fair share to the new machines.
+
+Neha will write this :-)
+
+<h5>Custom partition assignment and migration</h5>
+
+Neha will write this :-)
+
+Does this cover decommissioning machines? If so we should mention that...
+
+<h3><a id="datacenters">6.2 Datacenters</a></h3>
+
+Some deployments will need to manage a data pipeline that spans multiple datacenters. Our
recommended approach to this is to deploy a local Kafka cluster in each datacenter with application
instances in each datacenter interacting only with their local cluster and mirroring between
clusters (see the documentation on the <a href="#basic_ops_mirror_maker">mirror maker
tool</a> for how to do this).
 <p>
-Likewise in order to support data load into Hadoop which resides in separate facilities we
provide local read-only clusters that mirror the production data centers in the facilities
where this data load occurs.
+This deployment pattern allows datacenters to act as independent entities and allows us to
manage and tune inter-datacenter replication centrally. This allows each facility to stand
alone and operate even if the inter-datacenter links are unavailable: when this occurs the
mirroring falls behind until the link is restored at which time it catches up.
 <p>
-This allows each facility to stand alone and operate even if the inter-datacenter links are
unavailable: when this occurs the mirroring falls behind until the link is restored at which
time it catches up.
+For applications that need a global view of all data you can use mirroring to provide clusters
which have aggregate data mirrored from the local clusters in <i>all</i> datacenters.
These aggregate clusters are used for reads by applications that require the full data set.
 <p>
-This deployment pattern allows datacenters to act as independent entities and allows us to
manage and tune inter-datacenter replication centrally.
+This is not the only possible deployment pattern. It is possible to read from or write to
a remote Kafka cluster over the WAN, though obviously this will add whatever latency is required
to get the cluster.
 <p>
-This is not the only possible deployment pattern. It is possible to read from or write to
a remote Kafka cluster over the WAN though TCP tuning will be necessary for high-latency links.
+Kafka naturally batches data in both the producer and consumer so it can achieve high-throughput
even over a high-latency connection. To allow this though it may be necessary to increase
the TCP socket buffer sizes for the producer, consumer, and broker using the <code>socket.send.buffer.bytes</code>
and <code>socket.receive.buffer.bytes</code> configurations. The appropriate way
to set this is documented <a hef="http://en.wikipedia.org/wiki/Bandwidth-delay_product">here</a>.
 <p>
-It is generally not advisable to run a single Kafka cluster that spans multiple datacenters
as this will incur very high replication latency both for Kafka writes and Zookeeper writes
and neither Kafka nor Zookeeper will remain available if the network partitions.
+It is generally <i>not</i> advisable to run a <i>single</i> Kafka
cluster that spans multiple datacenters over a high-latency link. This will incur very high
replication latency both for Kafka writes and Zookeeper writes, and neither Kafka nor Zookeeper
will remain available in all locations if the network between locations is unavailable.
 
-<h3><a id="config">6.2 Kafka Configuration</a></h3>
+<h3><a id="config">6.3 Kafka Configuration</a></h3>
 
 <h4><a id="clientconfig">Important Client Configurations</a></h4>
 The most important producer configurations control
@@ -161,7 +288,7 @@ It is not necessary to tune these settin
   <li>delalloc: Delayed allocation means that the filesystem avoid allocating any blocks
until the physical write occurs. This allows ext4 to allocate a large extent instead of smaller
pages and helps ensure the data is written sequentially. This feature is great for throughput.
It does seem to involve some locking in the filesystem which adds a bit of latency variance.
 </ul>
 	
-<h3><a id="monitoring">6.5 Monitoring</a></h3>
+<h3><a id="monitoring">6.6 Monitoring</a></h3>
 
 Kafka uses Yammer Metrics for metrics reporting in both the server and the client. This can
be configured to report stats using pluggable stats reporters to hook up to your monitoring
system.
 <p>
@@ -301,7 +428,7 @@ On the client side, we recommend monitor
 <h4>Audit</h4>
 The final alerting we do is on the correctness of the data delivery. We audit that every
message that is sent is consumed by all consumers and measure the lag for this to occur. For
important topics we alert if a certain completeness is not achieved in a certain time period.
The details of this are discussed in KAFKA-260.
 
-<h3><a id="zk">6.6 Zookeeper</a></h3>
+<h3><a id="zk">6.7 Zookeeper</a></h3>
 
 <h4><a id="zkversion">Stable version</a></h4>
 At LinkedIn, we are running Zookeeper 3.3.*. Version 3.3.3 has known serious issues regarding
ephemeral node deletion and session expirations. After running into those issues in production,
we upgraded to 3.3.4 and have been running that smoothly for over a year now.

Added: kafka/site/diagrams/mirror-maker.graffle
URL: http://svn.apache.org/viewvc/kafka/site/diagrams/mirror-maker.graffle?rev=1575124&view=auto
==============================================================================
--- kafka/site/diagrams/mirror-maker.graffle (added)
+++ kafka/site/diagrams/mirror-maker.graffle Fri Mar  7 02:01:52 2014
@@ -0,0 +1,655 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>ActiveLayerIndex</key>
+	<integer>0</integer>
+	<key>ApplicationVersion</key>
+	<array>
+		<string>com.omnigroup.OmniGrafflePro.MacAppStore</string>
+		<string>139.16</string>
+	</array>
+	<key>AutoAdjust</key>
+	<true/>
+	<key>BackgroundGraphic</key>
+	<dict>
+		<key>Bounds</key>
+		<string>{{0, 0}, {576.00002479553223, 733}}</string>
+		<key>Class</key>
+		<string>SolidGraphic</string>
+		<key>ID</key>
+		<integer>2</integer>
+		<key>Style</key>
+		<dict>
+			<key>shadow</key>
+			<dict>
+				<key>Draws</key>
+				<string>NO</string>
+			</dict>
+			<key>stroke</key>
+			<dict>
+				<key>Draws</key>
+				<string>NO</string>
+			</dict>
+		</dict>
+	</dict>
+	<key>BaseZoom</key>
+	<integer>0</integer>
+	<key>CanvasOrigin</key>
+	<string>{0, 0}</string>
+	<key>ColumnAlign</key>
+	<integer>1</integer>
+	<key>ColumnSpacing</key>
+	<real>36</real>
+	<key>CreationDate</key>
+	<string>2014-03-07 00:21:00 +0000</string>
+	<key>Creator</key>
+	<string>Jay Kreps</string>
+	<key>DisplayScale</key>
+	<string>1 0/72 in = 1 0/72 in</string>
+	<key>GraphDocumentVersion</key>
+	<integer>8</integer>
+	<key>GraphicsList</key>
+	<array>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica-Light</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>6</integer>
+			</dict>
+			<key>ID</key>
+			<integer>13</integer>
+			<key>Points</key>
+			<array>
+				<string>{233.5, 220.50001287710865}</string>
+				<string>{262.5, 220.50001287710865}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>8</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica-Light</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>9</integer>
+			</dict>
+			<key>ID</key>
+			<integer>12</integer>
+			<key>Points</key>
+			<array>
+				<string>{137, 218}</string>
+				<string>{175.50013308771918, 217.11153539028339}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica-Light</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>9</integer>
+			</dict>
+			<key>ID</key>
+			<integer>11</integer>
+			<key>Points</key>
+			<array>
+				<string>{136.42782302132221, 256.16317046515138}</string>
+				<string>{175.57217697867779, 232.48561002265339}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>4</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Class</key>
+			<string>LineGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica-Light</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>Head</key>
+			<dict>
+				<key>ID</key>
+				<integer>9</integer>
+			</dict>
+			<key>ID</key>
+			<integer>10</integer>
+			<key>Points</key>
+			<array>
+				<string>{136.44590089649139, 183.24328630846392}</string>
+				<string>{175.55409910350861, 203.08354295982878}</string>
+			</array>
+			<key>Style</key>
+			<dict>
+				<key>stroke</key>
+				<dict>
+					<key>HeadArrow</key>
+					<string>FilledArrow</string>
+					<key>Legacy</key>
+					<true/>
+					<key>LineType</key>
+					<integer>1</integer>
+					<key>TailArrow</key>
+					<string>0</string>
+				</dict>
+			</dict>
+			<key>Tail</key>
+			<dict>
+				<key>ID</key>
+				<integer>3</integer>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{176, 200.5}, {52, 32}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica-Light</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>9</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica-Light;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Mirror\
+maker}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{181, 204.5}, {52, 32}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica-Light</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>8</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica-Light;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Mirror\
+maker}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{186, 208.5}, {52, 32}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica-Light</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>7</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica-Light;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Mirror\
+maker}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{263, 188}, {73, 65}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica-Light</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>6</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica-Light;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Destination Cluster}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{97.5, 200.5}, {4, 42}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FitText</key>
+			<string>YES</string>
+			<key>Flow</key>
+			<string>Resize</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica-Light</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>5</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>fill</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+				<key>stroke</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Pad</key>
+				<integer>0</integer>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica-Light;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 .\
+.\
+.}</string>
+				<key>VerticalPad</key>
+				<integer>0</integer>
+			</dict>
+			<key>Wrap</key>
+			<string>NO</string>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{63, 246}, {73, 65}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica-Light</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>4</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica-Light;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Source Cluster \
+N}</string>
+			</dict>
+		</dict>
+		<dict>
+			<key>Bounds</key>
+			<string>{{63, 132}, {73, 65}}</string>
+			<key>Class</key>
+			<string>ShapedGraphic</string>
+			<key>FontInfo</key>
+			<dict>
+				<key>Font</key>
+				<string>Helvetica-Light</string>
+				<key>Size</key>
+				<real>12</real>
+			</dict>
+			<key>ID</key>
+			<integer>3</integer>
+			<key>Shape</key>
+			<string>Rectangle</string>
+			<key>Style</key>
+			<dict>
+				<key>shadow</key>
+				<dict>
+					<key>Draws</key>
+					<string>NO</string>
+				</dict>
+			</dict>
+			<key>Text</key>
+			<dict>
+				<key>Text</key>
+				<string>{\rtf1\ansi\ansicpg1252\cocoartf1187\cocoasubrtf400
+\cocoascreenfonts1{\fonttbl\f0\fswiss\fcharset0 Helvetica-Light;}
+{\colortbl;\red255\green255\blue255;}
+\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
+
+\f0\fs24 \cf0 Source Cluster\
+1}</string>
+			</dict>
+		</dict>
+	</array>
+	<key>GridInfo</key>
+	<dict/>
+	<key>GuidesLocked</key>
+	<string>NO</string>
+	<key>GuidesVisible</key>
+	<string>YES</string>
+	<key>HPages</key>
+	<integer>1</integer>
+	<key>ImageCounter</key>
+	<integer>1</integer>
+	<key>KeepToScale</key>
+	<false/>
+	<key>Layers</key>
+	<array>
+		<dict>
+			<key>Lock</key>
+			<string>NO</string>
+			<key>Name</key>
+			<string>Layer 1</string>
+			<key>Print</key>
+			<string>YES</string>
+			<key>View</key>
+			<string>YES</string>
+		</dict>
+	</array>
+	<key>LayoutInfo</key>
+	<dict>
+		<key>Animate</key>
+		<string>NO</string>
+		<key>circoMinDist</key>
+		<real>18</real>
+		<key>circoSeparation</key>
+		<real>0.0</real>
+		<key>layoutEngine</key>
+		<string>dot</string>
+		<key>neatoSeparation</key>
+		<real>0.0</real>
+		<key>twopiSeparation</key>
+		<real>0.0</real>
+	</dict>
+	<key>LinksVisible</key>
+	<string>NO</string>
+	<key>MagnetsVisible</key>
+	<string>NO</string>
+	<key>MasterSheets</key>
+	<array/>
+	<key>ModificationDate</key>
+	<string>2014-03-07 01:20:38 +0000</string>
+	<key>Modifier</key>
+	<string>Jay Kreps</string>
+	<key>NotesVisible</key>
+	<string>NO</string>
+	<key>Orientation</key>
+	<integer>2</integer>
+	<key>OriginVisible</key>
+	<string>NO</string>
+	<key>PageBreaks</key>
+	<string>YES</string>
+	<key>PrintInfo</key>
+	<dict>
+		<key>NSBottomMargin</key>
+		<array>
+			<string>float</string>
+			<string>41</string>
+		</array>
+		<key>NSHorizonalPagination</key>
+		<array>
+			<string>coded</string>
+			<string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG</string>
+		</array>
+		<key>NSLeftMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+		<key>NSPaperSize</key>
+		<array>
+			<string>size</string>
+			<string>{612.00002479553223, 792}</string>
+		</array>
+		<key>NSPrintReverseOrientation</key>
+		<array>
+			<string>int</string>
+			<string>0</string>
+		</array>
+		<key>NSPrinter</key>
+		<array>
+			<string>coded</string>
+			<string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAlOU1ByaW50ZXIAhIQITlNPYmplY3QAhZKEhIQITlNTdHJpbmcBlIQBKxdEZWxsIExhc2VyIFByaW50ZXIgMTcxMIaG</string>
+		</array>
+		<key>NSPrinterName</key>
+		<array>
+			<string>string</string>
+			<string>Dell Laser Printer 1710</string>
+		</array>
+		<key>NSRightMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+		<key>NSTopMargin</key>
+		<array>
+			<string>float</string>
+			<string>18</string>
+		</array>
+	</dict>
+	<key>PrintOnePage</key>
+	<false/>
+	<key>ReadOnly</key>
+	<string>NO</string>
+	<key>RowAlign</key>
+	<integer>1</integer>
+	<key>RowSpacing</key>
+	<real>36</real>
+	<key>SheetTitle</key>
+	<string>Canvas 1</string>
+	<key>SmartAlignmentGuidesActive</key>
+	<string>YES</string>
+	<key>SmartDistanceGuidesActive</key>
+	<string>YES</string>
+	<key>UniqueID</key>
+	<integer>1</integer>
+	<key>UseEntirePage</key>
+	<false/>
+	<key>VPages</key>
+	<integer>1</integer>
+	<key>WindowInfo</key>
+	<dict>
+		<key>CurrentSheet</key>
+		<integer>0</integer>
+		<key>ExpandedCanvases</key>
+		<array>
+			<dict>
+				<key>name</key>
+				<string>Canvas 1</string>
+			</dict>
+		</array>
+		<key>Frame</key>
+		<string>{{222, 114}, {711, 872}}</string>
+		<key>ListView</key>
+		<true/>
+		<key>OutlineWidth</key>
+		<integer>142</integer>
+		<key>RightSidebar</key>
+		<false/>
+		<key>ShowRuler</key>
+		<true/>
+		<key>Sidebar</key>
+		<true/>
+		<key>SidebarWidth</key>
+		<integer>120</integer>
+		<key>VisibleRegion</key>
+		<string>{{0, 0}, {576, 733}}</string>
+		<key>Zoom</key>
+		<real>1</real>
+		<key>ZoomValues</key>
+		<array>
+			<array>
+				<string>Canvas 1</string>
+				<real>1</real>
+				<real>1</real>
+			</array>
+		</array>
+	</dict>
+</dict>
+</plist>

Added: kafka/site/images/mirror-maker.png
URL: http://svn.apache.org/viewvc/kafka/site/images/mirror-maker.png?rev=1575124&view=auto
==============================================================================
Binary file - no diff available.

Propchange: kafka/site/images/mirror-maker.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream



Mime
View raw message