この記事では、Ubuntu 22.04.2 LTS 環境で Kafka+Telegraf+CnosDB によるストリーミング データの同期リアルタイム取得および保存ソリューションを実装する方法を主に紹介します。この操作では、CnosDB のバージョンは 2.3.0、Kafka のバージョンは 2.5.1、Telegraf のバージョンは 1.27.1 です。
ますます多くのアプリケーション アーキテクチャがマイクロサービスまたはサーバーレス構造に移行するにつれて、アプリケーションとサービスの数は日々増加しています。ユーザーは、リアルタイムの集計、または測定値やメトリクスを出力とする計算を通じて、増加する量の時系列データを処理できます。生成される大量のデータに直面して、ユーザーはさまざまな方法でシステム内のデータの変化をキャプチャおよび観察できますが、クラウドネイティブ環境では、最も一般的な方法はイベントを使用することです。
Apache Kafka は、分散ストリーム処理プラットフォームともみなされる、耐久性のある高性能メッセージング システムです。メッセージング、データ統合、ログ集計、メトリクスなどの多くのユースケースに適用できます。また、メトリクスに関しては、メッセージ バックボーンやブローカーだけでは十分ではありません。Apache Kafka は耐久性がありますが、メトリクスの実行やクエリの監視を目的として設計されていません。これがまさに CnosDB の強みです。
建築計画
Kafka、Telegraf、CnosDB を組み合わせることで、データの完全なプロセスを実現できます。
- データ生成: センサー、デバイス、またはその他のデータ ソースを使用してデータを生成し、Kafka トピックに送信します。
- Kafka メッセージ キュー: Kafka はデータ ストリームを受信して保存し、データのセキュリティと信頼性を確保します。
- Telegraf コンシューマ: Telegraf は Kafka のコンシューマとして、Kafka トピックをサブスクライブし、データ ストリームを取得します。
- CnosDB データ ストレージ: 前処理されたデータは、時系列データの保存のために Telegraf によって CnosDB に送信されます。
全体的なアプリケーション アーキテクチャを次の図に示します。
カフカ
Apache Kafka は、オープン ソースの分散ストリーム処理プラットフォームであり、リアルタイム データ ストリームを処理するように設計されており、高信頼性、高スループット、低遅延の特性を備えており、現在ほとんどの企業で使用されています。次のようなさまざまな方法で使用できます。
- ストリーム処理: 集約、強化、および処理のためにリアルタイム イベントを保存することにより、イベント バックボーンを提供します。
- メトリクス: Apache Kafka は、マイクロサービスなど、多くの分散コンポーネントやアプリケーションの中心的な集約ポイントになります。これらのアプリケーションは、CnosDB などの他のプラットフォームで使用するためにリアルタイム メトリクスを送信できます。
- データ統合: データとイベントの変更をキャプチャして Apache Kafka に送信し、変更に基づいて動作する必要があるアプリケーションで使用できます。
- ログの集約: Apache Kafka は、ログ ストリーミング プラットフォームのメッセージ バックボーンとして機能し、ログ ブロックをデータ ストリームに変換します。
いくつかの核となる概念
- インスタンス (ブローカー): Kafka のブローカーは、Kafka クラスター内のサーバー ノードであり、メッセージの保存と転送を担当し、高可用性、フォールト トレランス、および信頼性を提供します。
- トピック: Apache のトピック Kafka は、リレーショナル データベースのテーブルと同様の論理ストレージ ユニットです。トピックはパーティションを介してブローカーを通じて分散され、スケーラビリティと復元力を提供します。
- プロデューサー: プロデューサーは、Kafka の指定されたトピックにメッセージをパブリッシュします。プロデューサーは、メッセージを特定のパーティションに送信するか、Kafka に配布戦略を自動的に決定させるかを選択できます。
- コンシューマ: コンシューマは、指定されたトピックの 1 つ以上のパーティションからメッセージを読み取ります。コンシューマは、ユニキャスト、マルチキャスト、コンシューマ グループなど、さまざまな方法で編成できます。
- パブリッシュ/サブスクライブ モデル: プロデューサが 1 つ以上のトピックにメッセージをパブリッシュし、コンシューマが 1 つ以上のトピックをサブスクライブし、そこからメッセージを受信して処理できることを意味します。
簡単に言えば、クライアントが Apache Kafka クラスター インスタンスにデータを送信するときは、それをトピックに送信する必要があります。
さらに、クライアントが Apache Kafka クラスターからデータを読み取るときは、トピックから読み取る必要があります。Apache Kafka にデータを送信するクライアントはプロデューサーになり、Kafka クラスターからデータを読み取るクライアントはコンシューマーになります。データ フロー図は次のとおりです。
注: ここでは、トピック パーティション、オフセット、コンシューマ グループなどのより複雑な概念は紹介しません。ユーザーは、公式ガイダンス ドキュメントを参照して以下を学ぶことができます。
カフカ:【https://kafka.apache.org/documentation/#gettingStarted】
部署 Kafka
Kafka をダウンロードしてインストールします [https://kafka.apache.org/]
1. 前提条件: JDK 環境と Zookeeper 環境があることを確認する必要があります。ない場合は、次のコマンドを使用してインストールできます。
sudo apt install openjdk-8-jdk
sudo apt install zookeeper
2. Kafka インストール パッケージをダウンロードして解凍します。
wget https://archive.apache.org/dist/kafka/2.5.1/kafka_2.12-2.5.1.tgz
tar -zxvf kafka_2.12-2.5.1.tgz
3. 解凍された Kafka ディレクトリに移動します。
cd kafka_2.12-2.5.1
4. $KAFKA_HOME/config/server.properties の構成ファイルを変更します (ポート、ログ パス、およびその他の構成情報は必要に応じて変更できます)
5. 保存してエディタを閉じます。次のコマンドを実行して Kafka を起動します。
bin/kafka-server-start.sh config/server.properties
Kafka はバックグラウンドで実行され、デフォルトのポート 9092 を介して接続を待機します。
電信
Telegraf は、システムおよびアプリケーションのメトリクス データを収集、処理、送信するために使用されるオープン ソース サーバー エージェントです。Telegraf はさまざまな入出力プラグインをサポートしており、さまざまな種類のシステムやサービスと統合できます。システム統計、ログ ファイル、API インターフェイス、メッセージ キューなどの複数のソースからインジケーター データを収集し、CnosDB、Elasticsearch、Kafka、Prometheus などのさまざまなターゲットに送信できます。これにより、Telegraf は非常に柔軟になり、さまざまな監視およびデータ処理シナリオに適応できるようになります。
- 軽量: Telegraf は、比較的少ないシステム リソースを消費し、さまざまな環境で効率的に実行できる軽量エージェントとして設計されています。
- プラグイン ドライバー: Telegraf はプラグインを使用して、さまざまな入出力機能をサポートします。多数のシステムやサービスをカバーする豊富なプラグイン エコシステムを提供します。ユーザーは、インジケーター データを収集および送信するための独自のニーズに応じて、適切なプラグインを選択できます。
- データ処理と変換: Telegraf は柔軟なデータ処理と変換機能を備えており、収集した指標データをプラグイン チェーン (プラグイン チェーン) を通じてフィルター、加工、変換、集計することができ、より正確で高度なデータ分析を提供します。
Telegraf の導入
1. Telegraf をインストールする
sudo apt-get update && sudo apt-get install telegraf
2. Telegraf のデフォルト設定ファイルがあるディレクトリ /etc/telegraf に切り替えます。
3. ターゲットの OUTPUT PLUGIN を設定ファイル telegraf.config に追加します。
[[outputs.http]]
url = "http://127.0.0.1:8902/api/v1/write?db=telegraf"
timeout = "5s"
method = "POST"
username = "root"
password = ""
data_format = "influx"
use_batch_format = true
content_encoding = "identity"
idle_conn_timeout = 10
必要に応じて変更するパラメータ:
url:CnosDB 地址和端口
username:连接 CnosDB 的用户名
password:连接 CnosDB 的用户名对应的密码
注: 残りのパラメータは、上記の構成例と同じままにすることができます。
4. 構成ファイル内の次の構成コメントを解放し、必要に応じて変更します。
[[inputs.kafka_consumer]]
brokers = ["127.0.0.1:9092"]
topics = ["oceanic"]
data_format = "json"
パラメータ:
brokers:Kafka 的 broker list
topics:指定写入 Kafka 目标的 topic
data_format:写入数据的格式
注: 残りのパラメータは、上記の構成例と同じままにすることができます。
5. Telegrafを開始する
telegraf -config /etc/telegraf/telegraf.conf
CnosDB
CnosDB のデプロイ
詳しい操作方法は「CnosDBのインストール」を参照してください。
【https://docs.cnosdb.com/zh/latest/start/install.html】
統合する
カフカがトピックを作成します
1.kafkaのbinフォルダーに入る
2. コマンドを実行してトピックを作成します
./kafka-topics.sh --create --topic oceanic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
Python は Kakfa へのデータの書き込みをシミュレートします
1.コードを書きます:
import time
import json
import random
from kafka import KafkaProducer
def random_pressure():
return round(random.uniform(0, 10), 1)
def random_tempreture():
return round(random.uniform(0, 100), 1)
def random_visibility():
return round(random.uniform(0, 100), 1)
def get_json_data():
data = {}
data["pressure"] = random_pressure()
data["temperature"] = random_temp_cels()
data["visibility"] = random_visibility()
return json.dumps(data)
def main():
producer = KafkaProducer(bootstrap_servers=['ip:9092'])
for _ in rang(2000):
json_data = get_json_data()
producer.send('oceanic', bytes(f'{json_data}','UTF-8'))
print(f"Sensor data is sent: {json_data}")
time.sleep(5)
if __name__ == "__main__":
main()
2. Python スクリプトを実行します。
python3 test.py
Kafka トピックでデータを表示する
1. 以下のコマンドを実行して、指定したトピックデータを表示します。
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic oceanic --from-beginning
CnosDB に同期されたデータを表示する
1. ツールを使用して CnosDB に接続します
cnosdb-cli
2. 指定したライブラリに切り替えます
\c public
3. データを表示する
select * from kafka_consumer;
追加の読み物
1. Telegraf を使用してデータを収集し、CnosDB に書き込みます。
https://docs.cnosdb.com/zh/latest/versatility/collect/telegraf.html
2.Python コネクタ:
https://docs.cnosdb.com/zh/latest/reference/connector/python.html
3.CnosDB クイック スタート:
https://docs.cnosdb.com/zh/latest/start/quick_start.html