2017-07-08 1 views
0

Nous avons un cluster ElasticSearch avec 9 noeuds avec les paramètres suivants:Déséquilibre ElasticSearch Performance

  • ElasticSearch Version 5.1.2
  • Un index dans Cluster
  • primaire Shard Stockage Taille: 3Go
  • Nombre Nombre de fragments: 5
  • Nombre de répliques: 3
  • Noeuds maîtres 1, Noeud 2 et Noeud 3 uniquement
  • Noeud-4 à nœud-9 données Seuls les nœuds
  • Aucun parent Relation enfant dans Mappages
  • Chaque noeud 24 Go de RAM, 18 Cores de CPU
  • Désactivé Swaped, augmentation de descripteur de fichier ouvert, 12 Go JVM Heap mémoire
  • Nest client adaptateur « statique » et la liste de toutes les adresses IP nœuds

Comme vous le voyez, nous avons une sur l'allocation des ressources sur nos nœuds, mais sous stress test un seul nœud utilise tout ce qu'il est fils de recherche disponibles. Comme je l'ai mentionné, nous avons 18 cœurs et selon la limite de fil de recherche par défaut, nous avons (3 * 18/2) +1 = 28 threads de recherche dans chaque nœud.
Problèmes:

  • Http Les demandes ne sont pas équilibrés
  • D'autres nœuds n'utilisent pas tous leurs sujets de recherche. Un des noeuds utilise Il est toutes les discussions et il est la file d'attente de recherche devient grand

Ce que nous avons testé:
- Utilisez un noeud coordinateur pour équilibrer les demandes (pas de changement)
Comment nous envoyer des demandes:
- Nous utilisons Elasticsearch comme un moteur de recherche et un Jmeter est utilisé pour mettre le test de stress sur les services de recherche. Services de test sont des services web qui en appellent à l'aide SearchTemplates Elasticsearch Nest Client

Open HTTP Requests and Search Thread Pool

Cpu Usages

Queru Count and Fetch Count

Toute idée est appréciée.

Répondre

0

avoir une lecture de https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/connection-pooling.html

On dirait que vous utilisez le SingleNodeConnectionPool qui est utilisé lorsque vous utilisez la faible cérémonie ElasticClient, à savoir var client = new ElasticClient(uri); Dans ce cas, toutes vos demandes seront envoyées à un noeud qui doit agir comme Coordinator node décrit ici:

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html

Une demande de recherche, par exemple, est exécuté en deux phases qui sont coordonnée par le nœud qui reçoit la demande du client - le nœud de coordination .

Dans la phase de dispersion, le nœud de coordination transmet la demande à les nœuds de données qui contiennent les données. Chaque nœud de données exécute localement la demande et renvoie ses résultats au nœud de coordination. En la phase de regroupement, le nœud de coordination réduit les résultats de chaque nœud de données en un seul jeu de résultats global.

Chaque nœud est implicitement un nœud de coordination. Cela signifie qu'un nœud dont les trois nœuds node.master, node.data et node.ingest sont définis sur false agira uniquement en tant que nœud de coordination, qui ne peut pas être désactivé. En tant que résultat , un tel nœud doit avoir suffisamment de mémoire et d'unité centrale pour pouvoir traiter la phase de regroupement en .

StaticConnectionPool ou SniffingConnectionPool serait un meilleur choix pour votre cluster.

+0

Merci Reza. Mais comme je l'ai mentionné dans ma question, nous utilisons «l'adaptateur statique et la liste de tous les IP de nœuds» de Nest Client. –