kafkaのpartitionとoffset


転載先:http://www.tuicool.com/articles/MZNfAj7
kafkaの急速な上で手の中で、残した問題はpartitionとoffsetについてで、この文章は主にこれを説明します.
Logメカニズム
パーティションといえば、kafkaのメッセージの格納と言います. 公式文書 に表示されます.
まず、kafkaはlog(ログ)によってメッセージの発行を記録します.メッセージが生成されるたびに、kafkaはローカルのlogファイルに記録されます.このlogは私たちの普段のlogと一定の違いがあります.ここで参考にしてください. The Log ,あまり説明しない
このlogファイルのデフォルトの位置はconfig/server.propertiesで指定されています.デフォルトの位置はlog.dirs=/tmp/kafka-logsです.linuxは言うまでもなく、windowsは対応するディスクのルートディレクトリの下にあります.私はDディスクです.
パーティションpartition
kafkaは分散環境のために設計されているため、ログファイルであれば、実際にはメッセージデータベースとして理解され、同じ場所に置くと、必然的に可用性の低下をもたらし、フルフックを掛け、フルコピーがすべてのマシンにあれば、データには冗長性がありすぎ、各マシンのディスクサイズが限られているため、いくら多くのマシンがあっても、処理可能なメッセージはディスクによって制限され、現在のディスクサイズを超えられないため、partitionの概念がある.
kafkaはメッセージを一定の計算を行いhashでパーティション化する.これにより,1部のlogファイルを複数に分割する.上のパーティションのようにログ図を読み書きし,複数に分割した後,単一のbroker上で,例えば高速上で手に入れ,topicを新規作成する場合に,我々は選択した.  --replication-factor 1 --partitions 2 ,ではlogディレクトリでは
test-0ディレクトリとtest-1ディレクトリです.2つのパーティションです.
これは何の違いもないと思います.注意してください.複数のbrokerがあると、この意味が存在します.ここの前の図、原文は参考リンクにあります.
これは、4つのパーティション、2 Replication(コピー)を含むtopicです.つまり、すべてのメッセージが4つのパーティションに格納され、高可用性のために4つのパーティションを2つの冗長化し、 ぶんぱいアルゴリズム .合計8部のデータをbrokerクラスタに割り当てる.
その結果、各brokerに格納されているデータは全量のデータよりも少ないが、各データには冗長性がある.これにより、1台のマシンがダウンすると、使用に影響を与えない.例えば、図中のBroker 1はダウンした.残りの3台のbrokerは依然として全量のパーティションデータを保持している.これにより、1台のダウンタイムが発生すると、データが不完全になる.もちろん、より多くの冗長性を設定することができる.例えば冗長性が4に設定されていると、各機器には0123の完全なデータがあり、何台でもダウンタイムが発生します.ストレージの占有量と高可用性の間で測定する必要があります.ダウンタイム後、zookeeperは新しいpartition leaderを選んでサービスを提供します.
オフセットoffset
前の段落では、パーティションは秩序正しく、可変のメッセージキューである.新しく来たcommit logは後続にデータを追加し続けている.これらのメッセージは、このメッセージを位置決めするためにoffsetという下付き(またはオフセット)が割り当てられている.
消費者がどのメッセージを消費するかは、消費者の側に保持される.メッセージ者は、消費者が最後のメッセージのoffsetをローカルに保存し、間欠的にzookeeperにoffsetを登録することもできる.offsetをリセットすることもできる.
offsetでパーティションを算出する方法
実はpartitionが格納するとき、また複数のsegment(セグメント)に分けて、それから1つのindex、インデックスを通じて、いくつかのセグメントを識別します.ここではまずローカルlogディレクトリのパーティションフォルダを見てみましょう.
私のところtest-0、このパーティションにはindexファイルとlogファイルがあります.
ある指定されたパーティションについて、5つのメッセージごとに1つのセグメントサイズとして仮定すると、10個のメッセージが生成された場合、現在得られていると考えられる(説明のみ)
0.index(ここでindexは0-4に対するインデックスであることを示す)
5.index(ここでindexは5-9に対するインデックスであることを示す)
10.index(ここでindexは10-15に対するインデックスであり、まだ満タンではないことを示す)

0.log
5.log
10.log
消費者がoffset=8を読み取る必要がある場合は、まずkafkaがindexファイルリストを二分して検索し、算出することができる.5.index対応のlogファイルのうち、対応する5.logファイルを順番に検索し、5->6->7->8、順番が8になるまで検索すればよい