Comment configurer un cluster OrientDB sur Ubuntu 16.04

introduction

OrientDB est une base de données NoSQL multimodèle prenant en charge les bases de données graphiques et documentaires. C'est une application Java et peut être exécuté sur n'importe quel système d'exploitation. Il est également totalement conforme auxACID avec prise en charge du clustering et de la réplication multi-maîtres, permettant une mise à l'échelle horizontale facile.

Cependant, le mot "cluster" dans OrientDB peut faire référence à deux concepts différents:

  1. Vous pouvez avoir un cluster d'OrientDBnodes, qui sont des serveurs exécutant OrientDB. Cela implique l'utilisation d'au moins un serveur physique (ou cloud), car plusieurs instances d'OrientDB peuvent être exécutées sur un serveur.

  2. Vous pouvez également avoir un cluster dans un OrientDBdatabase, qui est un regroupement d'enregistrements de type ou de valeur similaire. Un tel cluster peut également exister sur plusieurs serveurs ou être limité à un serveur.

Cet article met l’accent sur le premier type de cluster, c’est-à-dire un groupe de nœuds. En mode cluster, OrientDB s’exécute dans une architecture distribuée multi-maîtres ou sans maître, ce qui signifie que chaque nœud du cluster fonctionne sur un pied d’égalité et est capable de lire / écrire les enregistrements les uns des autres. Cependant, un nœud peut également rejoindre un cluster en tant quereplica, où il fonctionne en mode lecture seule.

Dans ce didacticiel, vous allez configurer un cluster à trois nœuds avec deux nœuds maîtres et un nœud de réplique à l'aide de l'édition communautaire de OrientDB.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

  • Trois serveurs Ubuntu 16.04 avec suffisamment de RAM pour prendre en charge le cluster. Cela varie en fonction de vos besoins et de la manière dont vous personnalisez OrientDB. Toutefois, 4 Go est un bon choix par défaut.

  • Un compte d'utilisateur sudo non root et un pare-feu ont configuréon each server à l'aide dethis Initial Server Setup with Ubuntu 16.04 tutorial.

  • Java doit être installé sur tous les serveurs, ce que vous pouvez faire en suivantthe JDK 8 step of this Java installation guide. OpenJDK JRE fonctionne également. Par conséquent, si vous ne souhaitez pas accepter la licence Oracle, vous pouvez installer le JRE par défaut à l’aide de ce même didacticiel.

  • OrientDB a installéon each server en suivantStep 1 of the single server OrientDB installation guide exactement comme écrit. Vous pouvez éventuellement suivre l’étape 2 pour limiter la quantité de RAM nécessaire; le script de démarrage distribué OrientDB s'attend à disposer d'au moins 4 Go de RAM et ne démarrera pas s'il en trouve moins, à moins que vous ne changiez cela.

  • OrientDB configuré comme un service Systemdon each server en suivantSteps 5 and 6 of the single server OrientDB installation guide, en s'arrêtant après avoir rechargé les unités (c.-à-d. sans démarrer le service). Le seul changement que vous devrez apporter est le fichier que vous fournissez pourExecStart dans le fichier d'unité. Le didacticiel d'origine utiliseserver.sh, mais ici, utilisezdserver.sh pour le mode distribué.

[[step-1 -—- generation-the-root-password-and-orientdb-instance-name]] == Étape 1 - Génération du mot de passe racine et du nom de l'instance OrientDB

Tout d'abord, nous allons exécuter le script de serveur distribué,dserver.sh pour générer les informations d'identification dont l'instance d'OrientDB a besoin pour fonctionner dans un cluster. Plus précisément, cela nous permettra de définir le mot de passe racine et le nom de l’instance d’OrientDB. Vous devrez suivre cette étape surall three servers.

Pour commencer, accédez au répertoire d'installation.

cd /opt/orientdb

Puis démarrez le serveur distribué.

sudo bin/dserver.sh

Lors du premier démarrage du serveur distribué, vous serez invité à spécifier un mot de passe pour le compte utilisateurroot. Il s’agit d’un compte interne OrientDB qui sera utilisé pour accéder au serveur, par exemple OrientDB Studio, l’interface Web permettant de gérer OrientDB et de se connecter à OrientDB à partir de la console. Si vous ne spécifiez pas de mot de passe ici, il en sera généré automatiquement. Toutefois, il est préférable d’en spécifier un vous-même. Faites-le lorsque vous y êtes invité:

Output+---------------------------------------------------------------+
|                WARNING: FIRST RUN CONFIGURATION               |
+---------------------------------------------------------------+
| This is the first time the server is running. Please type a   |
| password of your choice for the 'root' user or leave it blank |
| to auto-generate it.                                          |
|                                                               |
| To avoid this message set the environment variable or JVM     |
| setting ORIENTDB_ROOT_PASSWORD to the root password to use.   |
+---------------------------------------------------------------+

Root password [BLANK=auto generate it]: *****
Please confirm the root password: *****

Vous serez ensuite invité à définir un nom pour l’instance d’OrientDB, qui peut être identique à celui du serveur cloud sur lequel il est exécuté.

Output+---------------------------------------------------------------+
|         WARNING: FIRST DISTRIBUTED RUN CONFIGURATION          |
+---------------------------------------------------------------+
| This is the first time that the server is running as          |
| distributed. Please type the name you want to assign to the   |
| current server node.                                          |
|                                                               |
| To avoid this message set the environment variable or JVM     |
| setting ORIENTDB_NODE_NAME to the server node name to use.    |
+---------------------------------------------------------------+

Node name [BLANK=auto generate it]: node-name

Une fois le script exécuté, vous verrez une ligne comme celle-ci:

Output2017-06-01 02:24:00:717 INFO  OrientDB Server is active v2.2.20 (build 76ab59e72943d0ba196188ed100c882be4315139). [OServer]

À ce stade, vous pouvez terminer le processus en utilisantCTRL+C. Maintenant que OrientDB est installé, nous devons modifier plusieurs fichiers de configuration pour le laisser fonctionner en tant que cluster.

[[step-2 -—- configuration-orientdb-to-function-in-Distributed-mode]] == Étape 2 - Configuration d'OrientDB pour fonctionner en mode distribué

Pour qu'une installation d'OrientDB fonctionne comme un nœud dans un cluster, trois fichiers dans son répertoireconfig doivent être modifiés. Elles sont:

  1. hazelcast.xml: les paramètres définis dans ce fichier rendent possible la détection automatique des nœuds.

  2. default-distributed-db-config.json: ce fichier est uniquement destiné à être utilisé dans un environnement distribué et sert à définir le comportement du nœud pour chaque base de données.

  3. orientdb-server-config.xml: C'est le fichier de configuration principal d'OrientDB qui doit être modifié que ce soit en mode distribué ou autonome.

Nous modifierons chaque fichier à cette étape, en commençant parhazelcast.xml.

Modification du fichierhazelcast.xml

Le paramètre le plus important que vous devrez configurer danshazelcast.xml est le mécanisme que chaque nœud utilisera pour rejoindre le cluster. Deux mécanismes que nous examinerons dans cette section sontIP Multicast etTCP/IP-cluster. Dans le premier cas, vous spécifiez une adresse de multidiffusion et un port que chaque nœud utilisera pour détecter automatiquement le réseau auquel il appartient. Avec ce dernier, l'adresse IP de chaque membre du cluster doit être spécifiée. La multidiffusion IP n'étant pas prise en charge sur DigitalOcean, la méthode que nous allons utiliser ici est celle du cluster TCP / IP.

Pour commencer, ouvrez le fichier pour le modifier:

sudo nano /opt/orientdb/config/hazelcast.xml

Le fichier n’est pas très long. Il s’agit d’une version tronquée affichant uniquement les sections du fichier que vous allez modifier:

/opt/orientdb/config/hazelcast.xml

. . .
    
        orientdb
        orientdb
    
    
        . . .
    
    
        2434
        
            
                235.1.1.1
                2434
            
        
    

Pour ce fichier, désactivez la multidiffusion IP, ajoutez une entrée qui active le cluster TCP / IP et spécifiez les membres du cluster. Passons en revue chaque balise:

  • group > name: cet élément définit le nom du cluster. Vous pouvez choisir ce que vous voulez.

  • group > password: définit le mot de passe utilisé pour crypter les messages de diffusion envoyés par chaque membre pour rejoindre le cluster. Choisissez un mot de passe fort ici.

  • network > port: identifie le port utilisé pour la découverte automatique des nœuds. L'attributauto-increment indique au mécanisme de démarrer avec le port défini et de continuer à en essayer d'autres si ce port est utilisé. En le définissant sur false, le port défini sera utilisé pour la communication et la découverte de nœud échouera si le port est déjà utilisé. Pour cet article, l'attribut sera désactivé.

  • Les élémentsjoin > multicast sont utilisés pour définir les paramètres de multidiffusion IP. Vous n'utiliserez pas la multidiffusion IP, nous allons donc les ignorer. Cela signifie que nous allons définir l'attributenabled sur false.

  • join > tcp-ip: Ceci est utilisé pour définir les paramètres liés au cluster TCP / IP. L'attributenabled est utilisé pour l'activer.

  • join > tcp-ip > member: définit chaque membre du cluster. Il existe d’autres approches pour spécifier chaque membre, mais nous nous en tiendrons à celle où l’adresse IP de chaque membre est spécifiée (une par ligne).

Lorsque vous avez fini de modifier le fichier, la version finale se présentera comme suit:

/opt/orientdb/config/hazelcast.xml

. . .
    
        clusterName
        clusterPassword
    
    
        . . .
    
    
        2434
        
            
                235.1.1.1
                2434
            
            
                your_master_server_ip_1
                your_master_server_ip_2
                your_replica_server_ip
            
        
    

Enregistrez et fermez le fichier lorsque vous avez fini de le modifier. Suivant est le deuxième fichier sur notre liste.

Modification du fichierdefault-distributed-db-config.json

Comme pour leshazelcast.xml, nous n'apporterons que quelques modifications aux/opt/orientdb/config/default-distributed-db-config.json. C'est dans ce fichier que vous spécifiez le rôle (maître ou réplica) que chaque serveur doit jouer dans le cluster.

Ouvrez-le pour l'édition.

sudo nano /opt/orientdb/config/default-distributed-db-config.json

La partie pertinente du fichier est indiquée dans le bloc de code ci-dessous:

/opt/orientdb/config/default-distributed-db-config.json

{
  "autoDeploy": true,
  "readQuorum": 1,
  "writeQuorum": "majority",
  "executionMode": "undefined",
  "readYourWrites": true,
  "newNodeStrategy": "static",
  "servers": {
    "*": "master"
  },
  . . .
}

Voici ce que chaque ligne signifie:

  • autoDeploy: spécifie s'il faut déployer une base de données sur un nouveau nœud du cluster qui ne l'a pas déjà.

  • readQuorum: nombre de réponses des nœuds de cluster qui doivent être cohérentes avant de répondre à un client sur les opérations de lecture. Le réglage sur «1» désactive la cohérence de lecture.

  • writeQuorum: lors des opérations d'écriture, combien de nœuds doivent répondre avant d'envoyer une réponse au client. La valeur par défaut estmajority, qui est calculée à l'aide de(N/2) + 1, oùN est le nombre de nœuds maîtres disponibles dans le cluster. Les nœuds de réplique ne sont pas pris en compte lors du calcul de la majorité. Si la configuration par défaut est maintenue dans un cluster ne comprenant que deux nœuds maîtres, un quorum ne se formera jamais si l'un des nœuds tombe en panne.

  • executionMode: définit le mode d’exécution d’un client - synchrone ou asynchrone. La valeur par défaut laisse le client décider.

  • readYourWrites: spécifie si la réponse du nœud compte pour atteindre un quorum d'écriture.

  • newNodeStrategy: que se passe-t-il lorsqu'un nouveau nœud rejoint le cluster. Avec la valeur par défaut, le nœud est automatiquement enregistré dans la liste des serveurs.

Nous allons ajouter les paramètres suivants:

  • hotAlignment: spécifie ce qui se passe si un nœud tombe en panne puis revient en ligne. Si cette option est activée, les messages de synchronisation sont conservés dans une file d'attente distribuée lorsque le nœud est hors ligne. Lorsqu'il revient en ligne, il commence la phase de synchronisation en interrogeant tous les messages de synchronisation de la file d'attente.

  • servers: est utilisé pour spécifier le rôle (maître ou réplica) des nœuds dans le cluster. Par défaut, un astérisque,*, est utilisé pour indiquer que tous les nœuds du serveur seront maîtres. Dans la mesure où nous avons l'intention de créer un cluster comprenant deux maîtres et un réplica, nous allons modifier ce paramètre afin qu'il corresponde en spécifiant le nom de chaque nœud et le rôle qu'il aura dans le cluster. Le nom est ce que vous avez configuré à l'étape 1.

Lorsque vous avez terminé de modifier le fichier, il devrait ressembler à ceci:

/opt/orientdb/config/default-distributed-db-config.json

{
  "replication": true,
  "hotAlignment" : true,
  "autoDeploy": true,
  "readQuorum": 1,
  "writeQuorum": "majority",
  "executionMode": "undefined",
  "readYourWrites": true,
  "newNodeStrategy": "static",
  "servers": {
    "orientdb_server_name_1": "master",
    "orientdb_server_name_2": "master",
    "orientdb_server_name_3": "replica"
  },

  ...

}

Enregistrez et fermez le fichier lorsque vous avez terminé. Nous allons maintenant configurer le dernier fichier de notre liste.

Modification du fichierorientdb-server-config.xml

Dans/opt/orientdb/config/orientdb-server-config.xml se trouve un paramètre utilisé pour activer ou désactiver le clustering à l'aide de la grille de données en mémoire Hazelcast dans OrientDB. Le nom que vous avez attribué à l'instance OrientDB (ou que le script a généré automatiquement) à l'étape 1 peut être modifié dans ce fichier.

Ouvrez-le pour l'édition.

sudo nano /opt/orientdb/config/orientdb-server-config.xml

La section pertinente du fichier est indiquée ci-dessous, en haut du fichier. Notez que la valeur du paramètreNodeName est celle que vous avez spécifiée à l'étape 1:

/opt/orientdb/config/orientdb-server-config.xml

. . .

    
        
        
    

. . .

Pour activer la mise en cluster, remplacez le paramètreenabled partrue. Après l'avoir édité, la version finale ressemblera à ceci:

/opt/orientdb/config/orientdb-server-config.xml

. . .

    
        
        
    

. . .

Une fois le fichier modifié, enregistrez-le et fermez-le.

Avant de pouvoir démarrer et tester le cluster, il ne reste plus qu'à autoriser le trafic d’OrientDB à travers le pare-feu.

[[step-3 -—- allow-orientdb-traffic-through-the-firewall]] == Étape 3 - Autoriser le trafic OrientDB à travers le pare-feu

Si vous tentez de démarrer le cluster maintenant, le trafic d’OrientDB serait bloqué par votre pare-feu. Ajoutons des règles pour autoriser le trafic via les ports suivants:

  • 2424, utilisé pour les communications binaires

  • 2434, utilisé pour échanger des communications de cluster

Ouvrez les ports2424 et2480.

sudo ufw allow 2424
sudo ufw allow 2434

[.Remarque]##

Note: Le port2480 est utilisé pour accéder à OrientDB Studio, l'interface Web de l'application. Celui-ci utilise HTTP, il n'est donc pas sécurisé et ne doit pas être exposé à l'Internet public. Cependant, si vous souhaitez autoriser le trafic sur ce port dans une configuration de test, vous pouvez le faire avec:

sudo ufw allow 2480

Ensuite, redémarrez UFW.

sudo systemctl restart ufw

OrientDB est déjà configuré en tant que service Systemd à partir des conditions préalables. Ainsi, maintenant que le reste de la configuration est terminé, nous pouvons démarrer le cluster.

[[step-4 -—- starting-and-testing-the-orientdb-cluster]] == Étape 4 - Démarrage et test du cluster OrientDB

Sur chaque serveur, assurez-vous que le service est activé pour pouvoir être démarré au démarrage.

sudo systemctl enable orientdb

Vous pouvez maintenant démarrer les trois serveurs. Le premier serveur a démarré (c'est-à-dire le premier à rejoindre le cluster) devient lecoordinator server, qui est l'endroit où les opérations distribuées sont démarrées. Si vous souhaitez qu'un serveur spécifique ait ce rôle, démarrez-le d'abord.

sudo systemctl start orientdb

Vérifiez l'état du processus pour vérifier qu'ils ont démarré correctement.

sudo systemctl status orientdb

Vous verrez une sortie qui ressemble à ceci:

Output● orientdb.service - OrientDB Server
   Loaded: loaded (/etc/systemd/system/orientdb.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2017-06-01 02:45:53 UTC; 7s ago

Si le serveur ne démarre pas, recherchez des indices dans la sortie. Les sources d'erreur potentielles incluent une mémoire RAM insuffisante, un JRE Java non installé ou un fichier JSON modifié dont la validation a échoué. Pensez à redémarrer OrientDB si vous apportez des modifications à l’un des fichiers de l’étape 2.

Une fois le processus exécuté correctement, vérifions que le cluster fonctionne correctement. Sur l’un des trois nœuds, filtrez les entrées syslog liées au cluster:

sudo tail -f /var/log/syslog | grep -i dserver

Avec cette commande, vous verrez une sortie similaire à celle ci-dessous qui indique que tous les membres du cluster sont en ligne. L'astérisque indique quel maître est le serveur de coordination.

Output-------------------+------+------------------------------------+-----+---------+-------------------+
|Name              |Status|Databases                           |Conns|StartedOn|Binary                    |
-------------------+------+------------------------------------+-----+---------+-------------------+
|orientdb-replica-1|ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|4    |01:26:00 |111.111.111.111
|orientdb-master-2 |ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|4    |01:25:13 |222.222.222.222
|orientdb-master-1*|ONLINE|GratefulDeadConcerts=ONLINE (MASTER)|6    |01:24:46 |333.333.333.333

C'est un bon signe, car si les serveurs et leurs bases de données sont en ligne, il y a de fortes chances que le cluster fonctionne correctement. Vous verrez également une sortie similaire mais avec plus d’informations lorsque vous vous connecterez à l’une des bases de données à partir de la console ci-dessous. Vous pouvez frapperCTRL+C pour arrêter cette sortie pour le moment.

Pour vérifier la réplication des données sur les nouvelles données du cluster, vous devez générer des données sur un serveur, puis vérifier si elles sont répliquées sur les autres. On one of the master servers, lancez la console à l'aide de la paire de commandes suivante:

cd /opt/orientdb/bin
sudo ./console.sh

La dernière commande devrait donner la sortie suivante lors du lancement de la console, en changeant votre invite enorientdb>.

OutputOrientDB console v.2.2.17 (build UNKNOWN@r98dbf8a2b8d43e4af09f1b12fa7ae9dfdbd23f26; 2017-02-02 07:01:26+0000) www.orientdb.com
Type 'help' to display all the supported commands.
Installing extensions for GREMLIN language v.2.6.0

orientdb>

Connectez-vous maintenant à l'instance de serveur OrientDB. Cette commande se connecte simplement à l'instance d'OrientDB exécutée sur le serveur en utilisant le compte utilisateurroot, et non à aucune base de données. Le mot de passe est celui que vous avez créé à l'étape 3:

connect remote:localhost root root-password

Ensuite, créons une base de données nomméeCallMeMaybe:

create database remote:localhost/CallMeMaybe root root-password plocal

Si la base de données a été créée avec succès, vous vous y connecterez et votre invite devrait changer pour correspondre.

[.note] #Note: Si vous obtenez une erreur indiquant «Autorisation refusée» ou similaire, vérifiez les autorisations sur le répertoire/opt/orientdb/databases. Le compte créant la base de données à partir de la console doit disposer des autorisations de lecture et d'écriture sur ce dossier. Vous pouvez en savoir plus dansthis Linux permissions tutorial.
#

À l'heure actuelle,CallMeMaybe n'est encore qu'une base de données vide. Juste pour avoir des données de test, ajoutons une classe:

create class Artist

Puis insérez un disque dedans:

insert into Artist (id, name, age) values (01,'sammy', 35)

Vérifiez que la nouvelle base de données contient maintenant l'enregistrement que vous venez d'insérer:

select id, age, name from Artist

Si tout s'est bien passé, le résultat devrait ressembler à ceci:

Output+----+----+----+------+
|#   |id  |age |name  |
+----+----+----+------+
|0   |1   |35  |sammy |
+----+----+----+------+

1 item(s) found. Query executed in 0.216 sec(s).

Vous pouvez quitter la console maintenant.

exit

La dernière étape de ce processus de vérification consiste à vous connecter à un autre nœud du cluster et à interroger la nouvelle base de données pour voir si les données se sont propagées correctement.

ssh sammy@another_orientdb_server_ip

Lancez la console comme avant.

cd /opt/orientdb/bin
sudo ./console.sh

Connectez-vous à la base de données en tant queadmin, qui est un utilisateur et un mot de passe par défaut de toute nouvelle base de données OrientDB.

connect remote:localhost/CallMeMaybe admin admin

Effectuez la même requête que précédemment.

select id, age, name from Artist

La sortie doit être la même que celle du serveur précédent - comme il se doit, car vous effectuez des requêtes sur un cluster de serveurs. Vous pouvez maintenant quitter la console.

exit

Cela confirme que votre cluster à trois nœuds fonctionne correctement.

Conclusion

Vous avez configuré un cluster OrientDB composé de trois nœuds jouant différents rôles (maître ou réplica). Avec une configuration comme celle-ci, il est facile de changer le nombre de nœuds. Ce qui sera encore plus facile, plus amusant et moins de tâches serait d'utilisera configuration management tool like Ansible pour automatiser le déploiement d'un cluster comme celui-ci.

Pour l'instant, vous voudrez peut-être faire estconsult this OrientDB security guide pour apprendre à sécuriser chaque nœud du cluster. La documentation officielle sur l'administration d'OrientDB est disponible auproject’s documentation site, et pour plus d'informations sur Hazelcast, visitezthe Hazelcast documentation.

Related