Signatur
Beschreibung
ZookeeperConfig ist eine PHP-Klasse der Zookeeper-PECL-Erweiterung, die den Zugriff auf die dynamische Konfiguration eines ZooKeeper-Clusters kapselt. Mit ihr lassen sich Konfigurationsinformationen wie Ensemble-Mitglieder abrufen und zur Laufzeit ändern, ohne den Cluster neu starten zu müssen.
ZooKeeper unterstützt ab Version 3.5 dynamische Rekonfiguration. ZookeeperConfig bildet diesen Mechanismus in PHP ab und ermöglicht es, Server hinzuzufügen, zu entfernen oder zu ersetzen sowie die aktuelle Konfiguration auszulesen. Dies ist besonders nützlich in hochverfügbaren Systemen, in denen Ensemble-Änderungen ohne Downtime vorgenommen werden müssen.
Die Klasse wird typischerweise über die Methode Zookeeper::getConfig() instanziiert und stellt Methoden wie get(), set(), add() und remove() bereit, um gezielt auf die ZooKeeper-Konfiguration zuzugreifen oder diese anzupassen.
Der Einsatz erfordert eine laufende ZooKeeper-Instanz ab Version 3.5.0 mit aktivierter dynamischer Rekonfiguration sowie entsprechende Zugriffsrechte auf den /zookeeper/config-Knoten.
Beispiele
Aktuelle ZooKeeper-Konfiguration abrufen
<?php
// Verbindung zu ZooKeeper herstellen
$zk = new Zookeeper('127.0.0.1:2181');
// ZookeeperConfig-Objekt über getConfig() erhalten
$config = $zk->getConfig();
// Aktuelle Konfiguration als String abrufen
$stat = [];
$configData = $config->get(false, $stat);
echo "Aktuelle ZooKeeper-Konfiguration:" . PHP_EOL;
echo $configData . PHP_EOL;
echo "Version: " . $stat['version'] . PHP_EOL;
Neuen Server zur ZooKeeper-Konfiguration hinzufügen
<?php
$zk = new Zookeeper('127.0.0.1:2181');
$config = $zk->getConfig();
// Aktuellen Konfigurationsstand ermitteln
$stat = [];
$config->get(false, $stat);
$currentVersion = $stat['version'];
// Neuen Server hinzufügen (joining)
$newServer = 'server.4=zoo4:2888:3888:participant;0.0.0.0:2181';
try {
$config->add($newServer, $currentVersion);
echo "Server erfolgreich zur Konfiguration hinzugefügt." . PHP_EOL;
} catch (ZookeeperException $e) {
echo "Fehler beim Hinzufügen: " . $e->getMessage() . PHP_EOL;
}
Server aus ZooKeeper-Konfiguration entfernen
<?php
$zk = new Zookeeper('127.0.0.1:2181');
$config = $zk->getConfig();
$stat = [];
$config->get(false, $stat);
$currentVersion = $stat['version'];
// Server mit ID 4 entfernen
try {
$config->remove(4, $currentVersion);
echo "Server 4 erfolgreich aus der Konfiguration entfernt." . PHP_EOL;
} catch (ZookeeperException $e) {
echo "Fehler beim Entfernen: " . $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Voraussetzungen: Die dynamische Rekonfiguration muss in der ZooKeeper-Server-Konfiguration explizit aktiviert sein (reconfigEnabled=true). Ohne diese Einstellung schlagen alle Schreiboperationen fehl.
Zugriffsrechte: Für schreibende Operationen (set(), add(), remove()) sind spezielle ACL-Berechtigungen auf dem /zookeeper/config-Knoten erforderlich. Ohne diese Rechte wird eine ZookeeperException mit dem Fehlercode ZNOAUTH geworfen.
Versionskompatibilität: Die dynamische Rekonfiguration und damit ZookeeperConfig erfordert ZooKeeper Server ≥ 3.5.0. Ältere Cluster-Versionen unterstützen dieses Feature nicht.
Versionskonflikte: Bei konkurrierenden Konfigurationsänderungen sollte der aktuelle Versions-Wert aus $stat['version'] übergeben werden, um optimistische Sperren nutzen zu können. Ein Wert von -1 deaktiviert die Versionssprüfung.