Kafka を使い始める

Kafka を使い始める

著者: ninetyhe、Tencent CDG バックエンド開発エンジニア

古いものを見直して新しいものを学び、優れたフレームワークを繰り返し学習すれば、必ず何かが得られます。仕事上の理由により、特別なシナリオで Kafka を使用する必要があります。週末にカフカ情報を再度読み、多くのことを学びました。

アプリケーションシナリオ

  • 非同期分解: 上流と下流の間に強い依存関係がないビジネス関係、または単一の要求に対してすぐに処理する必要のないビジネス。
  • システム バッファリング: 特に処理速度が遅いサービスの場合、サービス システムのスループットの一貫性の問題を解決するのに役立ちます。
  • ピーク除去: 短期間で時折発生する極端なトラフィックに対して、バックエンド サービスを保護できます。
  • データ ストリーム処理: Spark を統合して実際のデータ ストリーム処理を実行します。

Kafka トポロジー図 (マルチコピー メカニズム)

上の図から、Kafka は分散されており、パーティションごとに複数のコピーがあることがわかります。同時に、クラスター全体の管理は Zookeeper によって管理されます。

Kafka コアコンポーネント

ブローカ

Kafka サーバーはメッセージの保存と転送を担当します。ブローカーは Kafka ノードを表します。ブローカーには複数のトピックを含めることができます

トピック

メッセージカテゴリ、Kafka はトピックに応じてメッセージを分類します

パーティション

  • トピックのパーティション。トピックには複数のパーティションを含めることができ、トピック メッセージは各パーティションに保存されます。トピックは複数のパーティションに分割できるため、Kafka には並列処理機能が提供されており、これが Kafka の高スループットの理由の 1 つです。
  • パーティションは物理的に複数のセグメント ファイルで構成され、各セグメントは同じサイズで、順番に読み書きされます (ランダム書き込みが不要なため、Kafka が比較的高速である理由の 1 つでもあります)。各セグメント データ ファイルは、セグメント内の最小オフセットを使用し、ファイル拡張子は .log になります。オフセット付きのメッセージを検索する場合は、バイナリ検索を使用して、メッセージが配置されているセグメントをすばやく見つけます。

オフセット

  • ログ内のメッセージの位置は、パーティション上のメッセージのオフセットとして理解でき、これはメッセージを表す一意のシーケンス番号でもあります。
  • また、マスターとスレーブ間で同期する必要がある情報でもあります。

プロデューサー

プロデューサー、Kafkaブローカーにメッセージを送信するクライアント

消費者

メッセージ コンシューマー。Kafka ブローカーでメッセージを消費する役割を担います。

消費者団体

消費者グループ。各消費者はグループに属している必要があります。 (パーティションはグループ内の 1 つのコンシューマーのみが使用でき、コンシューマー グループは相互に影響を与えないことに注意してください。)

動物園の飼育員

Kafka クラスターを管理し、クラスター ブローカー、トピック、パーティションなどのメタデータの保存を担当します。また、ブローカーの障害検出、パーティション リーダーの選出、負荷分散などの機能も担当します。

サービス ガバナンス Kafka は分散パブリッシュ/サブスクライブ システムなので、クラスター間のデータ同期と一貫性が実現されれば、Kafka はメッセージを失わないのでしょうか?そして、クラッシュしたときにリーダーを選出するにはどうすればいいのでしょうか?

データ同期

Kafka では、パーティションにはリーダーと複数のフォロワーが存在します。プロデューサーがパーティションにデータを書き込む場合、データはリーダーにのみ書き込まれ、その後、データは他のレプリカに複製されます。各フォロワーは、定期的にリーダーにメッセージを受け取る消費者として理解できます。データが同期された後にのみ、Kafka はプロデューサーに ACK を返し、メッセージが保存されたことを通知します。

情報サービス

Kafka では、パフォーマンスを確保するために、マスターとスレーブのデータを同期するために強力な一貫性方式を使用しません。代わりに、同期レプリカのリストが維持されます。リーダーは、すべてのフォロワーが同期を完了するまで待つ必要はありません。 ISR 内のフォロワーがデータ同期を完了すると、プロデューサーに ack を送信し、メッセージの同期が完了したと見なすことができます。同時に、ISR 内のフォロワーがあまりにも遅れていることが判明した場合は、そのフォロワーは削除されます。

具体的なプロセスは以下のとおりです。


上記のアプローチでは、Kafka がメッセージを失わないことを保証することはできません。 Kafka は、メッセージが最大限失われないようにマルチコピー メカニズムを使用しますが、データがシステム ページ キャッシュに書き込まれているがまだディスクにフラッシュされていない場合、マシンが突然クラッシュしたり電源が失われたりすると、当然メッセージは失われます。

Kafka 障害回復

Kafka は Zookeeper によって管理されるため、ここでの選択メカニズムでは Zab (Zookeeper によって使用される) が使用されます。

  • プロデューサーはリーダーにメッセージを送ります。このとき、リーダーはデータの保存を完了して突然失敗し、プロデューサーに ack を返しません。
  • ZK 選挙を通じて、フォロワーの 1 人がリーダーになります。このとき、プロデューサーは新しいリーダーに再度要求し、データを保存します。

Kafka はなぜこんなに速いのでしょうか?

ディスクへの順次書き込み

Kafka はシーケンシャルディスク書き込みを使用するため、ランダム書き込みに比べてアドレスの検索にかかる時間が短縮されます。 (Kafka の各パーティションでは、メッセージが順序付けられます。

ページキャッシュ

Kafka は、通常使用するバッファの代わりに、OS システム内のページ キャッシュを使用します。ページ キャッシュは、実際には馴染みのないものではなく、新しいものでもありません。

Linux でメモリをチェックすると、バッファ/キャッシュが表示されることがよくあります。どちらも IO の読み取りと書き込みを高速化するために使用されます。キャッシュは読み取りに使用されます。つまり、ディスクの内容をキャッシュに読み込むことができるため、アプリケーションはディスクを非常に高速に読み取ることができます。バフは書き込みに使用されます。ディスクを開発して書き込む場合、通常はバッファに書き込んでからフラッシュすると非常に高速になります。 Kafka は両方の利点を活用します。Kafka は Scala で記述されていますが、Java 仮想マシン上で実行されます。それにもかかわらず、Kafka は JVM の制限を回避しようとします。ストレージにページ キャッシュを使用するため、GC による JVM 内のデータの STW を回避できます。一方、ページ キャッシュを使用すると、ゼロ コピーも実現できます。これについては、後ほど詳しく説明します。

ゼロコピー

優れた Netty であれ、他の優れた Java フレームワークであれ、基本的にはゼロ コピーによって CPU コンテキストの切り替えとディスク IO を削減します。もちろんカフカも例外ではありません。ゼロコピーの概念についてはここでは詳しくは繰り返しませんが、この概念について簡単に紹介したいと思います。

アプリケーションがデータを要求する従来のプロセス

ここで、従来の方法では、4 つのコピー、2 つの DMA、2 つの CPU が使用され、CPU が 4 回切り替わることが大まかにわかります。 _(DMA は、簡単に言えば、I/O デバイスとメモリ間でデータが転送されるときに、すべてのデータ転送作業が DMA コントローラに引き渡され、CPU はデータ転送に関連する作業には一切関与しなくなります)。

ゼロコピー方式

最適化により、CPU には 2 つのコンテキスト スイッチと 3 つのデータ コピーしかないことがわかります。 (Linux システムでは、システム コール関数「sendfile()」が提供されているため、システム コールは、カーネル バッファー内のデータをユーザー状態にコピーするのではなく、ソケット バッファーに直接コピーできます)。

パーティション分割

上で述べたように、Kafka はパーティショニング モードを採用しており、各パーティションは物理セグメントに対応しており、検索時にはバイナリ検索に基づいて素早く見つけることができます。これにより、データ読み取りクエリの効率が向上するだけでなく、並列操作を行う手段も提供されます。

データ圧縮

Kafka は、データに対して Gzip や Snappy などの圧縮プロトコルを提供します。これにより、メッセージ構造が圧縮され、帯域幅とデータ転送の消費が削減されます。

Kafka のインストール

JDKをインストールする

圧縮パッケージを使用する場合は環境変数を自分で設定する必要があるため、yum を使用して直接インストールすることをお勧めします。現在の Java バージョンを確認する方法を理解しておいてください。

  1. yum -y リスト Java*

必要なバージョンをインストールしてください。ここでは1.8です

  1. yum インストール java-1.8.0-openjdk-devel.x86_64

インストールが成功したか確認する

  1. Java バージョン

Zookeeperをインストールする

まず、公式サイトにアクセスしてインストールパッケージをダウンロードし、解凍する必要があります。

  1. tar -zxvf zookeeper-3.4.9.tar.gz

このファイルをコピーしてzoo.cfgという名前を付け、zoo.cfgで独自の設定を変更するだけです。

  1. cp zoo_sample.cfg zoo.cfg
  2. vim zoo.cfg

主な構成は次のように説明される。

  1. # Zookeeper の基本単位はミリ秒です。つまり、tickTime は 2000 ミリ秒です。他の Zookeeper 構成では、変換は tickTime に基づいて行われます。
  2. ティックタイム=2000
  3. # クラスター内のフォロワー サーバー (F) とリーダー サーバー (L) 間の初期接続中に許容できるハートビートの最大数 (ティックタイムの数)。
  4. 初期制限=10
  5. #syncLimit: クラスター内のフォロワーサーバー (F) とリーダーサーバー (L) 間のリクエストとレスポンスの間で許容できるハートビートの最大数 (ティックタイムの数)
  6. 同期制限=5
  7. #データ保存フォルダ。 Zookeeperの動作中に保存する必要があるデータは2つあります。1つはスナップショットデータ(永続データ)で、もう1つはトランザクションログです。
  8. データディレクトリ=/tmp/zookeeper
  9. ## クライアントアクセスポート
  10. クライアントポート=2181

環境変数の設定

  1. vim ~/.bash_profile
  2. エクスポート ZK=/usr/ローカル/src/apache-zookeeper-3.7.0-bin
  3. エクスポート PATH=$PATH:$ZK/bin
  4. エクスポートPATH
  5. // 起動する
  6. zkServer.sh 開始

以下は起動が成功した例です

Kafkaをインストールする

Kafkaをダウンロード

https://www.apache.org/dyn/closer.cgi?path=/kafka/2.8.0/kafka-2.8.0-src.tgz

Kafkaをインストールする

  1. tar -xzvf kafka_2.12-2.0.0.tgz

環境変数の設定

  1. エクスポート ZK=/usr/ローカル/src/apache-zookeeper-3.7.0-bin
  2. エクスポート PATH=$PATH:$ZK/bin
  3. エクスポート KAFKA=/usr/ローカル/src/kafka
  4. PATH=$PATH:$KAFKA/bin をエクスポートします

Kafkaを起動する

  1. nohup kafka-server-start.sh 独自の設定ファイルパス/server.properties &

完了です!

<<:  クラウドコンピューティング業界のアップグレードを支援するH3Cがクラウドネイティブ変革に関する洞察を共有

>>:  レポート: サーバーレスは多くのソフトウェアスタックの重要な部分となっている

推薦する

メールマーケティングのクリック率を上げる5つのヒント

電子メール マーケティングは、ウェブサイトのトラフィックを増やし、オンライン取引のコンバージョン率を...

#推薦# hostens - 信頼できる業者、大容量ハードドライブ、大容量トラフィック、大容量ストレージ VPS

リトアニアで非常に有名で信頼できる販売業者である Hostens が、超割引価格を開始しました。この...

WeChatロケーションマーケティングの現状と解決策の分析

Weiboマーケティングが増加しており、WeChatマーケティングも本格化しています。しかし、大金を...

ブランドマーケティング手法:ファッションのケース

ファッションブランドの価値は、強調することと隠すことの2つだけです。強調するということは、ファッショ...

myserverplanet-$49/E3-1240V2/16G メモリ/1T ハードディスク/10T トラフィック/G ポート/ロサンゼルス

myserverplanet は、オプションのコンピュータ ルーム 4 台を備えた特別価格のサーバー...

360度検索トラフィックを増やす方法の簡単な分析

360は最近、控えめにリリースされましたが、その影響は控えめではありません。短期間で、多くのウェブサ...

2022年グローバルハイブリッドクラウド開発トレンドレポート

第14次5カ年計画では、デジタル経済における新たな優位性の創出を重視し、ハイブリッドクラウドを中心と...

ユーザーエクスペリエンスを冷静に分析することがウェブサイトの成功の鍵です

最近、当社のウェブサイトに問題が発生しています。落ち着いてウェブサイトのデータ分析を行ったところ、ユ...

Google AdSense で収益につながらない無効なクリックの 10 種類について簡単に説明します。

1. 広告をクリックするために特別に設計された自動クリック プログラムまたはアプリケーションを使用す...

VDI テスト チェックリスト: VDI 展開をテストするための重要な手順

IT プロフェッショナルが VDI を導入する場合、リソースの過剰プロビジョニングや不足プロビジョニ...

ゲームライブストリーミングプラットフォーム:Douyu、Huya競合製品分析レポート

この記事では、著者は両者の違いを分析し、それぞれの焦点を明らかにしようとします。分析の目的Douyu...

tmhhost: 3ネットワークcn2 gia + 200G高防御、240元/四半期、KVM / 1Gメモリ/ 1コア/ 20gSSD / 1Tトラフィック

DDoS 攻撃は、常に人々の悩みの種でした。TMHost は、独自の 200G DDoS 防御 VP...

losangelesvps: $24/E5-2620v2/8g メモリ/120gSSD/1Gbps 帯域幅/無制限トラフィック

losangelesvpsは、主に米国西海岸のロサンゼルス地区で仮想ホスト、VPS、ハイブリッドサー...

Didi の成長の秘密: 最も効果的なチャネルと成長方法を見つけるには?

この記事の著者は、 Didiと Uxin で勤務し、多数の成長事業を担当してきました。製品の成長ロジ...

メガレイヤー:香港 20G 高防御 / 米国 100G 高防御、最低 199 元、E3-1230 / 8G メモリ / 240gSSD または 1T HDD / 30M 帯域幅 (CN2 ネットワーク)

megalayer は、秋学期に向けて特別プロモーションを開始しました。香港独立サーバー、CN2 最...