Comment sauvegarder, importer et migrer vos données Apache Kafka sur Ubuntu 18.04

L'auteur a sélectionnéTech Education Fund pour recevoir un don dans le cadre du programmeWrite for DOnations.

introduction

La sauvegarde de vos donnéesApache Kafka est une pratique importante qui vous aidera à récupérer d'une perte de données involontaire ou de données incorrectes ajoutées au cluster en raison d'une erreur de l'utilisateur. Les sauvegardes de données de cluster et de sujet sont un moyen efficace d’effectuer des sauvegardes et des restaurations.

L'importation et la migration de vos données sauvegardées sur un serveur séparé sont utiles dans les cas où votre instance Kafka devient inutilisable en raison de pannes matérielles du serveur ou de la mise en réseau et que vous devez créer une nouvelle instance Kafka avec vos anciennes données. L'importation et la migration de données sauvegardées sont également utiles lorsque vous déplacez l'instance Kafka vers un serveur mis à niveau ou déclassé en raison d'une modification de l'utilisation des ressources.

Dans ce didacticiel, vous allez sauvegarder, importer et migrer vos données Kafka sur une seule installation d'Ubuntu 18.04 ainsi que sur plusieurs installations d'Ubuntu 18.04 sur des serveurs distincts. ZooKeeper est un élément essentiel du fonctionnement de Kafka. Il stocke des informations sur l'état du cluster, telles que les données de consommation, les données de partition et l'état des autres courtiers du cluster. En tant que tel, vous sauvegarderez également les données de ZooKeeper dans ce didacticiel.

Conditions préalables

Pour suivre, vous aurez besoin de:

  • Un serveur Ubuntu 18.04 avec au moins 4 Go de RAM et un utilisateur sudo non root configuré en suivantthe tutorial.

  • Un serveur Ubuntu 18.04 avec Apache Kafka installé, servant de source à la sauvegarde. Suivez le guideHow To Install Apache Kafka on Ubuntu 18.04 pour configurer votre installation Kafka, si Kafka n'est pas déjà installé sur le serveur source.

  • OpenJDK 8 installé sur le serveur. Pour installer cette version, suivez cesinstructions sur l'installation de versions spécifiques d'OpenJDK.

  • Facultatif pour l'étape 7 - Un autre serveur Ubuntu 18.04 avec Apache Kafka installé, pour agir comme destination de la sauvegarde. Suivez le lien de l'article dans les conditions préalables précédentes pour installer Kafka sur le serveur de destination. Cette condition préalable est requise uniquement si vous déplacez vos données Kafka d’un serveur à un autre. Si vous souhaitez sauvegarder et importer vos données Kafka sur un seul serveur, vous pouvez ignorer cette condition préalable.

[[step-1 -—- creating-a-test-topic-and-added-messages]] == Étape 1 - Création d'un sujet de test et ajout de messages

Un Kafkamessage est l'unité de stockage de données la plus basique dans Kafka et c'est l'entité sur laquelle vous publierez et vous abonnerez à partir de Kafka. Un Kafkatopic est comme un conteneur pour un groupe de messages associés. Lorsque vous vous abonnez à un sujet particulier, vous ne recevez que les messages publiés dans ce sujet particulier. Dans cette section, vous allez vous connecter au serveur que vous souhaitez sauvegarder (le serveur source) et ajouter un sujet Kafka et un message afin que vous disposiez de certaines données pour la sauvegarde.

Ce tutoriel suppose que vous avez installé Kafka dans le répertoire personnel de l'utilisateurkafka (/home/kafka/kafka). Si votre installation se trouve dans un répertoire différent, modifiez la partie~/kafka dans les commandes suivantes avec le chemin d’installation de Kafka et pour les commandes dans le reste de ce didacticiel.

SSH sur le serveur source en exécutant:

ssh sammy@source_server_ip

Exécutez la commande suivante pour vous connecter en tant qu'utilisateurkafka:

sudo -iu kafka

Créez une rubrique nomméeBackupTopic à l'aide du fichier utilitaire shellkafka-topics.sh dans le répertoire bin de votre installation Kafka, en tapant:

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

Publiez la chaîne"Test Message 1" dans la rubriqueBackupTopic à l'aide du script de l'utilitaire shell~/kafka/bin/kafka-console-producer.sh.

Si vous souhaitez ajouter des messages supplémentaires ici, vous pouvez le faire maintenant.

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

Le fichier~/kafka/bin/kafka-console-producer.sh vous permet de publier des messages directement depuis la ligne de commande. En règle générale, vous publiez des messages à l'aide d'une bibliothèque cliente Kafka à partir de votre programme. Toutefois, comme cela implique différentes configurations pour différents langages de programmation, vous pouvez utiliser le script shell comme moyen indépendant de la langue de publier des messages lors des tests ou de l'exécution de tâches administratives. L'indicateur--topic spécifie le sujet dans lequel vous allez publier le message.

Ensuite, vérifiez que le scriptkafka-console-producer.sh a publié le (s) message (s) en exécutant la commande suivante:

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

Le script shell de~/kafka/bin/kafka-console-consumer.sh démarre le consommateur. Une fois démarré, il s'abonnera aux messages du sujet que vous avez publié dans le message"Test Message 1" dans la commande précédente. L'indicateur--from-beginning dans la commande permet de consommer les messages qui ont été publiés avant le démarrage du consommateur. Si l'indicateur n'est pas activé, seuls les messages publiés après le démarrage du consommateur apparaissent. Lors de l'exécution de la commande, vous verrez la sortie suivante dans le terminal:

OutputTest Message 1

Appuyez surCTRL+C pour arrêter le consommateur.

Vous avez créé des données de test et vérifié leur persistance. Vous pouvez maintenant sauvegarder les données d'état dans la section suivante.

[[step-2 -—- backing-up-the-zookeeper-state-data]] == Étape 2 - Sauvegarde des données d'état de ZooKeeper

Avant de sauvegarder les données Kafka réelles, vous devez sauvegarder l'état du cluster stocké dans ZooKeeper.

ZooKeeper stocke ses données dans le répertoire spécifié par le champdataDir dans le fichier de configuration~/kafka/config/zookeeper.properties. Vous devez lire la valeur de ce champ pour déterminer le répertoire à sauvegarder. Par défaut,dataDir pointe vers le répertoire/tmp/zookeeper. Si la valeur est différente dans votre installation, remplacez/tmp/zookeeper par cette valeur dans les commandes suivantes.

Voici un exemple de sortie du fichier~/kafka/config/zookeeper.properties:

~/kafka/config/zookeeper.properties

...
...
...
# the directory where the snapshot is stored.
dataDir=/tmp/zookeeper
# 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
...
...
...

Maintenant que vous avez le chemin d'accès au répertoire, vous pouvez créer un fichier archive compressé de son contenu. Les fichiers d'archive compressés sont une meilleure option que les fichiers d'archive ordinaires pour économiser de l'espace disque. Exécutez la commande suivante:

tar -czf /home/kafka/zookeeper-backup.tar.gz /tmp/zookeeper/*

La sortie de la commandetar: Removing leading / from member names que vous pouvez ignorer en toute sécurité.

Les indicateurs-c et-z indiquent àtar de créer une archive et d'appliquer la compression gzip à l'archive. L'indicateur-f spécifie le nom du fichier d'archive compressé de sortie, qui estzookeeper-backup.tar.gz dans ce cas.

Vous pouvez exécuterls dans votre répertoire actuel pour voirzookeeper-backup.tar.gz dans le cadre de votre sortie.

Vous avez maintenant sauvegardé les données ZooKeeper avec succès. Dans la section suivante, vous sauvegarderez les données Kafka réelles.

[[step-3 -—- backing-up-the-kafka-topics-and-messages]] == Étape 3 - Sauvegarde des rubriques et messages Kafka

Dans cette section, vous allez sauvegarder le répertoire de données de Kafka dans un fichier tar compressé, comme vous l’aviez fait pour ZooKeeper à l’étape précédente.

Kafka stocke les rubriques, les messages et les fichiers internes dans le répertoire que le champlog.dirs spécifie dans le fichier de configuration de~/kafka/config/server.properties. Vous devez lire la valeur de ce champ pour déterminer le répertoire à sauvegarder. Par défaut et dans votre installation actuelle,log.dirs pointe vers le répertoire/tmp/kafka-logs. Si la valeur est différente dans votre installation, remplacez/tmp/kafka-logs dans les commandes suivantes par la valeur correcte.

Voici un exemple de sortie du fichier~/kafka/config/server.properties:

~/kafka/config/server.properties

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

# A comma separated list of directories under which to store log files
log.dirs=/tmp/kafka-logs

# 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
...
...
...

Tout d'abord, arrêtez le service Kafka afin que les données du répertoirelog.dirs soient dans un état cohérent lors de la création de l'archive avectar. Pour ce faire, revenez à l'utilisateur non root de votre serveur en tapantexit, puis exécutez la commande suivante:

sudo systemctl stop kafka

Après avoir arrêté le service Kafka, reconnectez-vous en tant qu'utilisateurkafka avec:

sudo -iu kafka

Il est nécessaire d'arrêter / démarrer les services Kafka et ZooKeeper en tant qu'utilisateur sudo non root car dans la condition préalable à l'installation d'Apache Kafka, vous avez restreint l'utilisateurkafka par mesure de sécurité. Cette étape du prérequis désactive l'accès sudo pour l'utilisateur dekafka, ce qui entraîne l'échec de l'exécution des commandes.

Créez maintenant un fichier d’archive compressé contenant le contenu du répertoire en exécutant la commande suivante:

tar -czf /home/kafka/kafka-backup.tar.gz /tmp/kafka-logs/*

Une fois de plus, vous pouvez ignorer en toute sécurité la sortie de la commande (tar: Removing leading / from member names).

Vous pouvez exécuterls dans le répertoire courant pour voirkafka-backup.tar.gz dans le cadre de la sortie.

Vous pouvez redémarrer le service Kafka - si vous ne souhaitez pas restaurer les données immédiatement - en tapantexit, pour basculer vers votre utilisateur sudo non root, puis en exécutant:

sudo systemctl start kafka

Reconnectez-vous en tant qu'utilisateurkafka:

sudo -iu kafka

Vous avez sauvegardé avec succès les données Kafka. Vous pouvez maintenant passer à la section suivante, où vous allez restaurer les données d'état du cluster stockées dans ZooKeeper.

[[step-4 -—- restoring-the-zookeeper-data]] == Étape 4 - Restauration des données de ZooKeeper

Dans cette section, vous allez restaurer les données d'état du cluster créées et gérées en interne par Kafka lorsque l'utilisateur effectue des opérations telles que la création d'un sujet, l'ajout / la suppression de nœuds supplémentaires, l'ajout et la consommation de messages. Vous restaurerez les données sur votre installation source existante en supprimant le répertoire de données ZooKeeper et en restaurant le contenu du fichierzookeeper-backup.tar.gz. Si vous souhaitez restaurer des données sur un autre serveur, voir l'étape 7.

Par précaution, vous devez arrêter les services Kafka et ZooKeeper afin d'éviter que les répertoires de données reçoivent des données non valides pendant le processus de restauration.

Tout d'abord, arrêtez le service Kafka en tapantexit, pour basculer vers votre utilisateur sudo non root, puis exécutez:

sudo systemctl stop kafka

Ensuite, arrêtez le service ZooKeeper:

sudo systemctl stop zookeeper

Reconnectez-vous en tant qu'utilisateurkafka:

sudo -iu kafka

Vous pouvez ensuite supprimer en toute sécurité le répertoire de données du cluster existant à l'aide de la commande suivante:

rm -r /tmp/zookeeper/*

Maintenant, restaurez les données que vous avez sauvegardées à l'étape 2:

tar -C /tmp/zookeeper -xzf /home/kafka/zookeeper-backup.tar.gz --strip-components 2

L'indicateur-C indique àtar de passer au répertoire/tmp/zookeeper avant d'extraire les données. Vous spécifiez l'indicateur--strip 2 pour quetar extrait le contenu de l'archive dans/tmp/zookeeper/ lui-même et non dans un autre répertoire (tel que/tmp/zookeeper/tmp/zookeeper/) à l'intérieur de celui-ci.

Vous avez restauré les données d'état du cluster avec succès. Maintenant, vous pouvez passer au processus de restauration de données Kafka dans la section suivante.

[[step-5 -—- restoring-the-kafka-data]] == Étape 5 - Restauration des données Kafka

Dans cette section, vous allez restaurer les données Kafka sauvegardées sur votre installation source existante (ou sur le serveur de destination si vous avez suivi l'étape facultative 7) en supprimant le répertoire de données Kafka et en restaurant le fichier d'archive compressé. Cela vous permettra de vérifier que la restauration fonctionne correctement.

Vous pouvez supprimer en toute sécurité le répertoire de données Kafka existant à l'aide de la commande suivante:

rm -r /tmp/kafka-logs/*

Maintenant que vous avez supprimé les données, votre installation de Kafka ressemble à une nouvelle installation sans sujets ni messages. Pour restaurer vos données sauvegardées, extrayez les fichiers en exécutant:

tar -C /tmp/kafka-logs -xzf /home/kafka/kafka-backup.tar.gz --strip-components 2

L'indicateur-C indique àtar de passer au répertoire/tmp/kafka-logs avant d'extraire les données. Vous spécifiez l'indicateur--strip 2 pour vous assurer que le contenu de l'archive est extrait dans/tmp/kafka-logs/ lui-même et non dans un autre répertoire (tel que/tmp/kafka-logs/kafka-logs/) à l'intérieur.

Maintenant que vous avez extrait les données avec succès, vous pouvez redémarrer les services Kafka et ZooKeeper en tapantexit, pour passer à votre utilisateur sudo non root, puis en exécutant:

sudo systemctl start kafka

Démarrez le service ZooKeeper avec:

sudo systemctl start zookeeper

Reconnectez-vous en tant qu'utilisateurkafka:

sudo -iu kafka

Vous avez restauré les données dekafka, vous pouvez passer à la vérification du succès de la restauration dans la section suivante.

[[step-6 -—- vérifier-la-restauration]] == Étape 6 - Vérification de la restauration

Pour tester la restauration des données Kafka, vous utiliserez des messages provenant du sujet que vous avez créé à l'étape 1.

Attendez quelques minutes que Kafka démarre, puis exécutez la commande suivante pour lire les messages desBackupTopic:

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

Si vous recevez un avertissement comme celui-ci, vous devez attendre que Kafka démarre complètement:

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)

Réessayez la commande précédente dans quelques minutes ou exécutezsudo systemctl restart kafka en tant qu'utilisateur sudo non root. S'il n'y a pas de problèmes dans la restauration, vous verrez la sortie suivante:

OutputTest Message 1

Si vous ne voyez pas ce message, vous pouvez vérifier si vous avez manqué des commandes de la section précédente et les exécuter.

Maintenant que vous avez vérifié les données Kafka restaurées, cela signifie que vous avez correctement sauvegardé et restauré vos données dans une seule installation Kafka. Vous pouvez continuer à l'étape 7 pour voir comment migrer les données du cluster et des sujets vers une installation sur un autre serveur.

[[step-7 -—- migration-and-restoring-the-backup-to-another-kafka-server-optional]] == Étape 7 - Migration et restauration de la sauvegarde vers un autre serveur Kafka (facultatif)

Dans cette section, vous allez migrer les données sauvegardées du serveur Kafka source vers le serveur Kafka de destination. Pour ce faire, vous utiliserez d'abord la commandescp pour télécharger les fichiers compresséstar.gz sur votre système local. Vous utiliserez ensuite à nouveauscp pour pousser les fichiers vers le serveur de destination. Une fois que les fichiers sont présents sur le serveur de destination, vous pouvez suivre les étapes précédemment utilisées pour restaurer la sauvegarde et vérifier que la migration a réussi.

Vous téléchargez les fichiers de sauvegarde localement, puis les téléchargez sur le serveur de destination, au lieu de les copier directement de votre serveur source vers le serveur de destination, car le serveur de destination n'aura pas la clé SSH de votre serveur source dans son fichier/home/sammy/.ssh/authorized_keys et ne peut pas connectez-vous vers et depuis le serveur source. Votre ordinateur local peut toutefois se connecter aux deux serveurs, ce qui vous évite une étape supplémentaire de configuration de l'accès SSH du serveur source au serveur de destination.

Téléchargez les fichierszookeeper-backup.tar.gz etkafka-backup.tar.gz sur votre machine locale en exécutant:

scp sammy@source_server_ip:/home/kafka/zookeeper-backup.tar.gz .

Vous verrez une sortie similaire à:

Outputzookeeper-backup.tar.gz                                                                                                  100%   68KB 128.0KB/s   00:00

Exécutez maintenant la commande suivante pour télécharger le fichierkafka-backup.tar.gz sur votre machine locale:

scp sammy@source_server_ip:/home/kafka/kafka-backup.tar.gz .

Vous verrez la sortie suivante:

Outputkafka-backup.tar.gz                                                                                                       100% 1031KB 488.3KB/s   00:02

Exécutezls dans le répertoire courant de votre machine locale, vous verrez les deux fichiers:

Outputkafka-backup.tar.gz zookeeper.tar.gz

Exécutez la commande suivante pour transférer le fichierzookeeper-backup.tar.gz vers/home/kafka/ du serveur de destination:

scp zookeeper-backup.tar.gz sammy@destination_server_ip:/home/sammy/zookeeper-backup.tar.gz

Exécutez maintenant la commande suivante pour transférer le fichierkafka-backup.tar.gz vers/home/kafka/ du serveur de destination:

scp kafka-backup.tar.gz sammy@destination_server_ip:/home/sammy/kafka-backup.tar.gz

Vous avez chargé avec succès les fichiers de sauvegarde sur le serveur de destination. Étant donné que les fichiers se trouvent dans le répertoire/home/sammy/ et ne disposent pas des autorisations appropriées pour l'accès de l'utilisateurkafka, vous pouvez déplacer les fichiers vers le répertoire/home/kafka/ et modifier leurs autorisations.

SSH sur le serveur de destination en exécutant:

ssh sammy@destination_server_ip

Maintenant, déplacezzookeeper-backup.tar.gz vers/home/kafka/ en exécutant:

sudo mv zookeeper-backup.tar.gz /home/sammy/zookeeper-backup.tar.gz

De même, exécutez la commande suivante pour copierkafka-backup.tar.gz vers/home/kafka/:

sudo mv kafka-backup.tar.gz /home/kafka/kafka-backup.tar.gz

Changez le propriétaire des fichiers de sauvegarde en exécutant la commande suivante:

sudo chown kafka /home/kafka/zookeeper-backup.tar.gz /home/kafka/kafka-backup.tar.gz

Les commandesmv etchown précédentes n'afficheront aucune sortie.

Maintenant que les fichiers de sauvegarde sont présents sur le serveur de destination dans le bon répertoire, suivez les commandes répertoriées aux étapes 4 à 6 de ce didacticiel pour restaurer et vérifier les données de votre serveur de destination.

Conclusion

Dans ce didacticiel, vous avez sauvegardé, importé et migré vos sujets et messages Kafka à partir de la même installation et d'installations sur des serveurs distincts. Si vous souhaitez en savoir plus sur d’autres tâches administratives utiles dans Kafka, vous pouvez consulter la sectionoperations de la documentation officielle de Kafka.

Pour stocker à distance des fichiers sauvegardés tels quezookeeper-backup.tar.gz etkafka-backup.tar.gz, vous pouvez explorerDigital Ocean Spaces. Si Kafka est le seul service en cours d'exécution sur votre serveur, vous pouvez également explorer d'autres méthodes de sauvegarde telles que l'instance complètebackups.