Premiers pas avec Zookeeper
Aperçu
Projet Open source, distribué, Apache pour les applications distribuées
Mécanisme de travail
Zookeeper comprend du point de vue des modèles de conception: il s'agit d'un cadre de gestion de service distribué conçu sur la base du modèle d'observateur. Il est responsable de la gestion du stockage et de la gestion des données qui intéressent tout le monde, puis accepte l'enregistrement de l'observateur. Une fois l'état de ces derniers changements de données, zookeeper sera responsable d'avertir les observateurs qui se sont inscrits auprès de zookeeper de répondre en conséquence
caractéristique
- Cohérence globale des données
- fiabilité
- Séquentiel
- Atomicité de mise à jour des données
- temps réel
rôle de gardien de zoo
- Leader
Le cœur du cluster Zookeeper est
le seul planificateur et processeur de demandes de transaction (opérations d'écriture), assurant la séquence des transactions dans le
cluster ; le planificateur de chaque serveur du cluster.
Pour les demandes de création, setData, suppression et autres écritures, elles doivent être transmises au responsable pour traitement. Le responsable doit déterminer le numéro et effectuer l'opération. Ce processus est appelé une transaction.
- Disciple
Traiter les demandes de non-transaction des clients, transmettre les demandes de transaction au leader;
participer à l'élection du leader du cluster.
- Observateur
Rôle d'observateur, observez les derniers changements d'état du cluster zookeeper et synchronisez ces états. Il peut traiter les demandes non transactionnelles séparément et transmettre les demandes de transaction au chef pour traitement. Il
ne participe à aucune forme de vote et fournit uniquement services non transactionnels.
Construction d'un cluster de gardiens de zoo
Étapes de construction
- Configurer le mappage du nom d'hôte sur l'adresse IP
- Modifier le fichier de configuration du gardien de zoo
- Copiez et distribuez à distance les fichiers d'installation
- Définir myid
- Démarrer le cluster zookeeper
Processus de construction
1. Téléchargez zookeeper wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
2. Décompressez-le dans / usr / local / src sous tar - xvzf zookeeper-3.4.13.tar.gz
3. Renommé mv zookeeper-3.4.13 zookeeper
4. Entrez dans le répertoire conf
5. Copiez trois copies de zoo_sample.cfg et nommez-les zoo_1.cfg zoo_2.cfg zoo_3.cfg
6 . Modifier Le contenu de zoo_1.cfg est le suivant
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/data/zk1/data
clientPort=2181
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
7. Modifiez le contenu de zoo_2.cfg comme suit
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/data/zk1/data
clientPort=2182
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
8. Modifiez le contenu de zoo_3.cfg comme suit
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/data/zk1/data
clientPort=2183
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
9. Exécutez la commande pour créer le dossier et myid
mkdir -p /usr/local/data/zk1/data
mkdir -p /usr/local/data/zk2/data
mkdir -p /usr/local/data/zk3/data
echo "1" > /usr/local/data/zk1/data/myid
echo "2" > /usr/local/data/zk2/data/myid
echo "3" > /usr/local/data/zk3/data/myid
10. Exécutez la commande suivante dans le répertoire bin pour démarrer le cluster zookeepe
zkServer status ../conf/zoo_1.cfg
zkServer status ../conf/zoo_2.cfg
zkServer status ../conf/zoo_3.cfg
11.Exécutez les commandes suivantes dans le répertoire bin pour afficher l'état de chaque nœud
zkServer.sh status ../conf/zoo_1.cfg
zkServer.sh status ../conf/zoo_2.cfg
zkServer.sh status ../conf/zoo_3.cfg
modèle de données de gardien de zoo
- Znode a à la fois des fonctionnalités de fichiers et de répertoires
-
即像文件一样维护着数据又像目录一样可作为路径标识的一部分
- Znode a un fonctionnement atomique
- Le stockage Znode a une limite de niveau Ko
- Znode est référencé par chemin, et le chemin doit être absolu
- Composition de Znoe
- informations sur l'état des statistiques, décrivant la version et les informations d'autorisation du Znode
- data Les données associées au Znode
- enfants les nœuds enfants sous le Znode
- Type de nœud
- La session du nœud temporaire se termine, le nœud temporaire est automatiquement supprimé et le nœud temporaire n'est pas autorisé à avoir des nœuds enfants
- Les nœuds permanents disparaissent sauf s'ils sont supprimés manuellement et ne peuvent pas être modifiés en nœuds temporaires
- Sérialiser le nœud
- Attributs de nœud
- dataversion modifiera dataversion après chaque set
- Cversion sera mis à jour après la modification du nœud enfant de la cversion
- ID de transaction czxid créé par Znode
- mzxid L'ID de transaction qui a été modifié
- heure de création du nœud ctime
- heure de mise à jour du nœud mtime
- ephemeralOwner Si le nœud est un nœud temporaire, la valeur identifie l'identifiant de session lié au nœud, sinon, il vaut 0
commande gardien de zoo
- Créer une connexion
zkCli.sh -p host:port
- Créer un nœud
create [-e] [-s] path acl
-e 创建临时节点 -s 创建序列化节点
- Supprimer le nœud
delete path
不能删除有子节点的节点,除非子节点内容为空
- Supprimer les nœuds de manière récursive
rmr path
- Limite de nœud
setquota -n | -b val path
n 标识子节点个数 -b 表示数据大小
listquota 查看设置信息
delquota -n | -b path 删除设置信息
- Commande historique
history 查看历史命令
redo num 重新执行某条命令
Gardien de zoo
Zookeeper fournit une fonction de publication / abonnement de données distribuées. Zookeeper introduit un mécanisme d'observation pour réaliser cette fonction de notification distribuée. Zookeeper permet au client d'enregistrer un observateur sur le serveur. Lorsque certains événements sur le serveur déclenchent l'observateur, alors il souhaite que le client envoie notifications.
Types d'événements déclencheurs: suppression de nœud, changement de nœud, changement de nœud enfant, etc.
En général, l'observateur est résumé comme les trois processus suivants: le client enregistre l'observateur auprès du serveur, l'événement serveur déclenche l'observateur et le client rappelle l'observateur pour obtenir le contenu de l'événement déclencheur.
Caractéristiques du mécanisme de déclenchement
- Déclencheur unique
- Encapsulation d'événements
-
传递watchedevent,包括通知状态,事件类型,节点路径。
- Envoi d'événement asynchrone
- Inscrivez-vous d'abord, puis déclenchez
Observateur d'opérations Shell
help 查看所有命令,后面带有watcher的都可以实现监听
stat path [watch]
ls path [watch]
ls2 path [watch]
get path [watch]
API Java de Zookeeper
- Introduire des dépendances
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
- Exemple de code
public static void main(String[] args) throws Exception{
ZooKeeper zooKeeper = new ZooKeeper("192.168.195.100:2181,192.168.195.100:2182", 30000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("回调通知");
System.out.println(watchedEvent.getPath());
System.out.println(watchedEvent.getState());
System.out.println(watchedEvent.getType());
}
});
// zooKeeper.create("/magicbook","充满魔力的book".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
zooKeeper.getData("/magicbook0000000007",true,null);
zooKeeper.setData("/magicbook0000000007","少时诵诗书".getBytes(),-1);
zooKeeper.delete("/magicbook0000000007",-1);
// zooKeeper.close();
}
Mécanisme d'élection de gardien de zoo
L'algorithme d'élection par défaut de Zookeeper est la sélection rapide, qui utilise plus de la moitié des votes pour gagner
concept
- Identifiant du serveur
-
id越大,在选举算法中权重越大
- Statut électoral
- État de la campagne VERROUILLAGE
- Statut du suiveur SUIVI Synchronisez le statut du leader pour participer au vote
- Statut d'observation Synchronisation OBSERVER Le statut du leader ne participe pas au vote
- Statut de leader
La version des dernières données stockées dans le serveur d' ID de données , plus la valeur est élevée, plus les données sont récentes
Nouvelle élection de cluster
- Chaque machine vote pour elle-même VERROUILLAGE
- Le grand identifiant du serveur peut gagner les petits votes d'identité
- Plus de la moitié des votes sont terminés
- Pour le moment, si un identifiant de serveur plus grand vient à l'élection, je suis désolé. Le vote est terminé
Non-nouveau cluster
Pour un cluster de gardien de zoo qui fonctionne normalement, il y a un temps d'arrêt de la machine au milieu et l'élection doit être réélue. L'ID de données, l'ID de serveur et l'horloge logique doivent être ajoutés au processus d'élection.
- ID de données: la nouvelle version des données est plus grande et les données mettront à jour la version à chaque fois
- ID du serveur: est le myid que nous avons configuré
- Cette valeur commence à 0 et chaque élection correspond à une valeur. Si dans la même élection, c'est la même chose.
- Le processus d'élection
1. L'horloge logique est ignorée et le vote est re-voté.
2. Après unification de l'horloge logique, l'ID de données l'emporte.
3. Dans le cas du même ID de données, le serveur avec l'ID le plus grand l'emporte.
4. Enfin, choisissez le chef
application typique
Publication de données et abonnement
En surveillant à plusieurs reprises les événements de changement de nœud, en utilisant Watcher pour surveiller, réaliser la publication de données et l'abonnement
Serrure distribuée
1. Chaque client crée un noeud ordonné temporaire.
2. Le client obtient la liste des noeuds et juge s'il s'agit du premier noeud de la liste. S'il s'agit du premier noeud de la liste, il obtient le verrou. Si ce n'est pas le cas, il surveille le nœud précédent et attend que le nœud précédent soit supprimé.
3. Si le verrou est acquis, le processus métier normal est exécuté et le verrou est libéré après l'exécution.
À l'étape 2 ci-dessus, certaines personnes peuvent s'inquiéter du fait que si le nœud constate qu'il ne s'agit pas du nœud avec la plus petite séquence, il est prêt à ajouter un écouteur, mais à ce stade, le nœud précédent est simplement supprimé. Ajout d'un écouteur à cette fois ne fonctionnera jamais.En fait, l'API zk peut garantir que la lecture et l'ajout d'écouteurs sont une opération atomique.
Pourquoi écouter le nœud précédent au lieu de tous les nœuds? En effet, si vous surveillez tous les nœuds enfants, l'état de tout nœud enfant change, tous les autres nœuds enfants recevront des notifications (effet de troupeau), et nous voulons que le nœud enfant suivant reçoive uniquement des notifications.