В этом задании вы потренируетесь в:
- установке elasticsearch
- первоначальном конфигурировании elastcisearch
- запуске elasticsearch в docker
Используя докер образ centos:7 как базовый и документацию по установке и запуску Elastcisearch:
- составьте 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.
Для понимания, что необходимо прописывать в Docker-файл, соберем сначала всю конструкцию внутри контейнера centos. Для установки необходимо установить wget в контейнер.
cd /etc/yum.repos.d/
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
#yum update -y #можно и не обновялять, но желательно
yum install -y wget
В связи с тем, что есть проблема с доступом к архиву ELastic из России (ошибка 402 Forbidden). Зеркало было найдено здесь (sha512 сумма совпадает с целевой):
wget https://fossies.org/linux/www/elasticsearch-8.1.2-linux-x86_64.tar.gz
Далее следуюем инструкции (см. выше) по установке Elasicsearch из архива:
wget https://fossies.org/linux/www/elasticsearch-8.1.2-linux-x86_64.tar.gz
tar -xzf elasticsearch-8.1.2-linux-x86_64.tar.gz
Согласно ТЗ изменяем имя ноды и изменяем path.data. Кроме этого, отключаем secutity для облегчения работы с контейнером в дальнейшем. В ТЗ не требуется обеспечения шифрования:
echo "node.name: netology.test" >> /elasticsearch-8.1.2/config/elasticsearch.yml
echo "path.data: /var/lib/elastic" >> /elasticsearch-8.1.2/config/elasticsearch.yml
echo "xpack.security.enabled: false" >> /elasticsearch-8.1.2/config/elasticsearch.yml
echo "xpack.security.enrollment.enabled: false" >> /elasticsearch-8.1.2/config/elasticsearch.yml
echo "xpack.security.http.ssl.enabled: false" >> /elasticsearch-8.1.2/config/elasticsearch.yml
echo "xpack.security.transport.ssl.enabled: false" >> /elasticsearch-8.1.2/config/elasticsearch.yml
Создаем пользовтаеля и группу elastcisearch, т.к. из под root elasticsearch не запускается.
groupadd elasticsearch
useradd elasticsearch -g elasticsearch -p elasticsearch
mkdir /var/lib/elastic
chown -R elasticsearch:elasticsearch /elasticsearch-8.1.2 /var/lib/elastic
chmod o+x /elasticsearch-8.1.2 /var/lib/elastic
chgrp elasticsearch /elasticsearch-8.1.2 /var/lib/elastic
Запускаем из под пользователя elasticsearch (для того, чтобы запустить в качестве демона добавляем ключ -d в конце):
su - elasticsearch -c "/elasticsearch-8.1.2/bin/elasticsearch -d"
Проверяем:
[root@b8e8b74773b1 config]# curl localhost:9200
{
"name" : "netology.test",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "wS_9NjUyQ7uYtLyytu04cQ",
"version" : {
"number" : "8.1.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "31df9689e80bad366ac20176aa7f2371ea5eb4c1",
"build_date" : "2022-03-29T21:18:59.991429448Z",
"build_snapshot" : false,
"lucene_version" : "9.0.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
[root@b8e8b74773b1 config]# curl localhost:9200/_cat/shards
.geoip_databases 0 p STARTED 127.0.0.1 netology.test
[root@b8e8b74773b1 config]# curl localhost:9200/_cluster/health
{"cluster_name":"elasticsearch","status":"green","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":1,"active_shards":1,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":0,"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":100.0}
Т.к. elastic сам просит "max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]" добавим параметр на хостовой машине и перезагрузим машину:
echo "vm.max_map_count = 262144" >> /etc/sysctl.conf
Приступаем к сборке контейнера, формируем Docker файл вида:
vagrant@server1:~$ cat Dockerfile
FROM centos:latest
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
#RUN yum update -y # не будем обновлять, и так не шибко старое.
RUN yum install -y wget
RUN wget https://fossies.org/linux/www/elasticsearch-8.1.2-linux-x86_64.tar.gz
RUN tar -xzf elasticsearch-8.1.2-linux-x86_64.tar.gz
RUN echo "node.name: netology.test" >> /elasticsearch-8.1.2/config/elasticsearch.yml
RUN echo "path.data: /var/lib/elastic" >> /elasticsearch-8.1.2/config/elasticsearch.yml
RUN echo "xpack.security.enabled: false" >> /elasticsearch-8.1.2/config/elasticsearch.yml
RUN echo "xpack.security.enrollment.enabled: false" >> /elasticsearch-8.1.2/config/elasticsearch.yml
RUN echo "xpack.security.http.ssl.enabled: false" >> /elasticsearch-8.1.2/config/elasticsearch.yml
RUN echo "xpack.security.transport.ssl.enabled: false" >> /elasticsearch-8.1.2/config/elasticsearch.yml
RUN echo "network.host: 0.0.0.0" >> /elasticsearch-8.1.2/config/elasticsearch.yml # чтобы не только localhost
RUN echo "discovery.type: single-node" >> /elasticsearch-8.1.2/config/elasticsearch.yml # в противном случае не запускается
RUN groupadd elasticsearch
RUN useradd elasticsearch -g elasticsearch -p elasticsearch
RUN mkdir /var/lib/elastic
RUN chown -R elasticsearch:elasticsearch /elasticsearch-8.1.2 /var/lib/elastic
RUN chmod o+x /elasticsearch-8.1.2 /var/lib/elastic
RUN chgrp elasticsearch /elasticsearch-8.1.2 /var/lib/elastic
CMD su - elasticsearch -c /elasticsearch-8.1.2/bin/elasticsearch
Выполняем сборку:
vagrant@server1:~$ DOCKER_BUILDKIT=0 docker build -t dgolodnikov/elasticsearch_devtest:1.0.3 .
vagrant@server1:~$ docker image list | grep elastic
dgolodnikov/elasticsearch_devtest 1.0.3 16def2d53a99 14 hours ago 2.99GB
Запускаем:
<<<<<<< HEAD
vagrant@server1:~$ docker run -it --name lasta -p 9200:9200 dgolodnikov/elasticsearch_devtest:1.0.0
=======
vagrant@server1:~$ docker run -it -p 9200:9200 -d dgolodnikov/elasticsearch_devtest:1.0.3
4e2403202eaf17e14e07bddfb2383926e6ba5d544efd7f08a6102491576621ee
vagrant@server1:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4e2403202eaf dgolodnikov/elasticsearch_devtest:1.0.3 "/bin/sh -c 'su - el…" About a minute ago Up About a minute 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp lasta
Проверяем, выполняем пару API запросов:
vagrant@server1:~$ curl localhost:9200
{
"name" : "netology.test",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "CE4_K6_pSx-TgoasI5Hgrg",
"version" : {
"number" : "8.1.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "31df9689e80bad366ac20176aa7f2371ea5eb4c1",
"build_date" : "2022-03-29T21:18:59.991429448Z",
"build_snapshot" : false,
"lucene_version" : "9.0.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
vagrant@server1:~$ curl localhost:9200/_cat/shards
.geoip_databases 0 p STARTED 172.17.0.2 netology.test
vagrant@server1:~$ curl -X GET "localhost:9200/_cluster/health?pretty"
{
"cluster_name" : "elasticsearch",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 1,
"active_shards" : 1,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"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" : 100.0
}
>>>>>>> cee3ac89dc11a65ad43a629a29d6ed74d756c112
Выполняем docker push на докерхаб, согласно задания.
vagrant@server1:~$ docker push dgolodnikov/elasticsearch_devtest:1.0.3
The push refers to repository [docker.io/dgolodnikov/elasticsearch_devtest]
f7d348153649: Pushed
34f92665dab9: Pushed
8cf0190685d7: Pushed
17a68d159087: Layer already exists
...
1.0.3: digest: sha256:93a53b0db2e7b9fea3107fbe8b41e727b1721d94cc0da54a2118bfc496a6b042 size: 5324
Ссылки на контейнер: "docker pull dgolodnikov/elasticsearch_devtest:1.0.3" или "https://hub.docker.com/r/dgolodnikov/elasticsearch_devtest/tags"
PS: для запуска с сертификатом (пароль на пользователя elastic указывается при запуске)
[root@470df12af342 /]# curl --cacert /elasticsearch-8.1.2/config/certs/http_ca.crt -u elastic:password https://localhost:9200
Enter host password for user 'elastic':
{
"name" : "netology.test",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "Ctebdx-EQ5OZSxJGoYqTvA",
"version" : {
"number" : "8.1.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "31df9689e80bad366ac20176aa7f2371ea5eb4c1",
"build_date" : "2022-03-29T21:18:59.991429448Z",
"build_snapshot" : false,
"lucene_version" : "9.0.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
В этом задании вы научитесь:
- создавать и удалять индексы
- изучать состояние кластера
- обосновывать причину деградации доступности данных
Ознакомтесь с документацией
и добавьте в elasticsearch 3 индекса, в соответствии со таблицей:
| Имя | Количество реплик | Количество шард |
|---|---|---|
| ind-1 | 0 | 1 |
| ind-2 | 1 | 2 |
| ind-3 | 2 | 4 |
Получите список индексов и их статусов, используя API и приведите в ответе на задание.
Получите состояние кластера elasticsearch, используя API.
Как вы думаете, почему часть индексов и кластер находится в состоянии yellow?
Удалите все индексы.
Важно
При проектировании кластера elasticsearch нужно корректно рассчитывать количество реплик и шард, иначе возможна потеря данных индексов, вплоть до полной, при деградации системы.
Создаем 3 индекса ind-1, ind-2, ind-3:
vagrant@server1:~$ 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"
}
vagrant@server1:~$ 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"
}
vagrant@server1:~$ 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"
}
Проверяем создаение индексов:
vagrant@server1:~$ curl -X GET "localhost:9200/ind-1,ind-2,ind-3?pretty"
{
"ind-1" : {
"aliases" : { },
"mappings" : { },
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1",
"provided_name" : "ind-1",
"creation_date" : "1649703428017",
"number_of_replicas" : "0",
"uuid" : "ikd4reuLQT-4xGKe1LoSVQ",
"version" : {
"created" : "8010299"
}
}
}
},
"ind-2" : {
"aliases" : { },
"mappings" : { },
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "2",
"provided_name" : "ind-2",
"creation_date" : "1649703445700",
"number_of_replicas" : "1",
"uuid" : "X7tq8ESITJCEeIAmBWyWLg",
"version" : {
"created" : "8010299"
}
}
}
},
"ind-3" : {
"aliases" : { },
"mappings" : { },
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "4",
"provided_name" : "ind-3",
"creation_date" : "1649703447270",
"number_of_replicas" : "2",
"uuid" : "6vYsXa3HRGu7rzgGCwuDaA",
"version" : {
"created" : "8010299"
}
}
}
}
}
Проверяем состояние кластера. Состояние кластера "YELLOW" в связи с тем, что необходимы дополнительные ноды для создаения реплик, которые мы затребовали при создаении индексов. Соответсвенно для GREEN статус требуется добавить дополнительно 2 ноды при сохранении кол-ва реплик у ind-3.
vagrant@server1:~$ curl -X GET "localhost:9200/_cluster/health?pretty"
{
"cluster_name" : "elasticsearch",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 8,
"active_shards" : 8,
"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" : 44.44444444444444
}
Удаляем все индексы:
vagrant@server1:~$ curl -X DELETE "localhost:9200/ind-1,ind-2,ind-3?pretty"
{
"acknowledged" : true
}
В данном задании вы научитесь:
- создавать бэкапы данных
- восстанавливать индексы из бэкапов
Создайте директорию {путь до корневой директории с elasticsearch в образе}/snapshots.
Используя API зарегистрируйте
данную директорию как snapshot repository c именем netology_backup.
Приведите в ответе запрос API и результат вызова API для создания репозитория.
Создайте индекс test с 0 реплик и 1 шардом и приведите в ответе список индексов.
Создайте snapshot
состояния кластера elasticsearch.
Приведите в ответе список файлов в директории со snapshotами.
Удалите индекс test и создайте индекс test-2. Приведите в ответе список индексов.
Восстановите состояние
кластера elasticsearch из snapshot, созданного ранее.
Приведите в ответе запрос к API восстановления и итоговый список индексов.
Подсказки:
- возможно вам понадобится доработать
elasticsearch.ymlв части директивыpath.repoи перезапуститьelasticsearch
Создаем директорию snapshot, назначем права для пользователя elasticsearch, добавляем настройки репозитория и рестартуем контейнер.
[root@4e2403202eaf /]# mkdir /elasticsearch-8.1.2/snapshots
[root@4e2403202eaf /]# echo "path.repo: /elasticsearch-8.1.2/snapshots" >> /elasticsearch-8.1.2/config/elasticsearch.yml
[root@4e2403202eaf /]# chown elasticsearch:elasticsearch /elasticsearch-8.1.2/snapshots
vagrant@server1:~$ docker restart 4e2403202eaf
Регистрируем директорию, как netology_backup через API и проверяем:
vagrant@server1:~$ curl -X PUT "localhost:9200/_snapshot/netology_backup?pretty" -H 'Content-Type: application/json' -d'{"type": "fs","settings": {"location": "/elasticsearch-8.1.2/snapshots"}}'
{
"acknowledged":true
}
vagrant@server1:~$ curl -X POST "localhost:9200/_snapshot/netology_backup/_verify?pretty"
{
"nodes" : {
"oGMcy-irQ_6Dy7GLFDb_-g" : {
"name" : "netology.test"
}
}
}
Добавляем индекс test согласно задания и проверяем:
vagrant@server1:~$ 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"
}
vagrant@server1:~$ curl -X GET "localhost:9200/_cat/indices?v=true"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open test WacKW0EPRcubzJ62ug6N_w 1 0 0 0 225b 225b
Делаем бекап в netology_backup (добавили ?wait_for_completion=true для визуального понимания завершения) и делаем проверку:
vagrant@server1:~$ curl -X PUT "localhost:9200/_snapshot/netology_backup/my_snapshot?wait_for_completion=true&pretty"
{
"snapshot" : {
"snapshot" : "my_snapshot",
"uuid" : "GBVmio8OSEy9NCV7P6Z5IQ",
"repository" : "netology_backup",
"version_id" : 8010299,
"version" : "8.1.2",
"indices" : [
"test",
".geoip_databases"
],
"data_streams" : [ ],
"include_global_state" : true,
"state" : "SUCCESS",
"start_time" : "2022-04-12T10:02:51.237Z",
"start_time_in_millis" : 1649757771237,
"end_time" : "2022-04-12T10:02:54.050Z",
"end_time_in_millis" : 1649757774050,
"duration_in_millis" : 2813,
"failures" : [ ],
"shards" : {
"total" : 2,
"failed" : 0,
"successful" : 2
},
"feature_states" : [
{
"feature_name" : "geoip",
"indices" : [
".geoip_databases"
]
}
]
}
}
vagrant@server1:~$ curl -X GET "localhost:9200/_snapshot?pretty"
{
"netology_backup" : {
"type" : "fs",
"uuid" : "ywzN4Ch5RnSRyl7aL19P1A",
"settings" : {
"location" : "/elasticsearch-8.1.2/snapshots"
}
}
}
vagrant@server1:~$ curl -X GET "localhost:9200/_snapshot/netology_backup/*?verbose=false&pretty"
{
"snapshots" : [
{
"snapshot" : "my_snapshot",
"uuid" : "GBVmio8OSEy9NCV7P6Z5IQ",
"repository" : "netology_backup",
"indices" : [
".geoip_databases",
"test"
],
"data_streams" : [ ],
"state" : "SUCCESS"
}
],
"total" : 1,
"remaining" : 0
}
Проверяем директорию /elasticsearch-8.1.2/snapshots/ внутри контейнера:
[root@4e2403202eaf /]# ls -la /elasticsearch-8.1.2/snapshots/
total 48
drwxr-xr-x 3 elasticsearch elasticsearch 4096 Apr 12 10:02 .
drwxr-xr-x 1 elasticsearch elasticsearch 4096 Apr 12 09:46 ..
-rw-rw-r-- 1 elasticsearch elasticsearch 844 Apr 12 10:02 index-0
-rw-rw-r-- 1 elasticsearch elasticsearch 8 Apr 12 10:02 index.latest
drwxrwxr-x 4 elasticsearch elasticsearch 4096 Apr 12 10:02 indices
-rw-rw-r-- 1 elasticsearch elasticsearch 18351 Apr 12 10:02 meta-GBVmio8OSEy9NCV7P6Z5IQ.dat
-rw-rw-r-- 1 elasticsearch elasticsearch 354 Apr 12 10:02 snap-GBVmio8OSEy9NCV7P6Z5IQ.dat
Удаляем индекс test:
vagrant@server1:~$ curl -X DELETE "localhost:9200/test?pretty"
{
"acknowledged" : true
}
Создаем индекс test-2 и проверяем список:
vagrant@server1:~$ curl -X PUT "localhost:9200/test-2?pretty" -H 'Content-Type: application/json' -d'{"settings": {"index": {"number_of_shards": 1, "number_of_replicas": 0 }}}'
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "test-2"
}
vagrant@server1:~$ curl -X GET "localhost:9200/_cat/indices?v=true"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open test-2 0gEIXCwUQRaAAu9MgWqQeA 1 0 0 0 225b 225b
Выполняем восстанавление из бекапа:
vagrant@server1:~$ curl -X POST "localhost:9200/_snapshot/netology_backup/my_snapshot/_restore?pretty" -H 'Content-Type: application/json' -d' { "indices": "*", "include_global_state": true } '
{
"accepted" : true
}
Проверяем список индексов и видем два индекса. Один созданный test-2 и восстановленный из бекапа. Все ОК!:
vagrant@server1:~$ curl -X GET "localhost:9200/_cat/indices?v=true"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open test-2 0gEIXCwUQRaAAu9MgWqQeA 1 0 0 0 225b 225b
green open test c0Yjw3qcRA6XbOfbyL96hg 1 0 0 0 225b 225b
Домашка готова!