---
# System prepended metadata

title: Домашнее задание к занятию "6.5. Elasticsearch"

---

# Домашнее задание к занятию "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

```

