Kafka のアーキテクチャと動作原理の図解

Kafka のアーキテクチャと動作原理の図解

[[438966]]

1. Kafkaを理解する

インタビュアーが質問しました: Kafka とは何ですか?それは何に使われますか?

公式の定義は次のとおりです。

Kafka は、リアルタイム データ パイプラインとストリーミング アプリの構築に使用されます。水平方向にスケーラブルで、フォールト トレラント、非常に高速であり、何千もの企業で実稼働されています。

直訳すると、水平展開可能で信頼性の高いリアルタイムデータ処理システムということです!

リアルタイムデータ処理は名前から簡単に理解できます。データをリアルタイムで処理することを意味します。現在普及しているマイクロサービス開発において、最も一般的に使用されているリアルタイム データ処理プラットフォームは、RabbitMQ や RocketMQ などのメッセージ ミドルウェアです。

これらのミドルウェアには主に 2 つの機能があります。

  • サービスの分離
  • 交通ピークカット

Web アプリケーション開発の初期には、リクエスト数が急増したときに、処理するデータをキュー チャネルにプッシュし、別のスレッドを開始してキュー内のデータを継続的にローテーションおよびプルすることで、プログラムの実行効率を高めていました。

ただし、リクエストの数が増加し続け、キュー チャネル内のデータが常に高負荷状態になると、アプリケーションのメモリ使用量が非常に高くなります。注意しないと、メモリが不足し、プログラム メモリのオーバーフローが発生し、サービスが利用できなくなります。

ビジネス量が拡大し続けると、このモデルではアプリケーション内のニーズを満たすことができなくなります。そのため、ActiveMQ、RabbitMQ、RocketMQなどのさまざまなメッセージミドルウェアが誕生しました。

このモデルの本質は、プッシュされるデータが現在のアプリケーションのメモリに保存されるのではなく、データ処理を専門に担当する別のアプリケーションに保存され、それによってサービス分離が実現されることです。

メッセージ ミドルウェア: 主な役割は、メッセージを受信して​​ディスクに保存できるようにすることです。他のサービスに障害が発生しても、データは失われません。データ消費量を監視することもできます。

アプリケーション: メッセージをメッセージ ミドルウェアにプッシュし、スレッドがメッセージ ミドルウェアから継続的にデータをプルして消費を確認できるようにします。

メッセージ ミドルウェアの導入後は、サービス開発全体が簡素化され、全員が自分のタスクに責任を持つようになります。

Kafka は本質的にはメッセージ ミドルウェアの一種です。 Kafka は LinkedIn から生まれ、2010 年に GitHub にオープンソース化されました。

データ パイプラインの問題を解決するために、LinkedIn の開発チームは 2010 年頃にデータ交換に ActiveMQ を最初に採用しました。当時、ActiveMQ は LinkedIn のデータ転送システムの要件を満たすにはほど遠いものでした。さまざまな欠陥により、メッセージがブロックされたり、サービスが利用できなくなったりすることがよくありました。この問題を解決するために、LinkedIn は独自のメッセージング システムを開発することを決定し、Kafka が誕生しました。

LinkedIn では、Kafka は 1 日あたり数十億件のメッセージのメトリックとユーザー アクティビティの追跡を効果的に処理できます。その強力な処理能力は業界で認められ、ビッグデータ パイプラインの推奨テクノロジーとなっています。

2. アーキテクチャの紹介

まずは写真を見てみましょう。下の図は、Kafka の生成と消費のコア アーキテクチャ モデルです。

これらの概念を理解していなくても問題ありません。一緒に説明します。

  • プロデューサー: プロデューサーはプロデューサーであり、メッセージのプロデューサーであり、メッセージのエントリポイントです。
  • ブローカー: ブローカーは Kafka インスタンスです。各サーバーには 1 つ以上の Kafka インスタンスがあります。簡単に言えば、Kafka サーバーです。 Kafka クラスターはクラスターを意味します。
  • トピック: メッセージの件名。メッセージ キューとして理解できます。 Kafka データはトピックに保存されます。各ブローカーで複数のトピックを作成できます。
  • パーティション: トピック パーティション。各トピックには複数のパーティションを含めることができます。パーティションの役割は、ロードを実行し、Kafka のスループットを向上させることです。異なるパーティション内の同じトピックのデータは重複せず、パーティションは 1 つずつフォルダーで表されます。
  • レプリケーション: 各パーティションには複数のレプリカがあります。レプリカの役割はバックアップとして機能することです。プライマリ パーティション (リーダー) は、スレーブ パーティション (フォロワー) にデータを同期します。プライマリ パーティション (リーダー) に障害が発生すると、バックアップ パーティション (フォロワー) が選択され、引き継いでリーダーになります。 Kafka のレプリカのデフォルトの最大数は 10 であり、レプリカの数はブローカーの数より大きくすることはできません。フォロワーとリーダーは必ず異なるマシン上に存在し、同じマシンには同じパーティションのレプリカを 1 つだけ保存できます。
  • メッセージ: 送信された各メッセージの本文。
  • コンシューマー: コンシューマーはメッセージの消費者であり、メッセージの出口です。
  • コンシューマー グループ: 複数のコンシューマー グループを 1 つのコンシューマー グループに結合できます。 Kafka の設計では、同じパーティション内のデータは、コンシューマー グループ内の 1 つのコンシューマーのみが使用できます。同じコンシューマー グループ内のコンシューマーは、同じトピックの異なるパーティションからデータを消費できるため、Kafka のスループットも向上します。
  • Zookeeper: Kafka クラスターは、システムの可用性を確保するために、クラスターのメタデータを保存するために Zookeeper に依存しています。

つまり、Kafka は本質的にメッセージング システムです。ほとんどのメッセージング システムと同様に、その主な機能は次のとおりです。

  • プッシュプルモデルを使用して生産者と消費者を分離する
  • メッセージングシステム内のメッセージデータの永続性を提供し、複数の消費者が
  • 高可用性クラスタサービス、マスタースレーブモードを提供し、水平拡張をサポートします。

ActiveMQ、RabbitMQ、RocketMQ との違いは、パーティションの概念があることです。

このパーティションは、作成するトピックに 5 つのパーティションがある場合、一度に 1,000 個のデータを Kafka にプッシュすると、これらの 1,000 個のデータはデフォルトで 5 つのパーティションに分散され、各パーティションに 200 個のデータが格納されることを意味します。

これを行う目的は、消費者がさまざまなパーティションからデータを簡単に取得できるようにすることです。同時に 5 つのスレッドを開始してデータをプルすると、各スレッドが 1 つのパーティションをプルするため、消費速度が非常に速くなります。

これが Kafka と他のメッセージング システムの最大の違いです。

2.1 データの送信

他のミドルウェアと同様に、Kafka は毎回リーダー パーティションにデータを送信し、それをディスクに順番に書き込みます。次に、リーダー パーティションはデータを各フォロワー パーティションに同期します。マスター パーティションに障害が発生しても、サービスの正常な動作には影響しません。

では、Kafka はどのようにして対応するパーティションにデータを書き込むのでしょうか? Kafka には次の原則があります。

  • 1. データを書き込む際に、書き込むパーティションを指定できます。指定されている場合は、対応するパーティションに書き込みます
  • 2. パーティションが指定されていないが、データのキーが設定されている場合は、キー値に従ってパーティションがハッシュ化されます。
  • 3. パーティションが指定されておらず、キーも設定されていない場合は、ポーリングによってパーティションが選択されます。

2.2 消費データ

プロデューサーと同様に、コンシューマーが Kafka クラスターからメッセージをアクティブにプルすると、リーダー パーティションからデータもプルされます。

ここでは、「消費者グループ」という用語に注目する必要があります。

複数のコンシューマーのシナリオを考慮して、Kafka は複数のコンシューマーを持つコンシューマー グループを形成するように設計できます。同じコンシューマー グループ内のコンシューマーは、同じトピックの下にある異なるパーティションからのデータを消費できます。重複した消費を防ぐために、同じパーティションはコンシューマー グループ内のコンシューマーによってのみ消費されます。

ただし、異なるグループが同じパーティションからデータを消費する可能性があります。

これを次のように理解することができます。コンシューマー グループはクライアントであり、メッセージの消費を高速化するために、クライアントは多くのコンシューマーで構成できます。

ただし、グループ内のコンシューマーの数がパーティションの数より多い場合、多くのコンシューマーがアイドル状態になります。

パーティションの数がグループ内のコンシューマーの数より多い場合、1 人のコンシューマーが複数のパーティションの消費を担当することになり、消費パフォーマンスが不均一になります。

したがって、実際のアプリケーションでは、コンシューマー グループ内のコンシューマーの数をパーティションの数と一致させることが推奨されます。

3. Kafkaのインストール

ただ理論を語っても無駄だ。 Centos7 を例に、kafka のインストールと使用方法を紹介します。

Kafka では、サービス インスタンスのメタデータを保存するために zookeeper が必要なので、kafka をインストールする前に、まず zookeeper をインストールする必要があります。

3.1. ZooKeeperをインストールする

Zookeeperのインストール環境はjdkに依存しているため、事前にjdkをインストールする必要があります。

  1. # jdk1.8をインストール
  2. yum -y java-1.8.0-openjdk をインストールします

Zookeeperをダウンロードし、ファイルパッケージを解凍します。

  1. #zookeeperをオンラインでダウンロード
  2. http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.12/zookeeper-3.4.12.tar.gz を取得します。
  3. #解凍
  4. tar -zxvf zookeeper-3.4.12.tar.gz

データとログのディレクトリを作成する

  1. #データとログを保存するためのディレクトリを作成する
  2. cd /usr/zookeeper/
  3. mkdirデータ
  4. mkdir ログ
  5. #conf の下にある zoo_sample.cfg ファイルをバックアップし、名前を zoo.cfg に変更します。
  6. cd conf/
  7. cp zoo_sample.cfg zoo.cfg

ZooKeeper を構成する

  1. #zoo.cfgファイルを編集する
  2. vim zoo.cfg

dataDirとdataLogDirのストレージパスを再構成する

最後に、Zookeeperサービスを開始します

  1. #Zookeeperのbinディレクトリに入る
  2. cd zookeeper/zookeeper-3.4.12/bin
  3. #Zookeeper を起動する
  4. ./zkServer.sh 開始
  5. #Zookeeper のステータスを照会する
  6. ./zkServer.sh ステータス
  7. #飼育係のステータスを閉じる
  8. ./zkServer.sh 停止

3.2. Kafkaをインストールする

公式 Web サイト http://kafka.apache.org/downloads.html にアクセスして、必要なバージョンをダウンロードしてください。最新の安定バージョン 2.8.0 をダウンロードしました。

  1. #kafkaインストールパッケージをダウンロードする
  2. https://apache.osuosl.org/kafka/2.8.0/kafka-2.8.0-src.tgz を取得します。
  3. # ファイルパッケージを解凍する
  4. tar -xvf kafka-2.8.0-src.tgz

必要に応じて構成ファイル server.properties を変更します (オプション)

  1. #設定フォルダに入る
  2. kafka-2.8.0-src/config をコピーします
  3. #server.propertiesを編集する
  4. vim サーバーのプロパティ

server.properties ファイルの内容は次のとおりです。

  1. ブローカーID=0
  2. リスナー=プレーンテキスト://localhost:9092
  3. ネットワークスレッド数=3
  4. スレッド数=8
  5. ソケット送信バッファバイト数=102400
  6. ソケット受信バッファバイト数=102400
  7. ソケットリクエスト最大バイト数 = 104857600
  8. log.dirs=/tmp/kafka-logs
  9. パーティション数=1
  10. データディレクトリあたりの回復スレッド数=1
  11. オフセット.トピック.レプリケーション.係数=1
  12. トランザクション状態ログレプリケーション係数=1
  13. トランザクション.state.log。最小.isr=1
  14. ログ保持時間=168
  15. ログセグメントバイト=1073741824
  16. log.retention.check.interval.ms =300000
  17. zookeeper.connect =ローカルホスト:2181
  18. 動物園の飼育員。接続.timeout.ms=6000
  19. グループ.initial.rebalance.delay.ms=0

重要なパラメータは 4 つあります。

  • broker.id: 一意のID
  • listeners=PLAINTEXT://localhost:9092: kafka サービスのリスニング アドレスとポート
  • log.dirs: ログ保存ディレクトリ
  • zookeeper.connect: zookeeperサービスのアドレスを指定します

必要に応じて対応する構成を変更できます。

3.3. Kafkaサービスを開始する

  1. # binスクリプトディレクトリに入る
  2. kafka-2.8.0-src/bin をコピーします

Kafkaサービスを開始する

  1. nohup kafka-server-start.sh ../config/server.properties server.log 2> server.err &

3.4.トピックを作成する

パーティションが 1 つだけ含まれ、レプリカが 1 つだけある testTopic というトピックを作成します。

  1. # binスクリプトディレクトリに入る
  2. kafka-2.8.0-src/bin をコピーします
  3. #トピックを作成する
  4. kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testTopic

トピックを表示するには、list topic コマンドを実行します。

  1. # binスクリプトディレクトリに入る
  2. kafka-2.8.0-src/bin をコピーします
  3. #現在のkafkaのすべてのトピックをクエリする
  4. kafka-topics.sh --list --zookeeper ローカルホスト:2181

出力:

  1. テストトピック

3.5 メッセージの送信

Kafka には、ファイルまたは標準入力から入力を受け取り、それをメッセージとして Kafka クラスターに送信するコマンドライン クライアントが付属しています。デフォルトでは、各行は個別のメッセージとして送信されます。

プロデューサーを実行し、コンソールにメッセージを入力してサーバーに送信します。

  1. # binスクリプトディレクトリに入る
  2. kafka-2.8.0-src/bin をコピーします
  3. #プロデューサーを実行し、testTopicトピックにメッセージを送信します
  4. kafka-console-producer.sh --broker-list localhost:9092 --topic テストトピック

2 つの項目を入力して Enter キーを押します。

  1. こんにちは、カフカ!
  2. これはメッセージです

3.5.メッセージの受信

Kafka には、メッセージを標準出力にダンプするコマンドライン コンシューマーもあります。

  1. # binスクリプトディレクトリに入る
  2. kafka-2.8.0-src/bin をコピーします
  3. #testTopic トピックからメッセージをプルするコンシューマーを実行します
  4. kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic testTopic --from-beginning

出力は次のようになります。

  1. こんにちは、カフカ!
  2. これはメッセージです

IV.まとめ

この記事では主に、Kafka のアーキテクチャ モデルとインストール環境について予備的な概要を説明します。誤解が生じるのは避けられません。ネットユーザーの皆様は批判や苦情を歓迎します。

スペースの制約により、Java 環境での Kafka の適用シナリオについては、次の記事で詳しく紹介します。

5. 参考

1. Zhihu - Javaリーダー - 30分でKafkaの仕組みがわかる

<<:  クラウド移行の危険を回避するための 2 つの事例

>>:  Azure Kubernetes 構築シナリオ アプリケーションに関するワンストップ ディスカッション

推薦する

美しいウェブマスターの陳思雨:SEOの悪循環から抜け出す

私はこの業界に長くいるわけではありません。せいぜい、SEO の愛好家であり学習者としか考えられません...

Ramnode-新年のオファー/VPS 55% オフ (期限切れ)

Ramnode は新年に向けて VPS 55% オフの割引コード NEWYEAR45 をリリースしま...

中国のインテリジェント化と技術革新ハイレベルセミナーが北京で開催され、「中国クラウドコンピューティング産業の発展に関する白書」が正式に発表されました

デジタル経済の波は止められない勢いで世界を席巻しています。第5世代移動通信技術(5G)、クラウドコン...

totyun: カンボジアCN2 VPSの簡単なレビュー、中国電信の双方向CN2、中国聯通と中国移動も最適化されている

Totyunは今年9月にカンボジアデータセンターでカンボジアVPSをすでに立ち上げており、カンボジア...

Baidu SEO と Google SEO には違いがありますか?ザックは、検索エンジンは良いウェブサイトを好むと言った。

百度がネガティブなニュースに登場するたびに、多くの人がグーグルを懐かしみ、グーグルが来てくれたら最高...

年間無制限トラフィック VPS 統計、無制限トラフィック VPS の推奨事項

多くの人は、大トラフィックの VPS (できればトラフィック無制限の VPS) を必要としています。...

政府のクラウドは伝染病の予防と制御に役立ち、クラウドベースの監視と信頼のメカニズムがより重要になる

2020年の初め、新型コロナウイルス感染症の流行が拡大し、人々の日常生活、仕事、学習も大きな影響を受...

UEO はウェブサイトのキーワードランキングの未来でしょうか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますまず、タイ...

ソフト記事を台無しにしたのは誰?ソフト記事の最適化効果を解放する方法

ソフト記事はかつて、多くのウェブマスターやマーケティングの専門家から高く評価されていました。アイデア...

康生戴志康:個人のウェブマスターが世界を征服する時代は終わった

右は康盛社社長の戴志康氏(Weibo)(写真提供:テンセントテクノロジー)テンセントテクノロジーニュ...

#NationalDay# Dogyun: 全品30%オフ、すべてのハイエンドcn2/cu2ライン、香港、韓国、日本、米国などの13のデータセンター。

Dogyun (Dog Cloud) は、建国記念日の特別プロモーションを実施します。すべてのエラス...

電子商取引ライブストリーミング業界の3つの現状

12月28日、一部のメディアはヴィヤの夫である董海鋒氏の写真を撮影しており、現在は彼がヴィヤのその後...

クラウド コンピューティング プロフェッショナルのための新年の抱負

まず第一に、私は新年の抱負を立てることにあまり興味がありません。私の意見では、1月1日に決意を固める...

今後のフェスティバルでマーケティングとブランドの影響力を高めるにはどうすればよいでしょうか?

ホリデー マーケティングは新しい話題ではありません。ホリデー プロモーションがあるときは、友人がヨー...

集中することが正解です。自分の「小さくて美しい」ウェブサイトを構築する方法についてお話ししましょう。

最近、「小さくて美しい」という言葉が流行っています。タオバオでは、この言葉の普及に力を入れており、多...