2017-03-07 4 views
1

Ich versuche, ein Nginx als Load Balancer vor einem Elastic Search Cluster (Version 1.3.7) zu konfigurieren.Nginx als elasticsearch Loadbalancer hat geringe Leistung

Ich teste von 3 Benchmark-Servern zu 3 Elasticsearch-Knoten in einem Cluster. Mit Nginx als LoadBalancer habe ich eine Leistungsminderung von ca. 50%.

Ich bin in der Lage, 28K Anfragen in 300 Sekunden ohne die Nginx aber damit, nur 13k in 300 Sekunden zu behandeln. Die Server sind VM, sollte also kein Netzwerkproblem sein, zumindest ein physisches. Der Nginx-Server hat keine hohe CPU-Last oder eine Begrenzung seiner Ressourcen.

Config ist ziemlich einfach:

user www-data; 
worker_processes auto; 
pid /run/nginx.pid; 
include /etc/nginx/modules-enabled/*.conf; 

worker_rlimit_nofile 4096; 

events { 
     worker_connections 1024; 
} 

und die spezifisch für ES:

server { 
    listen  9100; 
    server_name elasticsearch.site.com; 
    location/{ 
     proxy_pass http://elasticsearch; 
     proxy_http_version 1.1; 
     proxy_set_header Connection ""; 
     proxy_set_header Proxy-Connection "Keep-Alive"; 
    } 
    access_log /var/log/nginx/access.log; 
    error_log /var/log/nginx/error.log error; 
} 

upstream elasticsearch { 
    server elasticsearch1:9200; 
    server elasticsearch2:9200; 
    server elasticsearch3:9200; 
    keepalive 15; 
} 

ich wissen wollen, ob es eine Möglichkeit, zu verstehen, warum nginx nicht mehr Anfragen pro Sekunde liefern kann, oder wenn es eine Möglichkeit gibt, diese Fälle zu debuggen. Zeitüberschreitungen verstehen, Verbindung aufrecht erhalten oder jede andere von nginx gehandhabte Ressource wäre großartig.

+0

Versuchen Sie Haproxy vielleicht? Wenn Sie vor allem eine Art Lastausgleich wünschen. – Sobrique

+0

Ich bin nicht überrascht, wenn Pufferung der Grund für die Langsamkeit Ihrer Anwendung ist. Zwei Konfigurationsoptionen für die Optimierung: [proxy_buffering] (http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffering) und [proxy_request_buffering] (http://nginx.org/en/docs/http/) ngx_http_proxy_module.html # proxy_request_buffering). – Anatoly

Antwort

1

Sie benötigen keinen Load Balancer - ES stellt diese Funktionalität bereits bereit. Sie fügen nur eine weitere Komponente hinzu, die sich möglicherweise nicht richtig verhält und einen unnötigen Netzwerksprung nach sich zieht. Geh für dns Round Robin.

ES wird Ihre Daten shard (standardmäßig in 5 Shards), die es versuchen wird, gleichmäßig unter Ihren Instanzen zu verteilen. Passen Sie Shards und Replikate abhängig von Ihrer Umgebung an.

+1

Ich habe versucht, den Proxy-Server als ES-Client-Knoten und die Leistung ist etwas besser, 15K in 300 Sekunden, immer noch weit von einer idealen Situation. Durch das Hinzufügen eines LB wird die Infrastruktur der Plattform von Code isoliert. Es ist einfacher, den Cluster zu verschieben oder Änderungen an ES-Knoten vorzunehmen, ohne Codeänderungen vorzunehmen. Der Endpunkt wird immer derselbe sein. – bvcelari

Verwandte Themen