Comment configurer le cluster ElasticSearch avec mise à l'échelle automatique sur Amazon EC2?
Il y a un excellent tutoriel elasticsearch sur ec2 sur la configuration de ES sur Amazon EC2. Je l'ai étudié et appliqué toutes les recommandations.
Maintenant, j'ai AMI et je peux exécuter n'importe quel nombre de nœuds dans le cluster à partir de cet AMI. La découverte automatique est configurée et les nœuds rejoignent le cluster comme ils le devraient vraiment.
La question Est Comment configurer le cluster de manière à pouvoir lancer/terminer automatiquement les nœuds en fonction de la charge du cluster?
Par exemple je veux avoir seulement 1 nœud en cours d'exécution lorsque nous n'avons aucune charge et 12 nœuds en charge de pointe. Mais attendez, si je termine 11 nœuds dans le cluster, que se passerait-il avec les fragments et les répliques? Comment s'assurer que je ne perds aucune donnée dans le cluster si je termine 11 nœuds sur 12 nœuds?
Je pourrais vouloir configurer S3 Gateway pour cela. Mais toutes les passerelles à l'exception de local sont obsolètes.
Il y a un article dans le manuel à propos de éclats d'allocation. Je suis peut-être il manque quelque chose de très basique mais je dois admettre que j'ai échoué à comprendre s'il est possible de configurer un nœud pour toujours contenir toutes les copies de fragments . Mon but est de m'assurer que si ce serait le seul nœud en cours d'exécution dans le cluster, nous ne perdons toujours aucune donnée.
La seule solution que je peux imaginer maintenant est de configurer index pour avoir 12 fragments et 12 répliques. Ensuite, lorsque jusqu'à 12 nœuds sont lancés, chaque nœud aurait une copie de chaque fragment. Mais je n'aime pas cette solution parce que je je devrais reconfigurer le cluster si je veux avoir plus de 12 nœuds en charge de pointe.
5 réponses
La mise à l'échelle automatique n'a pas beaucoup de sens avec ElasticSearch.
Le déplacement et la réallocation des fragments ne sont pas un processus léger, surtout si vous avez beaucoup de données. Il met L'accent sur les E / S et le réseau, et peut dégrader gravement les performances D'ElasticSearch. (Si vous voulez limiter l'effet, vous devez accélérer la récupération du cluster en utilisant des paramètres tels que cluster.routage.allocation.cluster_concurrent_rebalance, des indices.récupération.concurrent_streams, des indices.récupération.max_size_per_sec . Cela permettra de limiter la impact, mais ralentira également le rééquilibrage et la récupération).
Aussi, si vous vous souciez de vos données, vous ne voulez pas avoir seulement 1 nœud jamais. Vous avez besoin que vos données soient répliquées, vous aurez donc besoin d'au moins 2 nœuds (ou plus si vous vous sentez plus en sécurité avec un niveau de réplication plus élevé).
Une autre chose à retenir est que si vous pouvez changer le nombre de répliques, vous ne pouvez pas changer le nombre de fragments. Ceci est configuré lorsque vous créez votre index et ne peut pas être modifié (si vous voulez plus de fragments vous devez créer un autre index et réindexer toutes vos données). Donc, votre nombre de fragments doit prendre en compte la taille des données et la taille du cluster, compte tenu du nombre plus élevé de nœuds que vous voulez, mais aussi votre configuration minimale (moins de nœuds peuvent-ils contenir tous les fragments et servir le trafic estimé?).
Donc, théoriquement, si vous voulez avoir 2 nœuds à bas temps et 12 nœuds en pointe, vous pouvez définir votre index pour avoir 6 fragments avec 1 Réplique. Donc, sur les temps faibles, vous avez 2 nœuds qui contiennent 6 fragments chacun, et sur le pic, vous avez 12 nœuds qui contiennent 1 fragment chacun.
Mais encore une fois, je suggère fortement de repenser cela et de tester l'impact du déplacement de shard sur les performances de votre cluster.
Dans les cas où l'élasticité de votre application est pilotée par une charge de requête variable, vous pouvez configurer les nœuds es configurés pour ne stocker aucune donnée (nœud.données = false, http.enabled = true), puis mettez-les pour la mise à l'échelle automatique. Ces nœuds pourraient décharger tout le traitement de confusion HTTP et de résultat de vos nœuds de données principaux (les libérant pour plus d'indexation et de recherche).
Puisque ces nœuds n'auraient pas de fragments alloués pour les amener dynamiquement vers le haut et vers le bas ne devrait pas être un problème et la découverte automatique devraient leur permettre de rejoindre le cluster.
Je pense que c'est une préoccupation en général quand il s'agit d'utiliser une architecture auto-évolutive pour répondre aux demandes temporaires, mais les données doivent encore être sauvegardées. Je pense qu'il existe une solution qui tire parti D'EBS
-
Mappez des fragments à des volumes EBS spécifiques. Disons que nous avons besoin de 15 éclats. Nous aurons besoin de 15 Volumes EBS
Amazon vous permet de monter plusieurs volumes, donc lorsque nous démarrons, nous pouvons commencer avec quelques instances qui ont plusieurs volumes attachés à les
Comme l'augmentation de charge, nous pouvons nous tourner instance supplémentaire - jusqu'à 15.
La solution ci-dessus n'est conseillée que si vous connaissez vos exigences de capacité maximale.
Je serais tenté de suggérer de résoudre cela d'une manière différente dans AWS. Je ne sais pas quelles sont les données ES ou comment elles sont mises à jour, etc... faisant beaucoup d'hypothèses, je mettrais L'instance ES derrière un ALB (app load balancer) j'aurais un processus planifié qui crée régulièrement des amis mis à jour (si vous le faites souvent, il sera rapide à faire), puis basé sur la charge de votre serveur unique, je déclencherais plus d'instances à créer à partir de la dernière instance disponible. Ajouter le nouveau instances à L'ALB pour partager une partie de la charge. Comme cela se calme, je déclencherais la fin des instances temporaires. Si vous suivez cette voie, voici quelques autres choses à considérer
- Utilisez des instances ponctuelles car elles sont moins chères et si cela correspond à votre cas d'utilisation
- les instances " T " ne correspondent pas bien ici car elles ont besoin de temps pour construire des crédits
- Utilisez lambdas pour activer et désactiver les choses, si vous voulez être chic, vous pouvez le déclencher en fonction d'un webhook vers aws passerelle
- en faisant plus d'hypothèses sur votre cas d'utilisation, envisagez de mettre un serveur Varnish devant votre machine ES afin de pouvoir fournir une échelle à moindre coût basée sur une stratégie de cache (beaucoup d'hypothèses ici) basée sur le stress que vous pouvez composer dans le bon TTL pour l'expulsion du cache. Découvrez la fonction Soft-purge pour nos trucs ES, nous avons obtenu beaucoup de bonne valeur de cette.
- Si vous faites ce que je suggère ici, assurez-vous de faire en sorte que vos instances es générées signalent tous les journaux vers un emplacement adressable central sur la machine es persistante afin de ne pas perdre de journaux lorsque les machines meurent
Je peux vous donner une approche alternative en utilisant aws elastic search service (cela coûtera un peu plus cher que la normale ec2 elasticsearch).Écrivez un script simple qui surveille en permanence la charge (via api/cli)sur le service et si la charge dépasse le seuil, augmentez par programme les nœuds de votre cluster aws elasticsearch-service.Ici, l'avantage est qu'aws s'occupera de la mise à l'échelle(selon la documentation, ils prennent un snaphost et lancent un tout nouveau cluster).Cela fonctionnera pour l'échelle vers le bas aussi.
En ce qui concerne l'approche d'auto-mise à l'échelle, il y a des défis comme le mouvement des fragments a un impact sur le cluster existant, nous devons également être plus vigilants lors de la réduction.Vous pouvez trouver un bon article sur la réduction de ici que j'ai testé.Si vous pouvez faire une sorte d'automatisation intelligente des étapes du lien ci-dessus via des scripts (Python, shell) ou via des outils d'automatisation comme Ansible, alors la mise à l'échelle est réalisable.Mais encore une fois, vous devez commencer la mise à l'échelle bien avant les limites normales, car les activités de mise à l'échelle peuvent avoir un impact sur le cluster existant.
Question: est-il possible de configurer un nœud pour toujours contenir toutes les copies de fragments?
Réponse: Oui, c'est possible par un routage de fragments explicite.Plus de détails ici