dhilt / dharmadict

MIT License
1 stars 2 forks source link

Elasticsearch Dump #1

Closed dhilt closed 7 years ago

dhilt commented 7 years ago

Исследуем https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html, разрабатываем процедуру резервного копирования/восстановления данных

dhilt commented 7 years ago

Мне удалось завести снапшот следующим образом.

1. Следуя документации, я объявил параметр path.repo: ["/github/.../backups"] в elasticsearch.yml.

2. Это позволило мне использовать относительный путь при создании репозитория для бэкапов:

curl -XPUT 'http://localhost:9200/_snapshot/my_backup' -H 'Content-Type: application/json' -d '{"type": "fs", "settings": {"location": "my_backup", "compress": true}}'

В папке /github/.../backups появилась папка my_backup.

3. Я считал это дело через curl -XGET 'http://localhost:9200/_snapshot/my_backup', убедился, что репозиторий создан.

4. Затем я создал первый снапшот

curl -XPUT 'http://localhost:9200/_snapshot/my_backup/shanp1' {"indices": "dharmadict",  "ignore_unavailable": true,  "include_global_state": false}

Зайдя в /github/.../backups/my_backup я увидел результат работы.

Задача. Довести процедуру до конечного результата, устранить все ошибки/предупреждения, научиться восстанавливать данные.

dhilt commented 7 years ago

@BitDen Проверить работоспособность дампа можно через процедуру восстановления. Соответственно нужно научиться восстанавливать дамп. Весь процесс я бы описал следующим образом:

1) сделать дамп индекса dharmadict; 2) внести изменения в переводы через UI; 3) накатить сохраненный дамп; 4) увидеть, что изменения из п.2 откатились.

Вносить изменения можно залогинившись админом или переводчиком (см исходники, users.js).

dyuvzhenko commented 7 years ago

@dhilt Дамп работает. Удалил переводы двух слов от одного переводчика, затем провел восстановление и снова увидел переводы на своем месте. Сначала надо заблокировать индекс в базе данных: https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-open-close.html

curl -XPOST 'localhost:9200/dharmadict/_close?pretty'

И собственно восстановление

curl -XPOST 'localhost:9200/_snapshot/my_backup/shanp1/_restore?pretty' -H 'Content-Type: application/json' -d'
{
  "indices": "dharmadict",
  "ignore_unavailable": true
}
'
dyuvzhenko commented 7 years ago

Может еще стоит переустановить заново эластик и попробовать взять данные только из дампа. Буду пробовать...

dhilt commented 7 years ago

@BitDen Отлично! попробуй напиши теперь инструкцию на английском языке в максимально сжатом, но воспроизводимом виде по созданию снапшота и его дальнейшему применению, все команды, последовательность, нюансы. Я потом отредактирую и опубликую это в Readme.md отдельным разделом.

После этого можно будет думать над автоматизацией процесса резервного копирования данных (это сейчас не будем делать, потом.)

dyuvzhenko commented 7 years ago

Creating a snapshot.

  1. Need write a string, that will contain the path to snapshot, path.repo: ["/github/.../backups"] in file '/etc/elasticsearch/elasticsearch.yml'. This file possible open with next command:
    sudo nano /etc/elasticsearch/elasticsearch.yml
  2. If the first step was made, then in next command we can write relative path 'my_backup':
    curl -XPUT 'http://localhost:9200/_snapshot/my_backup' -H 'Content-Type: application/json' -d '{"type": "fs", "settings": {"location": "my_backup", "compress": true}}'

    In the folder "/github/.../backups" will appear a new folder "my_backup".

  3. With the next command, you can verify that the repository was created:
    curl -XGET 'http://localhost:9200/_snapshot/my_backup'
  4. A snapshot with the name "shanp1" in the repository "my_backup" can be created by executing the following command:
    curl -XPUT 'http://localhost:9200/_snapshot/my_backup/shanp1' {"indices": "dharmadict",  "ignore_unavailable": true,  "include_global_state": false}

Restore.

  1. Before restoring we need block index "dharmadict" in database:
    curl -XPOST 'localhost:9200/dharmadict/_close?pretty'
  2. Now, a snapshot can be restored using the following command:
    curl -XPOST 'localhost:9200/_snapshot/my_backup/shanp1/_restore?pretty' -H 'Content-Type: application/json' -d'
    {
    "indices": "dharmadict",
    "ignore_unavailable": true
    }
    '
dyuvzhenko commented 7 years ago

@dhilt Вот в принципе и весь перевод. Есть только такой нюанс. Судя по всему вам удалось с помощью команды curl создать папку (2-ой пункт), в моем же случае там возникли проблемы со всякими правами. В общем-то вышло так, что я сам создал папку и права передал elasticsearch'у.

dyuvzhenko commented 7 years ago

И кстати говоря, вы верно догадывались. Виртуалку можно "приостановить", сохранить её состояние на винте, выйти из VirtualBox, и спустя время вернуться обратно, так будто операционная система и не заканчивала работать.

dhilt commented 7 years ago

@BitDen Давай так поступим, создай бранч, допиши в нем в readme эти пункты и открой Pull Request. Будем следовать стандартному workflow!

Я уезжаю на выходные, посмотри пока само приложение и предложи какой-нибудь рефакторинг.

Из полезного и простого, нужно сделать страницу "О проекте" с отдельным роутом и еще страницы для каждого переводчика. Можешь тоже предложить решение. Но сперва я бы предложил порефакторить существующий код.

dyuvzhenko commented 7 years ago

Хорошо, создам бранч 'elasticsearch-dump' и там впишу инструкцию. И еще пока нужно смотреть на 2-ой пункт, у меня гладко там никак не получалось одной командой добиться результата (создать папку).

И постараюсь все-все рассмотреть и что-нибудь предложить насчет рефакторинга.

dyuvzhenko commented 7 years ago

@dhilt Pull request создал: https://github.com/dhilt/dharmadict/pull/2. Насчет рефакторинга - сильно бросается в глаза эдакая инфраструктура визуальных реакт-компонентов (views) в папке /app/components, нет какой-то четкой организованной структуры что ли, хочется это дело как-то красиво упорядочить чтобы любой компонент находился легко и быстро, вот-с... Вторым по очереди возникает желание как-то разбить reducers на отдельные файлы, опять же ради удобочитаемости. Еще возможно стоит сервер расписать с помощью promise, как мы это делали в прошлом проекте. И немного смущают две папки node_modules. И еще есть желание автоматизировать всяческие манипуляции, которые приходилось делать вначале, что-то вроде bash-скрипта, который я показывал. Или вот даже под задачу создания дампа и восстановления данных написать скрипт, допустим пользователь вводит путь к репозиторию, имя бекапа - и в ответ все автоматически делается. Вот как-то так.

dhilt commented 7 years ago

@BitDen Я сумел пройти цикл восстановления данных и пока отложим это. Я отредактировал readme и сделал мерж. Свои предложения по рефакторингу ты можешь предлагать кодом, в бранче 'dev', например. На счет структуры компонентов пока это выглядит следующим образом:

Я попробую создать сейчас задачу-другую.