Notions de base d'Elasticsearch (3) : déploiement en cluster d'Elasticsearch7.x

1. Architecture du cluster Elasticsearch

Le cluster Elasticsearch est un puissant moteur de recherche et d'analyse composé de plusieurs nœuds, chaque nœud étant une instance Elasticsearch indépendante. Ces nœuds fonctionnent ensemble pour créer un moteur de recherche hautement disponible et évolutif. Cet article abordera l'architecture et le déploiement des clusters Elasticsearch, y compris les nœuds maîtres, les nœuds de données, les nœuds clients, les fragments et les méthodes de communication entre les nœuds.

nœud maître

Dans un cluster Elasticsearch, il existe un nœud désigné comme nœud maître. La tâche principale du nœud maître est la gestion et la coordination du cluster. Voici quelques-unes des principales responsabilités du masternode :

  1. Maintenir l'état du cluster : le nœud maître est responsable du maintien de l'état de l'ensemble du cluster, y compris 节点列表、索引元数据和分片状态etc.

  2. Responsable du rééquilibrage du cluster : lorsque de nouveaux nœuds rejoignent ou que d'anciens nœuds quittent le cluster, le nœud maître en sera responsable 重新平衡集群,确保分片被适当地重新分配给节点,以保持负载均衡.

  3. Effectuer des opérations au niveau du cluster : le nœud maître peut effectuer des opérations au niveau du cluster, telles que la création ou la suppression d'index, la définition de paramètres au niveau de l'index, etc.

  4. Surveiller l'état du nœud : le nœud maître surveille l'état de chaque nœud du cluster et détecte si le nœud fonctionne correctement en temps opportun.

Dans un cluster, il ne peut y avoir qu'un seul nœud maître. Si le nœud maître échoue, Elasticsearch 自动选举créera un nouveau nœud maître pour prendre en charge le travail afin d'assurer le fonctionnement stable du cluster.

nœud de données

La principale responsabilité du nœud de données est 存储和处理数据. Lorsqu'un client lance une demande de recherche sur le cluster, le nœud de données interroge les données locales en fonction de la demande et renvoie les résultats. Chaque nœud de données est responsable du stockage d'une partie des données dans le cluster. Lorsque de nouvelles données sont indexées, les nœuds de données attribuent les données aux fragments correspondants et stockent les fragments sur des disques locaux. Si un nœud de données tombe en panne, d'autres nœuds du cluster prendront en charge le travail du nœud, garantissant la disponibilité des données et une sauvegarde redondante.

nœud client

Les nœuds clients ne stockent pas de données ; leur rôle principal est de fournir des données au client 集群发送查询请求,并将查询结果返回给客户端应用程序.

Les nœuds clients ont les deux rôles clés suivants :

  1. Équilibrage de charge : les nœuds clients peuvent allouer des requêtes de requête à différents nœuds de données pour réaliser un équilibrage de charge et améliorer les performances des requêtes.

  2. Basculement : si un nœud de données échoue, le nœud client peut automatiquement basculer les demandes de requête vers d'autres nœuds sains pour garantir la disponibilité du service.

Fragmentation

Dans un cluster Elasticsearch, les données sont divisées en plusieurs partitions à des fins de stockage et de gestion. Chaque fragment est un index Lucene indépendant, contenant 一部分数据和索引信息. Le partage peut être distribué et répliqué sur différents nœuds du cluster pour y parvenir 高可用性和数据冗余.

Chaque index peut être divisé en plusieurs fragments principaux et plusieurs fragments de réplique. La partition principale est l'unité de base de l'index et contient une partie des données et des informations de l'index. Chaque partition principale est un index Lucene indépendant qui peut être stocké sur n'importe quel nœud du cluster. Les fragments de réplica sont des copies des fragments principaux et sont utilisés pour améliorer l'efficacité et la disponibilité des requêtes.

Le nombre de fragments est spécifié lors de la création de l'index et ne peut pas être modifié une fois créé. Généralement, 主分片的数量应该与集群中的数据节点数量相匹配pour garantir que chaque nœud peut stocker un certain nombre de fragments.

Communication entre nœuds

Dans un cluster Elasticsearch, les nœuds communiquent entre eux sur le réseau. Chaque nœud possède un nom de nœud unique, généré automatiquement par Elasticsearch. Les noms de nœuds prennent généralement le format suivant :

<host>-<uuid>

Parmi eux, host est le nom d'hôte sur lequel se trouve le nœud et uuid est un identifiant unique utilisé pour garantir l'unicité du nom du nœud.

La communication entre les nœuds peut s'effectuer de deux manières : protocole HTTP et protocole de transport. Le protocole HTTP est le protocole par défaut d'Elasticsearch et est utilisé pour gérer les requêtes API RESTful. Le protocole Transport est un protocole utilisé en interne par le cluster Elasticsearch pour la communication directe entre les nœuds.

État du cluster

L'état du cluster Elasticsearch peut être divisé selon les trois types suivants :

  • Vert : le cluster est normal et toutes les partitions principales et répliques sont disponibles.

  • Jaune : le cluster est partiellement disponible, toutes les partitions principales sont disponibles, mais certaines partitions de réplique ne sont pas disponibles.

  • Rouge : le cluster n'est pas disponible et au moins une partition principale n'est pas disponible.

Lorsqu'un nœud d'un cluster Elasticsearch échoue, le nœud maître supprime automatiquement le nœud défaillant du cluster et redistribue les fragments attribués au nœud vers d'autres nœuds. Une fois que le nœud défaillant revient à la normale

, il rejoindra le cluster et redistribuera les fragments pour garantir l'intégrité et la disponibilité des données.

L'architecture de cluster d'Elasticsearch offre une évolutivité et une disponibilité élevées pour le stockage et la recherche de données à grande échelle, ce qui la rend idéale pour gérer des besoins complexes de recherche et d'analyse. En comprenant les différents composants et rôles de l'architecture du cluster, vous pouvez mieux planifier et gérer votre cluster Elasticsearch pour répondre aux besoins de votre entreprise.

2. Déploiement du cluster Elasticsearch

2.1 Modification de la configuration du système

2.1.1 Modifier le nombre de descripteurs de fichiers et de threads

Afin d'éviter les erreurs causées par de faibles autorisations sur les descripteurs de fichiers créables appartenant à l'utilisateur Elasticsearch, vous devez modifier le nombre de descripteurs de fichiers et de threads. Modifiez /etc/security/limits.confle fichier et ajoutez le contenu suivant :

# 文件句柄
es  soft nofile 65536
es  hard nofile 65536
# 线程
es  soft nproc 4096
es  hard nproc 4096

保存退出后,需要重新启动系统

La configuration ci-dessus consiste à résoudre :

Rapport d'erreur : le nombre maximal de descripteurs de fichiers [4096] pour le processus elasticsearch est trop faible, augmentez jusqu'à au moins [65535]
Description du problème : l'utilisateur elasticsearch dispose d'autorisations trop faibles pour créer des descriptions de fichiers, au moins 65536 sont requis ;

2.1.2 Modifier la mémoire virtuelle

Modifiez /etc/sysctl.confle fichier et ajoutez le contenu suivant :

vm.max_map_count=262144

Après avoir enregistré et quitté, actualisez le fichier de configuration :

sysctl -p

Vérifiez si la modification a réussi :

sysctl vm.max_map_count

La configuration ci-dessus vise à résoudre
le problème d'erreur : le nombre maximal de zones de mémoire virtuelle vm.max_map_count [65530] est trop faible, augmentez-le jusqu'à au moins [262144]

2.1.3 Fermer l'espace d'échange (Swap)

Recommandation officielle : donnez la moitié de la mémoire à Lucene+ et ne dépassez pas 32 Go + désactivez le swap.
ES recommande de désactiver l'espace d'échange de la mémoire d'échange et de désactiver le swap. Parce que lorsque la mémoire est échangée sur le disque, une opération de 100 microsecondes peut devenir 10 millisecondes, puis le délai d'opération de 100 microsecondes s'additionne.On peut voir que l'échange a un impact fatal sur les performances.

vim /etc/fstab

Le commentaire contient la ligne swap.
Insérer la description de l'image ici
Avant le commentaire :
Insérer la description de l'image ici

保存退出后需要系统重启!

Après commentaire :
Insérer la description de l'image ici

2.2 Téléchargez la base de données es et téléchargez-la sur le serveur

Téléchargez Elasticsearch 7.17.11 , téléchargez-le sur le serveur et utilisez la commande suivante pour décompresser Elasticsearch :

cd /mnt/data/es-cluster
tar -zxvf elasticsearch-7.17.11-linux-x86_64.tar.gz

Faites 3 copies et nommez-les comme suit :
Insérer la description de l'image ici

2.3 Modifier le fichier de configuration du cluster

2.3.1 Description de l'élément de configuration elasticsearch.yml

Éléments de configuration Instructions de configuration Exemple de configuration
cluster.nom Nom du cluster es-cluster
noeud.nom Nom du nœud noeud1
chemin.données répertoire de données /home/es/chemin/node/data
chemin.logs Répertoire des journaux /home/es/path/node/logs
noeud.nom Nom du nœud noeud1
réseau.hôte Lier l'adresse IP 127.0.0.1
http.port Spécifier le port d'accès au service 9201
transport.tcp.port Spécifiez le port d'appel du client API 9301
découverte.seed_hosts Adresse de communication du cluster ["127.0.0.1:9301", "127.0.0.1:9301:9302", "127.0.0.1:9301:9303"]
cluster.initial_master_nodes Informations sur les nœuds pouvant être sélectionnées pour l'initialisation du cluster ["127.0.0.1:9301", "127.0.0.1:9301:9302", "127.0.0.1:9301:9303"]
http.cors.enabled Activer la prise en charge de l'accès inter-domaines vrai
http.cors.allow-origin Noms de domaine autorisés pour l'accès entre domaines "*"

Les affectations de ports sont les suivantes :

Hôte Nom du nœud Port HTTP Port de transport
192.168.0.119 noeud1 9201 9301
192.168.0.119 noeud2 9202 9302
192.168.0.119 noeud3 9203 9303

2.3.2 Modifier les informations de configuration du nœud node1

vim /mnt/data/es-cluster/elasticsearch-7.17.11-node1/config/elasticsearch.yml

elasticsearch.yml

# 集群名称
cluster.name: es-cluster
#节点名称
node.name: node1
# 绑定IP地址
network.host: 192.168.0.119
# 数据目录
path.data: /mnt/data/es-cluster/elasticsearch-7.17.11-node1/data
# 日志目录
path.logs: /mnt/data/es-cluster/elasticsearch-7.17.11-node1/logs
# 指定服务访问端口
http.port: 9201
# 指定API端户端调用端口
transport.tcp.port: 9301
#集群通讯地址
discovery.seed_hosts: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
# 单机启动es实例的个数
node.max_local_storage_nodes: 3

2.3.2 Modifier les informations de configuration du nœud node2

vim /mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/config/elasticsearch.yml

elasticsearch.yml

# 集群名称
cluster.name: es-cluster
#节点名称
node.name: node2
# 绑定IP地址
network.host: 192.168.0.119
# 数据目录
path.data: /mnt/data/es-cluster/elasticsearch-7.17.11-node2/data
# 日志目录
path.logs: /mnt/data/es-cluster/elasticsearch-7.17.11-node2/logs
# 指定服务访问端口
http.port: 9202
# 指定API端户端调用端口
transport.tcp.port: 9302
#集群通讯地址
discovery.seed_hosts: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
# 单机启动es实例的个数
node.max_local_storage_nodes: 3

2.3.3 Modifier les informations de configuration du nœud node3

vim /mnt/sdb/es-cluster/elasticsearch-7.17.11-node3/config/elasticsearch.yml

elasticsearch.yml

# 集群名称
cluster.name: es-cluster
#节点名称
node.name: node3
# 绑定IP地址
network.host: 192.168.0.119
# 数据目录
path.data: /mnt/data/es-cluster/elasticsearch-7.17.11-node3/data
# 日志目录
path.logs: /mnt/data/es-cluster/elasticsearch-7.17.11-node3/logs
# 指定服务访问端口
http.port: 9203
# 指定API端户端调用端口
transport.tcp.port: 9303
#集群通讯地址
discovery.seed_hosts: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#集群初始化能够参选的节点信息
cluster.initial_master_nodes: ["192.168.0.119:9301", "192.168.0.119:9302","192.168.0.119:9303"]
#开启跨域访问支持,默认为false
http.cors.enabled: true
##跨域访问允许的域名, 允许所有域名
http.cors.allow-origin: "*"
# 单机启动es实例的个数
node.max_local_storage_nodes: 3

2.4 Créer des utilisateurs et des groupes Elasticsearch

Créez un utilisateur nommé "es" et un groupe nommé "es" et ajoutez l'utilisateur au groupe :

# 新建群组es
 groupadd es
# 新建用户es并指定群组为es
 useradd -g es es
# 设置用户密码 
 passwd es  
# usermod 将用户添加到某个组group
 usermod -aG root es

2.5 Définir les autorisations du répertoire

Définissez l'utilisateur et le groupe auxquels appartient le répertoire du cluster Elasticsearch :

chown -R es:es /mnt/data/es-cluster

2.6. Démarrez le service Elasticsearch

2.6.1 Configurer la mémoire de démarrage (facultatif)

Si la taille de la mémoire d'une seule machine est limitée, vous pouvez définir la taille de la mémoire de démarrage sur es. Entrez respectivement le répertoire /config des trois nœuds, exécutez vim jvm.optionset modifiez la configuration.

-Xms512m
-Xmx512m

Insérer la description de l'image ici

2.6.2 Créer des scripts pour démarrer et arrêter les services

Créer 三个es节点un script pour démarrer et arrêter le service Elasticsearch
( 注意当前目录是在 ../elasticsearch-7.17.11-node1)

  • startes-single.sh

    #!/bin/bash
    cd "$(dirname "$0")"
    # -d:后台(daemon)方式运行 Elasticsearch
    ./bin/elasticsearch -d -p pid
    
  • stopes-single.sh

    #!/bin/bash
    cd "$(dirname "$0")"
    if [ -f "pid" ]; then
      pkill -F pid
    fi
    
  • Accordez des autorisations d'exécution :

    chmod 755 startes-single.sh stopes-single.sh
    chown es:es startes-single.sh stopes-single.sh
    
  • Démarrez le service Elasticsearch en tant qu'utilisateur Elasticsearch :

    su es
    cd /mnt/sdb/es-cluster/elasticsearch-7.17.11-node1
    ./startes-single.sh
    

Erreurs possibles :

  1. échec d'obtention des verrous de nœud, tentative de [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] avec l'ID de verrouillage [0] ; peut-être que ces emplacements ne sont pas accessibles en écriture ou que plusieurs nœuds ont été démarrés sans augmenter
][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node2] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to obtain node locks, tried [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:173) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:160) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112) ~[elasticsearch-cli-7.17.11.jar:7.17.11]
        at org.elasticsearch.cli.Command.main(Command.java:77) ~[elasticsearch-cli-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:125) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80) ~[elasticsearch-7.17.11.jar:7.17.11]
Caused by: java.lang.IllegalStateException: failed to obtain node locks, tried [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
        at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:328) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.node.Node.<init>(Node.java:429) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.node.Node.<init>(Node.java:309) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:234) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:234) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434) ~[elasticsearch-7.17.11.jar:7.17.11]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:169) ~[elasticsearch-7.17.11.jar:7.17.11]
        ... 6 more
uncaught exception in thread [main]
java.lang.IllegalStateException: failed to obtain node locks, tried [[/mnt/sdb/es-cluster/elasticsearch-7.17.11-node2/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
        at org.elasticsearch.env.NodeEnvironment.<init>(NodeEnvironment.java:328)
        at org.elasticsearch.node.Node.<init>(Node.java:429)
        at org.elasticsearch.node.Node.<init>(Node.java:309)
        at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:234)
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:234)
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:434)
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:169)
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:160)
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:77)
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:112)
        at org.elasticsearch.cli.Command.main(Command.java:77)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:125)
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:80)

Solution : ajoutez : node.max_local_storage_nodes : 3 au fichier de configuration.
Cette configuration limite le nombre d'instances de stockage ES pouvant être ouvertes sur un seul nœud. Si vous devez démarrer plusieurs instances sur une seule machine, vous devez écrire cette configuration dans le fichier de configuration et attribuer une valeur de 2 ou supérieure à cette configuration.

2.7 Ouvrir les ports du pare-feu

CentOS

# 查看防火墙状态
systemctl status firewalld
# 查看开放的端口
firewall-cmd --query-port=9200/tcp
# 添加端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent
# 重载防火墙
firewall-cmd --reload
# 再次查看端口是否已经开放
firewall-cmd --query-port=9200/tcp

Ubuntu

# 查看防火墙状态
sudo ufw status
# 开放端口 9200
sudo ufw allow 9200/tcp
# 查看已添加的规则
sudo ufw status numbered
# 查看防火墙状态
sudo ufw status

2.8 Afficher l'état de démarrage du logiciel

  1. Accédez respectivement aux ports http de trois nœuds
    Insérer la description de l'image ici
  2. Afficher l'état du nœud
http://192.168.0.119:9201/_cat/nodes?pretty

Vous pouvez voir les informations de trois nœuds, et les trois nœuds éliront eux-mêmes le nœud maître (ES est une implémentation améliorée basée sur l'algorithme d'élection Bully)
Insérer la description de l'image ici

  1. Afficher l'état de santé du cluster
http://192.168.0.119:9201/_cluster/health?pretty

Insérer la description de l'image ici

4.Vue d'en-tête Elasticsearch

Insérer la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/qq_29864051/article/details/133434502
conseillé
Classement