Elasticsearch i Docker - skalowalność, wysoka dostępność i zarządzanie zasobami
-
Upload
enterprise-search-warsaw-meetup -
Category
Software
-
view
627 -
download
2
Transcript of Elasticsearch i Docker - skalowalność, wysoka dostępność i zarządzanie zasobami
Elasticsearch i Docker
Rafał Kuć – Sematext Group, Inc.@kucrafal @sematext sematext.com
SkalowalnośćWysoka Dostępność
Zarządzanie Zasobami
Kilka słów o mnie…
Sematext – konsultant i inżynierSolr.pl współzałożycielOjciec i mąż:)
Następne 45 minut
Na pewno znamy to wszyscy
Development
Na pewno znamy to wszyscy
Development Test
Na pewno znamy to wszyscy
Development Test QA
Na pewno znamy to wszyscy
Development Test QA
Produkcja
I problemy z tym związane
Nie wykorzystywane zasoby
I problemy z tym związane
Nie wykorzystywane zasoby
Maszyn więcejniż potrzeba
I problemy z tym związane
Nie wykorzystywane zasoby
Maszyn więcejniż potrzeba
≠ ≠
Rozwiązanie
Development Test QA Produkcja
Technologie kontenerów
Docker – czyli co?
Lekki
Oparty o otwarte standardy
Bezpieczny
Kontenery vs maszyny wirtualne
Hardware
Tradycyjna Maszyna Wirtualna
Kontenery vs maszyny wirtualne
Hardware
Host Operating System
Tradycyjna Maszyna Wirtualna
Kontenery vs maszyny wirtualne
Hardware
Host Operating System
Hypervisor
Tradycyjna Maszyna Wirtualna
Kontenery vs maszyny wirtualne
Hardware
Host Operating System
Hypervisor
Guest OS Guest OS
Tradycyjna Maszyna Wirtualna
Kontenery vs maszyny wirtualne
Hardware
Host Operating System
Hypervisor
Guest OS Guest OS
Libraries Libraries
Tradycyjna Maszyna Wirtualna
Kontenery vs maszyny wirtualne
Hardware
Host Operating System
Hypervisor
Guest OS Guest OS
Libraries Libraries
Application 1 Application 2
Tradycyjna Maszyna Wirtualna
Kontenery vs maszyny wirtualne
Hardware
Host Operating System
Hypervisor
Guest OS Guest OS
Libraries Libraries
Application 1 Application 2
Hardware
Host Operating System
Tradycyjna Maszyna WirtualnaKontener
Kontenery vs maszyny wirtualne
Hardware
Host Operating System
Hypervisor
Guest OS Guest OS
Libraries Libraries
Application 1 Application 2
Hardware
Host Operating System
Docker Engine
Tradycyjna Maszyna WirtualnaKontener
Kontenery vs maszyny wirtualne
Hardware
Host Operating System
Hypervisor
Guest OS Guest OS
Libraries Libraries
Application 1 Application 2
Hardware
Host Operating System
Docker Engine
Libraries Libraries
Application 1 Application 2
Tradycyjna Maszyna WirtualnaKontener
Czym jest Elasticsearch?
Rozsądne wartości
domyślne { JSON }
Distributed by design
http://www.dailypets.co.uk/2007/06/17/kittens-rest-at-half-time/
Uruchamianie oficjalnego kontenera
$ docker run -d elasticsearch
Uruchamianie oficjalnego kontenera
$ docker run -d elasticsearch == docker run -d elasticsearch:latest
Uruchamianie oficjalnego kontenera
$ docker run -d elasticsearch:1.7
$ docker run -d elasticsearch == docker run -d elasticsearch:latest
Uruchamianie oficjalnego kontenera
$ docker run -d elasticsearch == docker run -d elasticsearch:latest
$ docker run --name es_1 -h es_master_1 elasticsearch
$ docker run -d elasticsearch:1.7
Uruchamianie oficjalnego kontenera
$ docker run -d elasticsearch == docker run -d elasticsearch:latest
$ docker run --name es_1 -h es_master_1 elasticsearch
$ docker run -d elasticsearch:1.7
Ograniczanie kontenerów
$ docker run -d -m 2G elasticsearch
http://docs.docker.com/engine/reference/run/
Ograniczanie kontenerów
$ docker run -d -m 2G elasticsearch
$ docker run -d -m 2G --memory-swappiness=0 elasticsearch
http://docs.docker.com/engine/reference/run/
Ograniczanie kontenerów
$ docker run -d -m 2G elasticsearch
$ docker run -d -m 2G --memory-swappiness=0 elasticsearch
$ docker run -d --cpuset-cpus="1,3" elasticsearch
http://docs.docker.com/engine/reference/run/
Ograniczanie kontenerów
$ docker run -d -m 2G elasticsearch
$ docker run -d -m 2G --memory-swappiness=0 elasticsearch
$ docker run -d --cpuset-cpus="1,3" elasticsearch
http://docs.docker.com/engine/reference/run/
$ docker run -d --cpu-period=50000 --cpu-quota=25000 elasticsearch
Tworzenie zoptymalizowanego obrazu
Dockerfile:FROM elasticsearchADD ./elasticsearch.yml /usr/share/elasticsearch/config/
Tworzenie zoptymalizowanego obrazu
Dockerfile:FROM elasticsearchADD ./elasticsearch.yml /usr/share/elasticsearch/config/
$ docker build -t devops/example .
Tworzenie zoptymalizowanego obrazu
Dockerfile:FROM elasticsearchADD ./elasticsearch.yml /usr/share/elasticsearch/config/
$ docker build -t devops/example .
Sending build context to Docker daemon 3.072 kBStep 1 : FROM elasticsearch ---> 8112755253f1Step 2 : ADD ./elasticsearch.yml /usr/share/elasticsearch/config/ ---> Using cache ---> c9ca48a22e58Successfully built c9ca48a22e58
Radzimy sobie z siecią
$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch
Radzimy sobie z siecią
$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch
$ docker run -d elasticsearch -Dnetwork.publish_host=192.168.1.1
Radzimy sobie z siecią
$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch
$ docker run -d elasticsearch -Dnetwork.publish_host=192.168.1.1
$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch -Dnetwork.publish_host=192.168.1.1
Radzimy sobie z siecią
$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch
$ docker run -d elasticsearch -Dnetwork.publish_host=192.168.1.1
$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch -Dnetwork.publish_host=192.168.1.1
$ docker run -d -p 9200:9200 -p 9300:9300 elasticsearch -Dnetwork.publish_host=0.0.0.0
Sieć – Dobre praktyki
Oddzielna, izolowana sieć dla klastra Elasticsearch
Sieć – Dobre praktyki
Oddzielna, izolowana sieć dla klastra Elasticsearch
Wspólne nazewnictwo instancji$ docker run -d -h es_node_1 elasticsearch
Sieć – Dobre praktyki
Oddzielna, izolowana sieć dla klastra Elasticsearch
Wspólne nazewnictwo instancji$ docker run -d -h es_node_1 elasticsearch
Otwieranie portów 9200 i 9300 tylko dla instancji klientów
Sieć – Dobre praktyki
Oddzielna, izolowana sieć dla klastra Elasticsearch
Wspólne nazewnictwo instancji$ docker run -d -h es_node_1 elasticsearch
Otwieranie portów 9200 i 9300 tylko dla instancji klientów
Instancje data i client wskazują tylko na instance masters
Dane i Docker
Domyślnie w /usr/share/elasticsearch/data w kontenerze
Dane i Docker
Domyślnie w /usr/share/elasticsearch/data w kontenerze
Usuwane podczas restartu kontenera
Dane i Docker
$ docker run -d -v /opt/elasticsearch/data:/usr/share/elasticsearch/data elasticsearch
Domyślnie w /usr/share/elasticsearch/data w kontenerze
Usuwane podczas restartu kontenera
Uprawnienia
Kontenery data only
Omijają Union File System
Kontenery data only
Omijają Union File System
Mogą być współdzielone przez wiele kontenerów
Kontenery data only
Omijają Union File System
Mogą być współdzielone przez wiele kontenerów
Dane są przechowywane nawet po usunięciu kontenera
Kontenery data only
Omijają Union File System
Mogą być współdzielone przez wiele kontenerów
Dane są przechowywane nawet po usunięciu kontenera
$ docker create -v /mnt/es/data:/usr/share/elasticsearch/data --name esdata elasticsearch
Uprawnienia
Kontenery data only
Omijają Union File System
Mogą być współdzielone przez wiele kontenerów
Dane są przechowywane nawet po usunięciu kontenera
$ docker create -v /mnt/es/data:/usr/share/elasticsearch/data --name esdata elasticsearch
$ docker run --volumes-from esdata elasticsearch
Uprawnienia
Wysoka dostępność
Master
Master
Master
Data
Data
Data
Data
Data
Data
Client
Client
Wysoka dostępność
Master
Master
Master
Data
Data
Data
Data
Data
Data
Client
Client
minimum_master_nodes = N/2 + 1
Wysoka dostępność
Master
Master
Master
Data
Data
Data
Data
Data
Data
Client
Client
minimum_master_nodes = N/2 + 1recovery.after.nodes
recovery.expected.nodes cluster.routing.allocation.node_concurrent_recoveries
index.unassigned.node_left.delayed_timeoutindex.priority
Elasticsearch Master i Docker
$ docker run -d elasticsearch -Dnode.master=true -Dnode.data=false -Dnode.client=false
Elasticsearch Client i Docker
$ docker run -d elasticsearch -Dnode.master=false -Dnode.data=false -Dnode.client=true
Elasticsearch Data i Docker
$ docker run -d elasticsearch -Dnode.master=false -Dnode.data=true -Dnode.client=false
Skalowalność
Elasticsearch Elasticsearch
Elasticsearch Elasticsearch
Skalowalność
curl -XPUT 'http://localhost:9200/wesm/' -d '{ "settings" : { "index" : { "number_of_shards" : 4, "number_of_replicas" : 0 } }}'
Skalowalność
P P
P P
Skalowalność
curl -XPUT 'http://localhost:9200/wesm/_settings' -d '{ "index.number_of_replicas" : 1}'
Skalowalność
P P
P P
R
R R
R
Skalowalność
curl -XPUT 'http://localhost:9200/wesm/_settings' -d '{ "index.number_of_replicas" : 2}'
Skalowalność
P P
P P
R R
R R
R R
R R
Skalowalność
curl -XPUT 'http://localhost:9200/wesm/_settings' -d '{ "index.number_of_replicas" : 1}'
Skalowalność
P P
P P
R
R R
R
Skalowalność
P P
P P
R
R R
R
Skalowalność
P P PP
UnassignedR
RR
R
Doc Values!
W 2.0 domyślne dla pól string, not_analyzed
Wykorzystywane do sortowania, agregacji i skryptów
Używane zamiast fielddata
curl -XPOST 'localhost:9200/devops' -d '{ "mappings" : { "logs" : { "properties" : { "tag" : { "type" : "string", "index" : "not_analyzed", "doc_values": true } }}}}'
Wydajność, a refresh_interval
1s -> 2K docs/sec
5s -> 2.5K docs/sec
30s -> 3.4K docs/sec
Wydajność, a refresh_interval
1s -> 2K docs/sec
5s -> 2.5K docs/sec
30s -> 3.4K docs/sec
curl -XPUT 'localhost:9200/days/_settings' -d '{ "index" : { "refresh_interval" : "5s" } }'
RAM Buffer
indices.memory.index_buffer_size: 10%indices.memory.min_index_buffer_size: 48mb
indices.memory.max_index_buffer_size (unbounded) indices.memory.min_shard_index_buffer_size: 4mb
RAM Buffer
indices.memory.index_buffer_size: 10%indices.memory.min_index_buffer_size: 48mb
indices.memory.max_index_buffer_size (unbounded) indices.memory.min_shard_index_buffer_size: 4mb
SzybszeIndeksowanie
WolniejszeIndeksowanie
domyślna
konfiguracja
><
Dane oparte o czas
2015-11-23
DZIS
TYDZIEN
Dane oparte o czas
curl -XPOST 'http://localhost:9200/_aliases' -d '{ "actions" : [ { "add" : {"index":"2015-11-23","alias":"today"} }, { "add" : {"index":"2015-11-23","alias":"week"} } ]}'
Dane oparte o czas
2015-11-23 2015-11-24
DZIS
TYDZIEN
Dane oparte o czas
curl -XPOST 'http://localhost:9200/_aliases' -d '{ "actions" : [ { "remove" : {"index":"2015-11-23","alias":"today"} }, { "add" : {"index":"2015-11-24","alias":"today"} }, { "add" : {"index":"2015-11-24","alias":"week"} } ]}'
Dane oparte o czas
2015-11-23 2015-11-24 2014-11-25
DZIS
TYDZIEN
Dane oparte o czas
curl -XPOST 'http://localhost:9200/_aliases' -d '{ "actions" : [ { "remove" : {"index":"2015-11-24","alias":"today"} }, { "add" : {"index":"2015-11-25","alias":"today"} }, { "add" : {"index":"2015-11-25","alias":"week"} } ]}'
Wiele warstw
node.tag=hot node.tag=cold node.tag=cold
Wiele warstw
curl -XPUT 'localhost:9200/data_2015-11-23' -d '{ "settings": { "index.routing.allocation.include.tag" : "hot" }}'
Wiele warstw
node.tag=hot node.tag=cold node.tag=cold
data_2015-11-23
data_2015-11-23
Wiele warstw
curl -XPUT 'localhost:9200/data_2015-11-23/_settings' -d '{ "settings": { "index.routing.allocation.exclude.tag" : "hot", "index.routing.allocation.include.tag" : "cold", }}'
Wiele warstw
node.tag=hot node.tag=cold node.tag=cold
data_2015-11-23
data_2015-11-23
Wiele warstw
curl -XPUT 'localhost:9200/data_2015-11-24' -d '{ "settings": { "index.routing.allocation.include.tag" : "hot" }}'
Wiele warstw
node.tag=hot node.tag=cold node.tag=cold
data_2015-11-23
data_2015-11-23
data_2015-11-24
data_2015-11-24
Wiele warstw
node.tag=hot node.tag=cold node.tag=cold
data_2015-11-23
data_2015-11-23
data_2015-11-25
data_2015-11-25
data_2015-11-24
data_2015-11-24
Dane zorientowane na użytkowników
Dane zorientowane na użytkowników
Hot
Hot
Cold
Cold
Cold
Cold
Dane zorientowane na użytkowników
Hot
Hot
Cold
Cold
Cold
Cold
ROUTING
Indeksowanie bez routingu
Shard 1 Shard 2 Shard 3 Shard 4
Shard 5 Shard 6 Shard 7 Shard 8
Elasticsearch
Indekser
userA
userA
userA
userAuserAuserA
userAuserA
Indeksowanie z routingiem
Shard 1 Shard 2 Shard 3 Shard 4
Shard 5 Shard 6 Shard 7 Shard 8
Elasticsearch
Indekser
user
A
Zapytania bez routingu
Shard 1 Shard 2 Shard 3 Shard 4
Shard 5 Shard 6 Shard 7 Shard 8
Elasticsearch
Aplikacja
Zapytania z routingiem
Shard 1 Shard 2 Shard 3 Shard 4
Shard 5 Shard 6 Shard 7 Shard 8
Elasticsearch
Aplikacja
Routing konta brak routingu
Queries without routing (200 shards, 1 replica)#threads Avg response time Throughput 90% line Median CPU Utilization
1 3169ms 19,0/min 5214ms 2692ms 95 – 99%
Routing konta brak routingu
Queries without routing (200 shards, 1 replica)#threads Avg response time Throughput 90% line Median CPU Utilization
1 3169ms 19,0/min 5214ms 2692ms 95 – 99%
Queries with routing (200 shards, 1 replica)#threads Avg response time Throughput 90% line Median CPU Utilization
10 196ms 50,6/sec 642ms 29ms 25 – 40%
20 218ms 91,2/sec 718ms 11ms 10 – 15%
Monitoring
https://sematext.com/spm/integrations/docker-monitoring.html
https://github.com/sematext/spm-agent-docker
Krótkie Podsumowanie
http://www.soothetube.com/2013/12/29/thats-all-folks/
Rafał Kuć @kucrafal [email protected]
Sematext @sematext http://sematext.com http://blog.sematext.com
Dziękuję!