Elasticsearch i Docker - skalowalność, wysoka dostępność i zarządzanie zasobami

Post on 12-Apr-2017

627 views 2 download

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

$ 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%

Krótkie Podsumowanie

http://www.soothetube.com/2013/12/29/thats-all-folks/