Отказоустойчивость:
Синхронизация файлов#

Данная статья описывает настройку rsync для синхронизации файлов между основным и резервным серверами.

  1. На основном сервере необходимо создать пользователя, который будет отправлять файлы на резервный сервер.

    Создайте группу для пользователя rider:

    sudo groupadd -g 1102 rider
    

    Создайте пользователя rider:

    sudo useradd -m -s /bin/bash -g rider -u 1102 rider
    

    Задайте произвольный пароль для пользователя rider, сохраните его:

    sudo passwd rider
    
  2. На резервном сервере также требуется создать пользователя, который будет отправлять файлы на основной сервер.

    Создайте группу для пользователя rider:

    sudo groupadd -g 1102 rider
    

    Создайте пользователя rider:

    sudo useradd -m -s /bin/bash -g rider -u 1102 rider
    

    Задайте произвольный пароль для пользователя rider, сохраните его:

    sudo passwd rider
    
  3. На основном сервере необходимо настроить доступ пользователя к резервному серверу.

    На основном сервере выполните команду от лица пользователя rider:

    su rider
    

    Следующей командой сгенерируйте ключ доступа:

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -q
    

    Скопируйте публичный ключ с основного сервера на резервный (потребуется пароль, созданный с помощью команды passwd rider на резервном сервере).
    Для этого выполните на основном сервере:

    ssh-copy-id rider@<внутренний IP резервного сервера>
    
  4. На резервном сервере также требуется настроить доступ пользователя к основному серверу:

    На резервном сервере выполните команду от лица пользователя rider:

    su rider
    

    Следующей командой сгенерируйте ключ доступа:

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -q
    

    Скопируйте публичный ключ с резервного сервера на основной (потребуется пароль, созданный с помощью команды passwd rider на основном сервере).
    Для этого на резервном сервере выполните:

    ssh-copy-id rider@<внутренний IP основного сервера>
    

    Затем на основном и резервном серверах следует выйти из-под пользователя rider:

    exit
    
  5. После этого на основном и резервном серверах установите приложение rsync, которое выполняет синхронизацию новых файлов и отправляет их на другой сервер.

    На обоих серверах выполните команды для установки rsync:

    sudo apt-get update; sudo apt-get install rsync -y
    
  6. Теперь требуется настроить rsync:

    На обоих серверах создайте директорию, в которой будут располагаться логи rsync:

    sudo mkdir -p /var/log/rsync-replication/; sudo chmod 755 /var/log/rsync-replication/
    

    На обоих серверах создайте директорию, куда будут добавляться временные файлы при копировании на сервер:

    sudo mkdir -p /var/lib/rsync/.rsync_temp
    

    На обоих серверах создайте директорию, в которой будет располагаться конфигурация rsync:

    sudo mkdir -p /etc/rsync-replication
    

    На обоих серверах создайте файл конфигурации:

    sudo touch /etc/rsync-replication/sync_files.yaml
    

    Предупреждение

    Для дальнейшей настройки понадобится файл configs/global.yaml, который был создан ранее в разделе «Конфигурация портов и доменов приложения»

    Получите значение поля root_mount_path вашего приложения — оно понадобится для заполнения конфигурационного файла для rsync:

    grep root_mount_path <путь к инсталлятору Compass>/configs/global.yaml | grep -v '^#'
    

    В шаблон ниже подставьте свои значения, затем добавьте содержимое в конфигурационный файл /etc/rsync-replication/sync_files.yaml с помощью любого текстового редактора и сохраните изменения:

    Примечание

    Обратите внимание, что при настройке на основном сервере в конфигурационном файле в поле target_host необходимо указать IP-адрес резервного сервера.
    И наоборот: если конфигурация настраивается на резервном — в конфигурационном файле в поле target_host необходимо указать IP-адрес основного сервера.
    Заполните поля source_root_mount_path, source_installer_path, target_root_mount_path, target_installer_path.

    # основные параметры
    # (требуется заполнение)
    variables:
      target_host: "rider@<ip сервера, на который отправляете файлы>" # укажите ip второго сервера
    
      # значения полей сервера, ОТКУДА копируются файлы с текущего сервера
      source_root_mount_path: "<значение поля root_mount_path>"     # укажите значение поля root_mount_path
      source_installer_path: "<полный путь к инсталлятору Compass>" # укажите абсолютный путь к инсталлятору Compass
    
      # значения полей сервера, КУДА сохраняются файлы на втором сервере
      target_root_mount_path: "<значение поля root_mount_path>"     # укажите значение поля root_mount_path
      target_installer_path: "<полный путь к инсталлятору Compass>" # укажите абсолютный путь к инсталлятору Compass
      ssh_key: "/home/rider/.ssh/id_rsa"
      bw_limit: 30000
    
    # список исключаемых файлов и шаблонов
    default_excludes:
       - "*.swp"
       - "*.tmp"
       - ".*.swp"
       - ".*.tmp"
    
    # директории для синхронизации
    # (заполнение не требуется)
    # "include_only" - режим, где отправляются только указанные файлы
    # исключаемые файлы/шаблоны в excludes объединены с default_excludes
    sync_items:
      - name: "reserve_relationship"
        source: "{source_root_mount_path}/company_configs/"
        target: "{target_host}:{target_root_mount_path}/company_configs/"
        sync_mode: "include_only"
        ignore_lock: true
        includes:
          - "reserve_servers_companies_relationship.json"
      - name: "installer_configs"
        source: "{source_installer_path}/configs/"
        target: "{target_host}:{target_installer_path}/configs/"
        excludes:
          - "/replication.yaml*"
          - "/global.yaml*"
      - name: "security_file"
        source: "{source_root_mount_path}"
        target: "{target_host}:{target_root_mount_path}"
        sync_mode: "include_only"
        includes:
          - "security.yaml"
      - name: "mysql_ssl"
        source: "{source_root_mount_path}/mysql_ssl/"
        target: "{target_host}:{target_root_mount_path}/mysql_ssl/"
        sync_mode: "include_only"
        includes:
          - "mysqlRootCA.crt"
          - "mysql-replica-cert.pem"
          - "mysql-replica-key.pem"
      - name: "app_files"
        source: "{source_root_mount_path}/files/"
        target: "{target_host}:{target_root_mount_path}/files/"
      - name: "app_files_rsync_changes"
        sync_type: "file"
        source: "/etc/rsync-replication/app_files_rsync_changes.log"
        target: "{target_host}:/etc/rsync-replication/app_files_rsync_changes.log"
    

    Действия выше также необходимо выполнить на резервном сервере.

  7. Для того чтобы rider сохранял файлы с тем же владельцем и группой — выполните на обоих серверах следующую команду:

    echo "rider ALL=(ALL) NOPASSWD: /usr/bin/rsync" | sudo tee /etc/sudoers.d/rsync
    
  8. Настройте ротацию логов для rsync на основном и резервном серверах.

    Установите logrotate, если ранее ещё не был установлен:

    sudo apt-get update; sudo apt-get install logrotate -y
    

    Создайте конфигурационный файл для ротации логов rsync:

    sudo touch /etc/logrotate.d/rsync-replication
    

    Откройте /etc/logrotate.d/rsync-replication любым удобным текстовым редактором и добавьте в него следующее содержимое:

    /var/log/rsync-replication/rsync_files.log {
       daily
       rotate 7
       maxsize 100M
       missingok
       notifempty
       compress
       delaycompress
       su rider rider
       copytruncate
    }
    

    Запустите logrotate:

    sudo logrotate -vf /etc/logrotate.d/rsync-replication
    
  9. Для проверки работы синхронизации на основном сервере создайте файл в папке, куда установлено приложение <значение поля root_mount_path>/files/:

    touch <значение поля root_mount_path>/files/test_sync.txt
    
  10. На основном сервере запустите скрипт для проверки работы синхронизации файлов:

    Примечание

    В команду ниже необходимо подставить полный путь к инсталлятору Compass.

    sudo python3 <полный путь к инсталлятору Compass>/script/replication/sync_files.py --debug --skip-checks
    
  11. На резервном сервере проверьте, что созданный файл появился в той же папке:

    ls <значение поля root_mount_path>/files/test_sync.txt
    
  12. На основном сервере проверьте логи rsync на наличие ошибок:

    tail -n 100 /var/log/rsync-replication/rsync_files.log