Использование свободно-распространяемого ПО для синхронизации файлов между узлами#
Syncthing#
Syncthing — это бесплатное и открытое программное обеспечение для непрерывной синхронизации файлов между несколькими устройствами. Основные характеристики и архитектурные особенности Syncthing:
Тип архитектуры:
Stateful архитектура — Syncthing хранит состояние синхронизации файлов на каждом узле, чтобы отслеживать изменения и синхронизировать их с другими узлами.
Технологии:
Нет серверов — Syncthing работает по принципу peer-to-peer (P2P), что означает отсутствие центральных серверов. Каждый узел (устройство) в сети может напрямую обмениваться данными с другими узлами.
Периферийные технологии: Syncthing не использует базы данных или системы очередей сообщений.
Коммуникация:
Протоколы — Syncthing использует протокол TLS для шифрования всех соединений и обмена данными. Сами данные передаются по протоколу Block Exchange Protocol (BEP).
Сериализация данных — используется формат JSON для обмена метаданными.
Потребители:
Кроссплатформенные клиенты — Syncthing поддерживает множество платформ, включая Windows, macOS, Linux, FreeBSD, Solaris и Android.
Масштабирование:
Децентрализованная синхронизация — поскольку нет центрального сервера, масштабирование происходит горизонтально за счет добавления новых узлов.
Специфические метки и заметки:
Статус синхронизации — на каждом узле можно увидеть статус синхронизации всех папок и устройств.
Автоматическое обнаружение устройств — Syncthing автоматически обнаруживает другие устройства в локальной сети.

Разрешение конфликтов при работе Syncthing#
При одновременном изменении одного и того же файла на двух узлах в Syncthing возникает конфликт версий. В этом случае Syncthing выполняет следующие действия:
Выявление конфликта — Syncthing обнаруживает, что файл был изменен на обоих узлах с момента последней синхронизации.
Создание файла конфликта — один из узлов (тот, который первым обнаружит конфликт) создает конфликтный файл с уникальным именем, включающим информацию о времени конфликта и идентификаторе устройства, например, file.sync-conflict-<timestamp>-<device_id>.
Сохранение обеих версий — оригинальный файл и его конфликтная версия сохраняются на узле. Пользователь может вручную решить конфликт, выбрав нужную версию файла.
Уведомление пользователя — Syncthing уведомляет пользователя о возникшем конфликте через веб-интерфейс или уведомления, в зависимости от настроек.

Настройка репликации для предотвращения конфликтов#
Для настройки Syncthing на трех узлах с ОС Linux, где данные на узле 1 являются основными, а узлы 2 и 3 имеют доступ только для чтения (read-only), необходимо выполнить следующие шаги:
Шаг 1: Установка Syncthing на всех узлах:
Добавить репозиторий Syncthing и установить Syncthing:
sudo curl -s https://syncthing.net/release-key.txt | sudo apt-key add - sudo apt-get install apt-transport-https echo "deb https://apt.syncthing.net/ syncthing release" | sudo tee /etc/apt/sources.list.d/syncthing.list sudo apt-get update sudo apt-get install syncthing
Шаг 2: Настройка Syncthing как службы (демона):
Создать службу для Syncthing:
sudo nano /etc/systemd/system/syncthing@.service
Добавить следующий контент в файл службы:
:kbd:` ` [Unit] Description=Syncthing - Open Source Continuous File Synchronization for %i Documentation=https://docs.syncthing.net/ After=network.target [Service] User=%i ExecStart=/usr/bin/syncthing -no-browser -home=/home/%i/.config/syncthing Restart=on-failure SuccessExitStatus=3 4 RestartForceExitStatus=3 4 [Install] WantedBy=multi-user.target
Перезапустить
systemd
, чтобы применить изменения:
sudo systemctl daemon-reload
Запустить и включить службу Syncthing для текущего пользователя:
sudo systemctl enable syncthing@$USER sudo systemctl start syncthing@$USER
Шаг 3: Первоначальная настройка Syncthing на узле 1 (Master Node):
Открыть веб-интерфейс Syncthing — в браузере перейти по адресу
http://localhost:8384
.Добавить устройства узлов 2 и 3:
на узле 1 перейти на вкладку Actions и выбрать Show ID;
скопировать Device ID узла 1;
на узлах 2 и 3 повторить те же действия для получения их Device ID.
На узле 1 добавить узлы 2 и 3 как удаленные устройства:
перейти на вкладку Remote Devices и нажать Add Remote Device;
вставить Device ID узлов 2 и 3 и назначить им имена;
повторить процесс для обоих узлов.
Создать общий каталог на узле 1:
перейти на вкладку Folders и нажмите Add Folder;
указать путь к каталогу, который необходимо синхронизировать, и назначить ему имя;
в разделе Sharing отметить узлы 2 и 3.
Шаг 4: Настройка узлов 2 и 3:
На узлах 2 и 3 принять запрос на добавление узла 1:
на узлах 2 и 3 открыть веб-интерфейс Syncthing;
принять запрос на добавление узла 1.
Принять общий каталог на узлах 2 и 3:
на узлах 2 и 3 появится уведомление о новом общем каталоге;
нажать Add` и указать путь, где необходимо сохранить этот каталог;
в настройках каталога на вкладке Sharing установить режим Receive Only (Только получение).
Шаг 5: Проверка синхронизации и статуса службы
Проверить состояния синхронизации:
в веб-интерфейсе Syncthing на каждом узле можно увидеть статус синхронизации каталогов и узлов.
Проверить состояния службы:
убедиться, что служба Syncthing запущена и работает на всех узлах:
sudo systemctl status syncthing@$USER
Использование свободно-распространяемого ПО для выполнения сценариев DR на примере Apache Airflow#
Apache Airflow может быть использован для реализации стратегии Disaster Recovery (DR) для облачной платформы, построенной на базе ПВ. В данном контексте, Airflow может автоматизировать процессы создания резервных копий, репликации данных, восстановления и мониторинга состояния системы. Ниже приведены шаги и примеры того, как это можно реализовать.
Резервное копирование виртуальных машин и данных#
Задача:
Создание регулярных резервных копий виртуальных машин (VM) и связанных данных.
Решение:
Использовать PythonOperator для создания скриптов, которые взаимодействуют с ПВ API и выполняют резервное копирование.
Пример:
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.utils.dates import days_ago
import subprocess
def backup_vm(vm_id):
subprocess.run(["onevm", "snapshot-create", vm_id])
default_args = {
'owner': 'airflow',
'start_date': days_ago(1),
}
dag = DAG(
'Brest_backup',
default_args=default_args,
description='Backup Brest VMs',
schedule_interval='@daily',
)
backup_tasks = []
vm_ids = ['101', '102', '103'] # IDs of VMs to backup
for vm_id in vm_ids:
task = PythonOperator(
task_id=f'backup_vm_{vm_id}',
python_callable=backup_vm,
op_args=[vm_id],
dag=dag,
)
backup_tasks.append(task)
for task in backup_tasks:
task
Репликация данных на удаленный сайт#
Задача:
Репликация данных на удаленный сайт для обеспечения доступности в случае сбоя.
Решение:
Использовать BashOperator для копирования резервных копий на удаленный сервер с помощью rsync
или scp
.
Пример:
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.utils.dates import days_ago
default_args = {
'owner': 'airflow',
'start_date': days_ago(1),
}
dag = DAG(
'data_replication',
default_args=default_args,
description='Replicate data to remote site',
schedule_interval='@daily',
)
replicate_data = BashOperator(
task_id='replicate_data',
bash_command='rsync -avz /path/to/backups remote_user@remote_host:/remote/path',
dag=dag,
)
replicate_data
Восстановление из резервной копии#
Задача:
Автоматизация процесса восстановления из резервной копии в случае сбоя.
Решение:
Использовать PythonOperator для вызова скриптов, которые восстанавливают ВМ и данные из резервных копий.
Пример:
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.utils.dates import days_ago
import subprocess
def restore_vm(snapshot_id, vm_id):
subprocess.run(["onevm", "snapshot-revert", vm_id, snapshot_id])
default_args = {
'owner': 'airflow',
'start_date': days_ago(1),
}
dag = DAG(
'Brest_restore',
default_args=default_args,
description='Restore Brest VMs from backups',
schedule_interval=None, # Run manually or trigger based on events
)
restore_tasks = []
snapshot_ids = {'101': 'snap-101-1', '102': 'snap-102-1'} # Соответствие между ID виртуальной машины и номером снапшота
for vm_id, snapshot_id in snapshot_ids.items():
task = PythonOperator(
task_id=f'restore_vm_{vm_id}',
python_callable=restore_vm,
op_args=[snapshot_id, vm_id],
dag=dag,
)
restore_tasks.append(task)
for task in restore_tasks:
task
Мониторинг состояния системы#
Задача:
Мониторинг состояния системы и уведомления в случае сбоев.
Решение:
Использовать HttpSensor или BashOperator для мониторинга состояния системы и EmailOperator для отправки уведомлений.
Пример:
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.email_operator import EmailOperator
from airflow.sensors.http_sensor import HttpSensor
from airflow.utils.dates import days_ago
default_args = {
'owner': 'airflow',
'start_date': days_ago(1),
'email_on_failure': True,
'email': ['admin@example.com'],
}
dag = DAG(
'system_monitoring',
default_args=default_args,
description='Monitor Brest system',
schedule_interval='@hourly',
)
check_Brest = BashOperator(
task_id='check_Brest',
bash_command='onehost list | grep -q "ERROR"',
dag=dag,
)
alert_email = EmailOperator(
task_id='send_email_alert',
to='admin@example.com',
subject='Brest Alert',
html_content='Brest host error detected!',
dag=dag,
)
check_Brest >> alert_email
Периодическое тестирование DR-плана#
Задача:
Регулярное тестирование процесса восстановления для обеспечения готовности.
Решение:
Создать DAG для автоматизации тестирования DR-плана, включающего все этапы восстановления.
Пример:
from airflow import DAG
from airflow.operators.dummy_operator import DummyOperator
from airflow.utils.dates import days_ago
default_args = {
'owner': 'airflow',
'start_date': days_ago(1),
}
dag = DAG(
'dr_test',
default_args=default_args,
description='Test Disaster Recovery Plan',
schedule_interval='@monthly',
)
start_test = DummyOperator(
task_id='start_test',
dag=dag,
)
backup = PythonOperator(
task_id='backup_vm_101',
python_callable=backup_vm,
op_args=['101'],
dag=dag,
)
replicate = BashOperator(
task_id='replicate_data',
bash_command='rsync -avz /path/to/backups remote_user@remote_host:/remote/path',
dag=dag,
)
restore = PythonOperator(
task_id='restore_vm_101',
python_callable=restore_vm,
op_args=['snap-101-1', '101'],
dag=dag,
)
start_test >> backup >> replicate >> restore