Est d'utiliser un équilibreur de charge avec ElasticSearch inutiles?
J'ai un cluster de 3 ElasticSearch noeuds sur AWS EC2. Ces nœuds sont l'installation à l'aide OpsWorks/Chef. Mon intention est de la conception de ce cluster d'être très résistant et élastique (nœuds peuvent venir et quand on en a besoin).
De tout ce que j'ai lu sur ElasticSearch, il semble que personne ne recommande de mettre un équilibreur de charge à l'avant de la grappe; au lieu de cela, il semble que la recommandation est de faire une de deux choses:
-
Point de votre client à l'URL/IP d'un nœud, laissez-ES de faire de l'équilibrage de la charge pour vous et j'espère que le nœud ne se couche jamais.
-
Coder l'Url/IPs de TOUS les nœuds dans votre application client et l'application est de gérer la logique de basculement.
Mon fond est la plupart du temps dans des batteries de serveurs web où c'est juste du bon sens pour créer une énorme piscine autonome, serveurs web, jetez un ELB en face d'eux et de laisser l'équilibrage de la charge de décider ce que les nœuds sont vivants ou morts. Pourquoi n'ES pas semblent appuyer cette même architecture?
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin d'un équilibreur de charge — ES est déjà fournir cette fonctionnalité. Vous serait juste un autre élément, qui pourrait faire des siennes et qui permettrait d'ajouter un réseau inutile hop.
ES éclat de vos données (par défaut en 5 fragments), dont il va essayer de répartir de façon égale entre vos instances. Dans votre cas 2 cas doit avoir 2 éclats et 1 d'une, mais vous souhaiterez peut-être modifier les tessons à 6 pour une répartition égale.
Par réplication par défaut est définie à
"number_of_replicas":1
, donc une réplique de chaque fragment. En supposant que vous êtes à l'aide de 6 éclats, il pourrait ressembler à quelque chose comme ceci (R est répliquée fragment):En supposant node1 meurt, le cluster de changer à la configuration suivante:
En fonction de vos paramètres de connexion, vous pouvez vous connecter à une instance de transport (client) ou vous pouvez rejoindre le cluster (nœud client). Avec le noeud de client, vous pourrez éviter la double houblon, puisque vous aurez toujours se connecter à la bonne éclat /index. Avec les transports client, votre demande sera routée vers le bon exemple.
Donc il n'y a rien à l'équilibre de la charge pour vous-même, vous devriez juste ajouter les frais généraux. L'auto-clustering est probablement ES la plus grande force de.
Je crois que l'équilibrage de la charge d'un cluster Elasticsearch est une bonne idée (de la conception d'un système à tolérance de panne, résistant à la seule défaillance d'un nœud.)
De l'architecte de votre cluster, vous aurez besoin de fond sur les deux fonctions principales d'Elasticsearch: 1. Rédaction et mise à jour de documents et 2. L'Interrogation De Documents.
Écriture /indexation de documents dans elasticsearch:
L'interrogation de documents dans Elasticsearch:
L'architecte d'un Équilibreur de Charge pour les Écritures /Indexation /Mises à jour
Elasticsearch auto gère la localisation des fragments sur les nœuds. Le "nœud maître" tient et met à jour le "fragment de la table de routage". Le "nœud maître" fournit une copie du fragment de la table de routage pour les autres nœuds du cluster.
En général, vous ne voulez pas que votre nœud principal de faire beaucoup plus de contrôles de santé pour le cluster et la mise à jour des tables de routage, et de la gestion des éclats.
Il est probablement préférable de point de l'équilibreur de charge pour les écritures pour les données de "nœuds" (les Données les nœuds sont les nœuds qui contiennent des données = tessons) et de laisser les données des nœuds de l'utilisation de leur éclat les tables de routage pour obtenir de l'écrit sur le bon de tessons.
Architecture pour les Requêtes
Elasticsearch a créé un type de nœud: "nœud client", qui contient "pas de données", et ne peut pas devenir un "nœud maître". Le nœud client a pour fonction d'effectuer la dernière ressource lourd de fusion-tri à la fin de la requête.
Pour AWS vous serais probablement utiliser une c3 ou c4 type d'instance comme un "nœud client"
La meilleure pratique est de l'équilibrage de charge pour les requêtes de client nœuds.
Cheers!
Références:
Vous avez tout à fait raison de vouloir concevoir pour "basculement", et dans AWS, voici comment je vous recommande de le faire.
1) Limiter les nœuds de votre cluster qui peut être élu maître. Pour le reste, jeu de nœud.client: vrai. La Base de votre choix de la façon dont de nombreux maîtres éligibles les nœuds que vous avez sur la façon dont beaucoup vous voulez disponible pour le basculement.
2) Créer une ELB qui ne comprend que le maître éligible nœuds.
3) En Route 53, créer un enregistrement CNAME pour votre cluster, avec la valeur définie pour le nom DNS de votre ELB.