# Домашнее задание к занятию "6.5. Elasticsearch" ## Задача 1 В этом задании вы потренируетесь в: - установке elasticsearch - первоначальном конфигурировании elastcisearch - запуске elasticsearch в docker Используя докер образ [centos:7](https://hub.docker.com/_/centos) как базовый и [документацию по установке и запуску Elastcisearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html): - составьте Dockerfile-манифест для elasticsearch - соберите docker-образ и сделайте `push` в ваш docker.io репозиторий - запустите контейнер из получившегося образа и выполните запрос пути `/` c хост-машины Требования к `elasticsearch.yml`: - данные `path` должны сохраняться в `/var/lib` - имя ноды должно быть `netology_test` В ответе приведите: - текст Dockerfile манифеста - ссылку на образ в репозитории dockerhub - ответ `elasticsearch` на запрос пути `/` в json виде Подсказки: - возможно вам понадобится установка пакета perl-Digest-SHA для корректной работы пакета shasum - при сетевых проблемах внимательно изучите кластерные и сетевые настройки в elasticsearch.yml - при некоторых проблемах вам поможет docker директива ulimit - elasticsearch в логах обычно описывает проблему и пути ее решения Далее мы будем работать с данным экземпляром elasticsearch. ## Ответ 1 Dockerfile: ``` FROM centos:latest RUN yum -y install sudo wget perl-Digest-SHA RUN wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz && \ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz.sha512 && \ shasum -a 512 -c elasticsearch-7.10.0-linux-x86_64.tar.gz.sha512 && \ tar -xzf elasticsearch-7.10.0-linux-x86_64.tar.gz && \ rm -f elasticsearch-7.10.0-linux-x86_64.tar.gz elasticsearch-7.10.0-linux-x86_64.tar.gz.sha512 RUN echo "cluster.name: vah_app" >> /elasticsearch-7.10.0/config/elasticsearch.yml && \ echo "node.name: netology_test" >> /elasticsearch-7.10.0/config/elasticsearch.yml && \ echo "path.data: /var/lib" >> /elasticsearch-7.10.0/config/elasticsearch.yml && \ echo "network.host: 0.0.0.0" >> /elasticsearch-7.10.0/config/elasticsearch.yml && \ #echo "http.port: 9200" >> /elasticsearch-7.10.0/config/elasticsearch.yml && \ #echo "cluster.initial_master_nodes: ["netology_test"]" >> /elasticsearch-7.10.0/config/elasticsearch.yml && \ echo "discovery.type: single-node" >> /elasticsearch-7.10.0/config/elasticsearch.yml && \ useradd -MU elastic && \ chown -R elastic:elastic elasticsearch-7.10.0 && \ mkdir /var/lib/nodes && \ chown -R elastic:elastic /var/lib/nodes EXPOSE 9200 EXPOSE 9300 CMD ["sudo", "-u", "elastic", "/elasticsearch-7.10.0/bin/elasticsearch"] ``` ![](https://i.imgur.com/bfgFHfO.png) ## Задача 2 В этом задании вы научитесь: - создавать и удалять индексы - изучать состояние кластера - обосновывать причину деградации доступности данных Ознакомтесь с [документацией](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html) и добавьте в `elasticsearch` 3 индекса, в соответствии со таблицей: | Имя | Количество реплик | Количество шард | |-----|-------------------|-----------------| | ind-1| 0 | 1 | | ind-2 | 1 | 2 | | ind-3 | 2 | 4 | Получите список индексов и их статусов, используя API и **приведите в ответе** на задание. Получите состояние кластера `elasticsearch`, используя API. Как вы думаете, почему часть индексов и кластер находится в состоянии yellow? Удалите все индексы. **Важно** При проектировании кластера elasticsearch нужно корректно рассчитывать количество реплик и шард, иначе возможна потеря данных индексов, вплоть до полной, при деградации системы. ## Ответ 2 1. Добавил ``` [root@2698a267b9da /]# curl -X PUT "localhost:9200/ind-1?pretty" -H 'Content-Type: application/json' -d' > { > "settings": { > "index": { > "number_of_shards": 1, > "number_of_replicas": 0 > } > } > } > ' { "acknowledged" : true, "shards_acknowledged" : true, "index" : "ind-1" } [root@2698a267b9da /]# curl -X PUT "localhost:9200/ind-2?pretty" -H 'Content-Type: application/json' -d' { "settings": { "index": { "number_of_shards": 2, "number_of_replicas": 1 } } } ' { "acknowledged" : true, "shards_acknowledged" : true, "index" : "ind-2" } [root@2698a267b9da /]# curl -X PUT "localhost:9200/ind-3?pretty" -H 'Content-Type: application/json' -d' { "settings": { "index": { "number_of_shards": 4, "number_of_replicas": 2 } } } ' { "acknowledged" : true, "shards_acknowledged" : true, "index" : "ind-3" } ``` 2. Список индексов ``` [root@2698a267b9da /]# curl -X GET 'http://127.0.0.1:9200/_cat/indices' green open ind-1 WZnoVJtWRBKK8uU9Kg5fuQ 1 0 0 0 208b 208b yellow open ind-3 E-7y-Wi1RNCd_DA34nDIMw 4 2 0 0 832b 832b yellow open ind-2 kaYsdydoSp6PW8I_sb6YYg 2 1 0 0 416b 416b ``` 3. Статусы кластера. ``` curl --silent 'http://localhost:9200/_cluster/health?pretty' { "cluster_name" : "vah_app", "status" : "yellow", "timed_out" : false, "number_of_nodes" : 1, "number_of_data_nodes" : 1, "active_primary_shards" : 7, "active_shards" : 7, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 10, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 41.17647058823529 } ``` 4. Статусы индексов ``` curl --silent 'http://localhost:9200/_cluster/health?pretty&level=indices' { "cluster_name" : "vah_app", "status" : "yellow", "timed_out" : false, "number_of_nodes" : 1, "number_of_data_nodes" : 1, "active_primary_shards" : 7, "active_shards" : 7, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 10, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 41.17647058823529, "indices" : { "ind-1" : { "status" : "green", "number_of_shards" : 1, "number_of_replicas" : 0, "active_primary_shards" : 1, "active_shards" : 1, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0 }, "ind-3" : { "status" : "yellow", "number_of_shards" : 4, "number_of_replicas" : 2, "active_primary_shards" : 4, "active_shards" : 4, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 8 }, "ind-2" : { "status" : "yellow", "number_of_shards" : 2, "number_of_replicas" : 1, "active_primary_shards" : 2, "active_shards" : 2, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 2 } } } ``` Ссылка на репозиторий. https://hub.docker.com/repository/docker/avakhutinskiy/elastic1 Мне кажется, что статус yellow - потому что мы указали наличие шард на 1 или 2-х репликах, а сами эти реплики не подняты/не найдены. Соответственно в статусе мы видим "неназначенные" шарды. 5. Удалил. ``` [root@2698a267b9da /]# curl -X DELETE 'http://127.0.0.1:9200/ind-1' {"acknowledged":true} [root@2698a267b9da /]# curl -X DELETE 'http://127.0.0.1:9200/ind-2' {"acknowledged":true} [root@2698a267b9da /]# curl -X DELETE 'http://127.0.0.1:9200/ind-3' {"acknowledged":true} ``` ## Задача 3 В данном задании вы научитесь: - создавать бэкапы данных - восстанавливать индексы из бэкапов Создайте директорию `{путь до корневой директории с elasticsearch в образе}/snapshots`. Используя API [зарегистрируйте](https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshots-register-repository.html#snapshots-register-repository) данную директорию как `snapshot repository` c именем `netology_backup`. **Приведите в ответе** запрос API и результат вызова API для создания репозитория. Создайте индекс `test` с 0 реплик и 1 шардом и **приведите в ответе** список индексов. [Создайте `snapshot`](https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshots-take-snapshot.html) состояния кластера `elasticsearch`. **Приведите в ответе** список файлов в директории со `snapshot`ами. Удалите индекс `test` и создайте индекс `test-2`. **Приведите в ответе** список индексов. [Восстановите](https://www.elastic.co/guide/en/elasticsearch/reference/current/snapshots-restore-snapshot.html) состояние кластера `elasticsearch` из `snapshot`, созданного ранее. **Приведите в ответе** запрос к API восстановления и итоговый список индексов. Подсказки: - возможно вам понадобится доработать `elasticsearch.yml` в части директивы `path.repo` и перезапустить `elasticsearch` ## Ответ 3 ``` [root@60a2723fda1b /]# curl -X PUT "localhost:9200/_snapshot/netology_backup?pretty" -H 'Content-Type: application/json' -d' > { > "type": "fs", > "settings": { > "location": "/elasticsearch-7.10.0/snapshots" > } > } > ' { "acknowledged" : true } [root@60a2723fda1b /]# curl -X PUT "localhost:9200/test?pretty" -H 'Content-Type: application/json' -d' > { > "settings": { > "index": { > "number_of_shards": 1, > "number_of_replicas": 0 > } > } > } > ' { "acknowledged" : true, "shards_acknowledged" : true, "index" : "test" } [root@60a2723fda1b /]# curl -X GET 'http://127.0.0.1:9200/_cat/indices' green open test ZTZqx9DMT3qeJ4UrbFM_zg 1 0 0 0 208b 208b [root@60a2723fda1b /]# curl -X GET 'http://127.0.0.1:9200/_snapshot?pretty' { "netology_backup" : { "type" : "fs", "settings" : { "location" : "/elasticsearch-7.10.0/snapshots" } } } curl -X PUT 'http://127.0.0.1:9200/_snapshot/netology_backup/snapshot_1?wait_for_completion=true&pretty' { "snapshot" : { "snapshot" : "snapshot_1", "uuid" : "qNid9VM9Q4SIvkOB8Od_4w", "version_id" : 7100099, "version" : "7.10.0", "indices" : [ "test" ], "data_streams" : [ ], "include_global_state" : true, "state" : "SUCCESS", "start_time" : "2020-12-25T05:38:14.478Z", "start_time_in_millis" : 1608874694478, "end_time" : "2020-12-25T05:38:14.478Z", "end_time_in_millis" : 1608874694478, "duration_in_millis" : 0, "failures" : [ ], "shards" : { "total" : 1, "failed" : 0, "successful" : 1 } } } ls -l /elasticsearch-7.10.0/snapshots/ total 48 -rw-r--r-- 1 elastic elastic 434 Dec 25 05:38 index-2 -rw-r--r-- 1 elastic elastic 8 Dec 25 05:38 index.latest drwxr-xr-x 3 elastic elastic 4096 Dec 25 05:38 indices -rw-r--r-- 1 elastic elastic 30640 Dec 25 05:38 meta-qNid9VM9Q4SIvkOB8Od_4w.dat -rw-r--r-- 1 elastic elastic 266 Dec 25 05:38 snap-qNid9VM9Q4SIvkOB8Od_4w.dat [root@60a2723fda1b /]# curl -X GET "localhost:9200/_cat/indices?pretty" green open test-2 jOTyRaU0RGiPzqZpwMDRJg 1 0 0 0 208b 208b [root@60a2723fda1b /]# curl -X POST "localhost:9200/_snapshot/netology_backup/snapshot_1/_restore?pretty" { "accepted" : true } [root@60a2723fda1b /]# curl -X GET "localhost:9200/_cat/indices?pretty" green open test-2 jOTyRaU0RGiPzqZpwMDRJg 1 0 0 0 208b 208b green open test GFUhiPENQSKrwUAHG9LNkg 1 0 0 0 208b 208b ```