Использование свободно-распространяемого ПО для синхронизации файлов между узлами#

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 автоматически обнаруживает другие устройства в локальной сети.

../../_images/syncthing.png

Разрешение конфликтов при работе Syncthing#

При одновременном изменении одного и того же файла на двух узлах в Syncthing возникает конфликт версий. В этом случае Syncthing выполняет следующие действия:

Выявление конфликта — Syncthing обнаруживает, что файл был изменен на обоих узлах с момента последней синхронизации.

Создание файла конфликта — один из узлов (тот, который первым обнаружит конфликт) создает конфликтный файл с уникальным именем, включающим информацию о времени конфликта и идентификаторе устройства, например, file.sync-conflict-<timestamp>-<device_id>.

Сохранение обеих версий — оригинальный файл и его конфликтная версия сохраняются на узле. Пользователь может вручную решить конфликт, выбрав нужную версию файла.

Уведомление пользователя — Syncthing уведомляет пользователя о возникшем конфликте через веб-интерфейс или уведомления, в зависимости от настроек.

../../_images/syncthing_2.png

Настройка репликации для предотвращения конфликтов#

Для настройки 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 как службы (демона):

  1. Создать службу для Syncthing:

sudo nano /etc/systemd/system/syncthing@.service
  1. Добавить следующий контент в файл службы:

: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
  1. Перезапустить systemd, чтобы применить изменения:

sudo systemctl daemon-reload
  1. Запустить и включить службу Syncthing для текущего пользователя:

sudo systemctl enable syncthing@$USER
sudo systemctl start syncthing@$USER

Шаг 3: Первоначальная настройка Syncthing на узле 1 (Master Node):

  1. Открыть веб-интерфейс Syncthing — в браузере перейти по адресу http://localhost:8384.

  2. Добавить устройства узлов 2 и 3:

  • на узле 1 перейти на вкладку Actions и выбрать Show ID;

  • скопировать Device ID узла 1;

  • на узлах 2 и 3 повторить те же действия для получения их Device ID.

  1. На узле 1 добавить узлы 2 и 3 как удаленные устройства:

  • перейти на вкладку Remote Devices и нажать Add Remote Device;

  • вставить Device ID узлов 2 и 3 и назначить им имена;

  • повторить процесс для обоих узлов.

  1. Создать общий каталог на узле 1:

  • перейти на вкладку Folders и нажмите Add Folder;

  • указать путь к каталогу, который необходимо синхронизировать, и назначить ему имя;

  • в разделе Sharing отметить узлы 2 и 3.

Шаг 4: Настройка узлов 2 и 3:

  1. На узлах 2 и 3 принять запрос на добавление узла 1:

  • на узлах 2 и 3 открыть веб-интерфейс Syncthing;

  • принять запрос на добавление узла 1.

  1. Принять общий каталог на узлах 2 и 3:

  • на узлах 2 и 3 появится уведомление о новом общем каталоге;

  • нажать Add` и указать путь, где необходимо сохранить этот каталог;

  • в настройках каталога на вкладке Sharing установить режим Receive Only (Только получение).

Шаг 5: Проверка синхронизации и статуса службы

  1. Проверить состояния синхронизации:

  • в веб-интерфейсе Syncthing на каждом узле можно увидеть статус синхронизации каталогов и узлов.

  1. Проверить состояния службы:

  • убедиться, что служба 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