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

## Задача 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
```