Est-il inutile d'utiliser un équilibreur de charge avec ElasticSearch?

j'ai un groupe de 3 noeuds ElasticSearch fonctionnant sur AWS EC2. Ces noeuds sont configurés avec OpsWorks / Chef. Mon intention est de concevoir ce cluster pour être très résilient et élastique (les noeuds peuvent entrer et sortir au besoin).

de tout ce que j'ai lu sur ElasticSearch, il semble que personne ne recommande de mettre un équilibreur de charge devant le cluster; à la place, il semble que la recommandation est de faire l'une des deux choses:

  1. Pointez votre client à L'URL / IP d'un noeud, laisse ES faire l'équilibrage de charge pour vous et espérer que le noeud ne descend jamais.

  2. hard-code les URLs / IPs de tous vos noeuds dans votre application client et avoir l'application gérer la logique de basculement.

mon arrière-plan est principalement dans les fermes web où il est juste de bon sens de créer un énorme bassin de serveurs web autonomes, jeter une Elbe en face d'eux et laisser le répartiteur de charge décider quels noeuds sont vivants ou morts. Pourquoi ES ne semble pas pour soutenir cette même architecture?

43
demandé sur Community 2014-07-15 10:13:29

3 réponses

Vous n'avez pas besoin d'un équilibreur de charge - ES fournit déjà cette fonctionnalité. Vous auriez juste un autre composant, qui pourrait mal se conduire et qui ajouterait un saut réseau inutile.

ES partagera vos données (par défaut en 5 fragments), qu'il essaiera de distribuer également parmi vos instances. Dans votre cas 2 cas devraient avoir 2 tessons et 1 un seul, mais vous pourriez vouloir changer les tessons à 6 pour une distribution égale.

par défaut, la réplication est définie "number_of_replicas":1, donc une réplique de chaque fragment. En supposant que vous utilisez 6 fragments, il pourrait ressembler à quelque chose comme ceci (R est un fragment répliqué):

  • node0: 1, 4, R3, R6
  • node1: 2, 6, R1, R5
  • node2: 3, 5, R2, R4

en supposant que node1 meurt, le cluster changerait pour la configuration suivante:

  • node0: 1, 4, 6, R3 + nouvelles répliques R5, R2
  • node2: 3, 5, 2, R4 + nouvelles répliques R1, R6

selon vos paramètres de connexion, vous pouvez vous connecter à une instance (transport client) ou vous pouvez rejoindre le cluster (noeud client). Avec le client node, vous éviterez les doubles sauts, puisque vous vous connecterez toujours à l'indice / fragment correct. Avec le client transport, vos requêtes seront acheminées à la bonne instance.

alors il n'y a rien pour charger l'équilibre pour vous-même, vous n'avez qu'à ajouter les frais généraux. L'auto-clustering est probablement le plus grand force.

14
répondu xeraa 2014-07-15 18:14:08

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 des documents et 2. Interrogeant Des Documents.

Rédaction / indexation de documents dans elasticsearch:

  1. quand un nouveau document entre dans Elasticsearch pour être indexé, Elasticsearch détermine le" fragment primaire "auquel le document doit être affecté en utilisant l '"algorithme de routage du fragment"
  2. La Lucene processus associés à l'éclat des "cartes" les champs dans le document;
  3. La Lucene processus ajoute le document à l'éclat de Lucene "index inversé"
  4. tout "fragment(s) de réplique" reçoit alors le document; le fragment de réplique "trace" le document et l'ajoute au Lucène du fragment de réplique "inversé l'indice"

Interrogation de documents dans Elasticsearch:

  1. par défaut, lorsqu'une requête est envoyée à Elasticsearch, la requête frappe un noeud -- cela devient le "noeud de requête" ou le" noeud de requête passerelle " pour cette requête
  2. le noeud diffuse la requête à chaque fragment de l'index (primaire & réplique)
  3. chaque fragment effectue une requête sur L'index inversé local du fragment.
  4. chaque fragment renvoie le top 10-20 résultats pour "porte de la requête nœud"
  5. le" noeud de requête de passerelle " effectue alors un merge-sort sur les résultats combinés retournés par les autres fragments,
  6. une fois que le tri merge-sort est terminé ,le "noeud de requête de passerelle" et renvoie les résultats au client
    • la fusion-sorte est CPU et la ressource mémoire lourde

Architecte d'un Équilibreur de Charge pour les Écritures / Indexation / Jour

Elasticsearch auto gère l'emplacement des éclats sur les noeuds. Le " noeud maître "conserve et met à jour la"table de routage shard". Le "noeud maître" fournit une copie de la table de routage shard aux autres noeuds du cluster.

en général, vous ne voulez pas que votre noeud maître fasse plus que des contrôles de santé pour le cluster et la mise à jour des tables de routage, et la gestion des fragments.

il est probablement préférable de pointer le compensateur de charge pour les Écritures vers les "noeuds de données" (les noeuds de données sont des noeuds qui contiennent des données = shards) et laisser les noeuds de données utiliser leurs tables de routage shard pour obtenir les Écritures aux shards corrects.

architecture pour les requêtes

Elasticsearch a créé un type de noeud spécial: "client node", qui contient "no data", et ne peut pas devenir un "master node". La fonction du noeud client est d'effectuer le tri-merge-lourd de ressource finale à la fin de la requête.

pour AWS vous utiliseriez probablement un type d'instance c3 ou c4 comme "client" nœud"

la meilleure pratique est de pointer l'équilibreur de charge pour les requêtes vers les noeuds clients.

Cheers!

Références:

  1. Elasticsearch Types De Nœud
  2. Elasticsearch: Fragment D'Algorithme De Routage
  3. Elasticsearch: Réplique D'Éclats
  4. Elasticsearch: l'État d'un Cluster c'est à dire le Fragment de Routage La Table
  5. ElasticHQ - Introduction à Elasticsearch Vidéo
  6. Elasticsearch: Eclat nombre et le dimensionnement des Clusters
46
répondu Manchego 2015-09-03 20:29:47

vous avez tout à fait raison de vouloir concevoir pour 'failover', et dans AWS, voici comment je vous recommande de le faire.

1) limitez les noeuds de votre cluster qui peuvent être élus maître. Pour le reste, l'ensemble de nœud.client: vrai. Basez votre choix de combien de noeuds maître vous avez sur le nombre de noeuds que vous voulez disponibles pour le basculement.

2) Créer une Elbe qui n'inclut que les noeuds principaux.

3) sur la Route 53, créez un CNAME pour votre cluster, avec la valeur définie au nom DNS de votre Elbe.

10
répondu GlenRSmith 2014-07-23 20:15:15