Debian 9でApache Kafkaデータをバックアップ、インポート、移行する方法

_著者はhttps://www.brightfunds.org/funds/tech-education[Tech Education Fund]を選択して、https://do.co/w4do-cta [Donations for Write]プログラムの一環として寄付を受け取りました。

前書き

Apache Kafkaデータのバックアップは、意図しないデータの損失や、ユーザーエラーのためにクラスターに追加された不正なデータからの回復に役立つ重要なプラクティスです。 クラスタおよびトピックデータのデータダンプは、バックアップおよび復元を実行する効率的な方法です。

バックアップされたデータを別のサーバーにインポートして移行すると、サーバーのハードウェアまたはネットワークの障害によりKafkaインスタンスが使用できなくなり、古いデータで新しいKafkaインスタンスを作成する必要がある場合に役立ちます。 バックアップされたデータのインポートと移行は、リソース使用量の変更によりKafkaインスタンスをアップグレードまたはダウングレードされたサーバーに移動する場合にも役立ちます。

このチュートリアルでは、単一のDebian 9インストールと、別々のサーバー上の複数のDebian 9インストールで、Kafkaデータをバックアップ、インポート、および移行します。 ZooKeeperは、Kafkaの運営の重要なコンポーネントです。 コンシューマーデータ、パーティションデータ、クラスター内の他のブローカーの状態など、クラスターの状態に関する情報を保存します。 そのため、このチュートリアルではZooKeeperのデータもバックアップします。

前提条件

従うには、次のものが必要です。

  • 4GB以上のRAMとhttps://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9に従ってセットアップされた非ルートsudoユーザーを備えたDebian 9サーバー[チュートリアル] 。

  • バックアップのソースとして機能する、Apache KafkaがインストールされたDebian 9サーバー。 Apache KafkaをDebian 9にインストールする方法ガイドに従って、Kafkaインストールをセットアップします。 Kafkaはソースサーバーにまだインストールされていません。

  • サーバーにインストールされているhttp://openjdk.java.net/[OpenJDK] 8。 このバージョンをインストールするには、次のhttps://www.digitalocean.com/community/tutorials/how-to-install-java-with-apt-on-debian-9#installing-the-default-jrejdk [手順]に従ってくださいOpenJDKの特定のバージョンをインストールします。

  • 手順7のオプション-Apache Kafkaがインストールされた別のDebian 9サーバー。バックアップの宛先として機能します。 以前の前提条件の記事リンクに従って、Kafkaを移行先サーバーにインストールします。 この前提条件は、Kafkaデータをあるサーバーから別のサーバーに移動する場合にのみ必要です。 Kafkaデータをバックアップして単一のサーバーにインポートする場合は、この前提条件をスキップできます。

手順1-テストトピックの作成とメッセージの追加

Kafka *メッセージ*は、Kafkaのデータストレージの最も基本的な単位であり、Kafkaに発行およびサブスクライブするエンティティです。 Kafka *トピック*は、関連するメッセージのグループのコンテナのようなものです。 特定のトピックをサブスクライブすると、その特定のトピックに発行されたメッセージのみを受け取ります。 このセクションでは、バックアップするサーバー(ソースサーバー)にログインし、Kafkaトピックとメッセージを追加して、バックアップ用にデータを入力します。

このチュートリアルでは、* kafka *ユーザーのホームディレクトリ( + / home / kafka / kafka +)にKafkaがインストールされていることを前提としています。 インストールが別のディレクトリにある場合、次のコマンドの「+〜/ +」部分をKafkaインストールのパスで変更し、このチュートリアルの残りの部分でコマンドを変更します。

以下を実行して、ソースサーバーにSSH接続します。

ssh @

次のコマンドを実行して、* kafka *ユーザーとしてログインします。

sudo -iu kafka

次のように入力して、Kafkaインストールのbinディレクトリにある「+ kafka-topics.sh 」シェルユーティリティファイルを使用して、「+」という名前のトピックを作成します。

~//bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic

`〜// bin / kafka-console-producer.sh +`シェルユーティリティスクリプトを使用して、文字列 `" Test Message 1 "`を `+`トピックに公開します。

ここにメッセージを追加したい場合は、今すぐ追加できます。

echo "Test Message 1" | ~//bin/kafka-console-producer.sh --broker-list localhost:9092 --topic  > /dev/null

`〜// bin / kafka-console-producer.sh +`ファイルを使用すると、コマンドラインから直接メッセージを公開できます。 通常、プログラム内からKafkaクライアントライブラリを使用してメッセージを公開しますが、プログラミング言語ごとに異なるセットアップが必要なため、テスト中または管理タスクの実行中にメッセージを公開する言語に依存しない方法としてシェルスクリプトを使用できます。 `-topic +`フラグは、メッセージを公開するトピックを指定します。

次に、次のコマンドを実行して、 `+ kafka-console-producer.sh +`スクリプトがメッセージを発行したことを確認します。

~//bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic  --from-beginning

`〜// bin / kafka-console-consumer.sh +`シェルスクリプトは、コンシューマーを起動します。 開始されると、前のコマンドの `" Test Message 1 "`メッセージで公開したトピックからのメッセージをサブスクライブします。 コマンドの「-from-beginning +」フラグを使用すると、コンシューマーが開始される前に発行されたメッセージを消費できます。 フラグを有効にしないと、コンシューマが開始された後に公開されたメッセージのみが表示されます。 コマンドを実行すると、ターミナルに次の出力が表示されます。

OutputTest Message 1

コンシューマを停止するには、 `+ CTRL + C +`を押します。

いくつかのテストデータを作成し、それが保持されていることを確認しました。 これで、次のセクションで状態データをバックアップできます。

ステップ2-ZooKeeper状態データのバックアップ

実際のKafkaデータをバックアップする前に、ZooKeeperに保存されているクラスター状態をバックアップする必要があります。

ZooKeeperは、データを `〜// config / zookeeper.properties +`設定ファイルの ` dataDir `フィールドで指定されたディレクトリに保存します。 バックアップするディレクトリを決定するには、このフィールドの値を読み取る必要があります。 デフォルトでは、 ` dataDir `は ` / `ディレクトリを指します。 インストールで値が異なる場合は、次のコマンドで「 / +」をその値に置き換えます。

`+〜// config / zookeeper.properties`ファイルの出力例は次のとおりです。

〜/ kafka / config / zookeeper.properties

...
...
...
# the directory where the snapshot is stored.
dataDir=/
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
...
...
...

ディレクトリへのパスを取得したので、その内容の圧縮アーカイブファイルを作成できます。 圧縮アーカイブファイルは、ディスク容量を節約するために、通常のアーカイブファイルよりも優れたオプションです。 次のコマンドを実行してください。

tar -czf /home// //*

コマンドの出力「+ tar:メンバー名から先頭の/を削除+」は無視しても問題ありません。

`+ -c `および ` -z `フラグは、アーカイブを作成し、アーカイブにgzip圧縮を適用するように tar に指示します。 ` -f `フラグは、出力圧縮アーカイブファイルの名前を指定します。この場合は `+`です。

現在のディレクトリで `+ ls `を実行すると、出力の一部として `+`が表示されます。

これで、ZooKeeperデータのバックアップが正常に完了しました。 次のセクションでは、実際のKafkaデータをバックアップします。

ステップ3-Kafkaのトピックとメッセージのバックアップ

このセクションでは、前のステップでZooKeeperに対して行ったように、Kafkaのデータディレクトリを圧縮tarファイルにバックアップします。

Kafkaは、トピック、メッセージ、内部ファイルを、 `〜// config / server.properties +`設定ファイルで ` log.dirs `フィールドが指定するディレクトリに保存します。 バックアップするディレクトリを決定するには、このフィールドの値を読み取る必要があります。 デフォルトおよび現在のインストールでは、 ` log.dirs +`は ``ディレクトリを指します。 インストールで値が異なる場合は、次のコマンドの「」を正しい値に置き換えます。

`+〜// config / server.properties`ファイルの出力例を次に示します。

〜/ kafka / config / server.properties

...
...
...
############################# Log Basics #############################

# A comma separated list of directories under which to store log files
log.dirs=

# The default number of log partitions per topic. More partitions allow greater
# parallelism for consumption, but this will also result in more files across
# the brokers.
num.partitions=1

# The number of threads per data directory to be used for log recovery at startup and flushing at shutdown.
# This value is recommended to be increased for installations with data dirs located in RAID array.
num.recovery.threads.per.data.dir=1
...
...
...

まず、Kafkaサービスを停止して、 `+ tar `でアーカイブを作成するときに ` log.dirs `ディレクトリ内のデータが一貫した状態になるようにします。 これを行うには、「 exit +」と入力してサーバーの非ルートユーザーに戻り、次のコマンドを実行します。

sudo systemctl stop kafka

Kafkaサービスを停止した後、* kafka *ユーザーとして再度ログインします。

sudo -iu kafka

Apache Kafkaのインストール前提条件では、セキュリティ上の予防措置として* kafka ユーザーを制限しているため、KafkaおよびZooKeeperサービスを非ルートsudoユーザーとして停止/開始する必要があります。 前提条件のこの手順により、 kafka *ユーザーのsudoアクセスが無効になり、コマンドの実行に失敗します。

次に、次のコマンドを実行して、ディレクトリのコンテンツの圧縮アーカイブファイルを作成します。

tar -czf /home// *

もう一度、コマンドの出力を安全に無視できます( + tar:メンバー名から先頭の/を削除する)。

現在のディレクトリで `+ ls `を実行すると、出力の一部として `+`が表示されます。

データをすぐに復元したくない場合は、「+ exit +」と入力して、ルート以外のsudoユーザーに切り替えてから、Kafkaサービスを再び開始できます。

sudo systemctl start kafka
  • kafka *ユーザーとして再度ログインします。

sudo -iu kafka

Kafkaデータを正常にバックアップしました。 次のセクションに進み、ZooKeeperに保存されているクラスター状態データを復元します。

ステップ4-ZooKeeperデータの復元

このセクションでは、ユーザーがトピックの作成、追加ノードの追加/削除、メッセージの追加と消費などの操作を実行したときに、Kafkaが内部的に作成および管理するクラスター状態データを復元します。 ZooKeeperデータディレクトリを削除し、 `++`ファイルの内容を復元することにより、既存のソースインストールにデータを復元します。 別のサーバーにデータを復元する場合は、手順7を参照してください。

復元プロセス中にデータディレクトリが無効なデータを受信するのを防ぐため、KafkaおよびZooKeeperサービスを停止する必要があります。

最初に、「+ exit +」と入力してKafkaサービスを停止し、非ルートsudoユーザーに切り替えてから実行します:

sudo systemctl stop kafka

次に、ZooKeeperサービスを停止します。

sudo systemctl stop zookeeper
  • kafka *ユーザーとして再度ログインします。

sudo -iu kafka

その後、次のコマンドを使用して、既存のクラスターデータディレクトリを安全に削除できます。

rm -r //*

次に、ステップ2でバックアップしたデータを復元します。

tar -C / -xzf /home// --strip-components 2

「+ -C 」フラグは、データを抽出する前にディレクトリ「 / 」に変更するよう「 tar 」に指示します。 `-strip 2 `フラグを指定して、 ` tar`がアーカイブの内容を別のディレクトリ(` + / tmp / zookeeper / tmp / zookeeper / など)ではなく、 ` // +自体に抽出するようにします)その中。

クラスター状態データが正常に復元されました。 これで、次のセクションのKafkaデータ復元プロセスに進むことができます。

ステップ5-Kafkaデータの復元

このセクションでは、Kafkaデータディレクトリを削除し、圧縮されたアーカイブファイルを復元することにより、バックアップしたKafkaデータを既存のソースインストール(またはオプションの手順7に従っている場合は宛先サーバー)に復元します。 これにより、復元が正常に機能することを確認できます。

次のコマンドを使用して、既存のKafkaデータディレクトリを安全に削除できます。

rm -r *

データを削除したので、Kafkaインストールは、新しいインストールに似ており、トピックやメッセージは含まれていません。 バックアップしたデータを復元するには、次を実行してファイルを抽出します。

tar -C  -xzf /home// --strip-components 2

「+ -C +」フラグは、データを抽出する前にディレクトリ「」に変更するように「+ tar +」に指示します。 `+-strip 2 +`フラグを指定して、アーカイブのコンテンツが別のディレクトリ( `+ / tmp / kafka-logs / kafka-logs / +`など)ではなく、 ``自体に抽出されるようにします。その中。

データを正常に抽出できたので、 `+ exit +`を入力して非ルートsudoユーザーに切り替えてから、KafkaサービスとZooKeeperサービスを再び開始できます。

sudo systemctl start kafka

ZooKeeperサービスを開始するには:

sudo systemctl start zookeeper
  • kafka *ユーザーとして再度ログインします。

sudo -iu kafka

`+ kafka +`データを復元しました。次のセクションで復元が成功したことを確認することに進みます。

ステップ6-復元の検証

Kafkaデータの復元をテストするには、ステップ1で作成したトピックからのメッセージを消費します。

Kafkaが起動するまで数分待ってから、次のコマンドを実行して `++`からメッセージを読み取ります。

~//bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic  --from-beginning

次のような警告が表示された場合、Kafkaが完全に起動するまで待つ必要があります。

Output[2018-09-13 15:52:45,234] WARN [Consumer clientId=consumer-1, groupId=console-consumer-87747] Connection to node -1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

さらに数分前に前のコマンドを再試行するか、非ルートsudoユーザーとして「+ sudo systemctl restart kafka +」を実行します。 復元に問題がない場合は、次の出力が表示されます。

OutputTest Message 1

このメッセージが表示されない場合は、前のセクションのコマンドを逃したかどうかを確認して実行できます。

復元されたKafkaデータを検証したので、これは単一のKafkaインストールでデータを正常にバックアップおよび復元したことを意味します。 手順7に進んで、クラスターとトピックのデータを別のサーバーのインストールに移行する方法を確認できます。

ステップ7-別のKafkaサーバーへのバックアップの移行と復元(オプション)

このセクションでは、バックアップしたデータをソースKafkaサーバーからターゲットKafkaサーバーに移行します。 これを行うには、最初に `+ scp `コマンドを使用して、圧縮された ` tar.gz `ファイルをローカルシステムにダウンロードします。 次に、 ` scp +`を使用して、ファイルを宛先サーバーにプッシュします。 移行先サーバーにファイルが存在する場合、以前に使用した手順に従ってバックアップを復元し、移行が成功したことを確認できます。

バックアップファイルをローカルにダウンロードし、ソースサーバーからターゲットサーバーに直接コピーするのではなく、ターゲットサーバーにアップロードします。これは、ターゲットサーバーの `+ / home //。sshにソースサーバーのSSHキーがないためです。 / authorized_keys + `ファイル。ソースサーバーとは接続できません。 ただし、ローカルマシンは両方のサーバーに接続できるため、ソースサーバーから宛先サーバーへのSSHアクセスを設定する追加の手順を省くことができます。

次を実行して、ローカルマシンに「」および「」ファイルをダウンロードします。

scp @:/home// .

次のような出力が表示されます。

Output                                                                                                  100%   68KB 128.0KB/s   00:00

次のコマンドを実行して、 `++`ファイルをローカルマシンにダウンロードします。

scp @:/home// .

次の出力が表示されます。

Output                                                                                                       100% 1031KB 488.3KB/s   00:02

ローカルマシンの現在のディレクトリで `+ ls +`を実行すると、両方のファイルが表示されます:

Output

次のコマンドを実行して、 `+`ファイルを宛先サーバーの ` / home // +`に転送します。

scp  @:/home//

次のコマンドを実行して、 `+ kafka-backup.tar.gz `ファイルを宛先サーバーの ` / home // +`に転送します。

scp  @:/home//

バックアップファイルが移行先サーバーに正常にアップロードされました。 ファイルは `+ / home // `ディレクトリにあり、* kafka *ユーザーによるアクセスのための適切なアクセス許可がないため、ファイルを ` / home // +`ディレクトリに移動し、それらを変更できます。許可。

次を実行して、宛先サーバーにSSHで接続します。

ssh @

次を実行して、 `+`を ` / home // +`に移動します。

sudo mv  /home//

同様に、次のコマンドを実行して、「+」を「 / home // +」にコピーします。

sudo mv  /home//

次のコマンドを実行して、バックアップファイルの所有者を変更します。

sudo chown kafka /home// /home//

以前の「+ mv 」および「 chown +」コマンドは出力を表示しません。

バックアップファイルが正しいディレクトリの宛先サーバーに存在するようになったので、このチュートリアルのステップ4〜6にリストされているコマンドに従って、宛先サーバーのデータを復元および検証します。

結論

このチュートリアルでは、同じインストールと別のサーバーへのインストールの両方から、Kafkaのトピックとメッセージをバックアップ、インポート、および移行しました。 Kafkaの他の便利な管理タスクについて詳しく知りたい場合は、Kafkaの公式ドキュメントのhttp://kafka.apache.org/documentation/#operations[operations]セクションをご覧ください。

`+ zookeeper-backup.tar.gz `や ` kafka-backup.tar.gz +`などのバックアップファイルをリモートで保存するには、https://www.digitalocean.com/docs/spaces/ [DigitalOcean Spaces ]。 サーバーで実行されている唯一のサービスがKafkaである場合は、フルインスタンスhttps://www.digitalocean.com/docs/images/backups/how-to/[backups]などの他のバックアップ方法も検討できます。