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

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

  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
    

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

    ssh-keygen -t rsa -b 4096
    

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

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

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

    su rider
    

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

    ssh-keygen -t rsa -b 4096
    

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

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

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

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

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

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

    В некоторых дистрибутивах lsyncd автоматически запускается сразу после установки — на обоих серверах остановите его следующей командой:

    sudo systemctl stop lsyncd
    
  6. Теперь требуется настроить lsyncd:

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

    sudo mkdir -p /var/log/lsyncd; sudo chmod 755 /var/log/lsyncd/
    

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

    sudo mkdir -p /var/lib/lsyncd/.lsyncd_temp
    

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

    sudo mkdir -p /etc/lsyncd
    

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

    sudo touch /etc/lsyncd/lsyncd.conf.lua
    

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

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

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

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

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

    Примечание

    Обратите внимание, что при настройке на основном сервере в конфигурационном файле необходимо указывать IP-адрес резервного сервера.
    И наоборот: если конфигурация настраивается на резервном — в конфигурационном файле необходимо указать IP-адрес основного сервера.
    Для поля targetdir укажите директории сервера, на который отправляются файлы.

    settings {
       logfile = "/var/log/lsyncd/lsyncd.log",
       statusFile = "/var/log/lsyncd/lsyncd.stat",
       statusInterval = 5,
       insist = true,
       maxDelays = 60
    }
    
    local base_host = "rider@<ip сервера, на который отправляете файлы>" -- укажите ip второго сервера
    
    -- значения полей сервера, ОТКУДА копируются файлы с текущего сервера
    local source_root_mount_path = "<значение поля root_mount_path>"     -- укажите значение поля root_mount_path
    local source_installer_path = "<полный путь к инсталлятору Compass>" -- укажите абсолютный путь к инсталлятору Compass
    
    -- значения полей сервера, КУДА сохраняются файлы на втором сервере
    local target_root_mount_path = "<значение поля root_mount_path>"     -- укажите значение поля root_mount_path
    local target_installer_path = "<полный путь к инсталлятору Compass>" -- укажите абсолютный путь к инсталлятору Compass
    
    local base_rsync = {
       bwlimit = 30000, -- ограничение для lsyncd до 30000 КБ/с (~30 МБ/с)
       _extra = {
          "--archive",
          "--quiet",
          "--partial",
          "--temp-dir=/var/lib/lsyncd/.lsyncd_temp",
          "--no-whole-file",
          "--delay-updates",
          "--rsync-path=sudo rsync",
          "-e", "/usr/bin/ssh -l rider -i /home/rider/.ssh/id_rsa -o StrictHostKeyChecking=no",
       }
    }
    
    local base_exitcodes = {[0] = "ok", [1] = "again", [2] = "again"}
    
    local function get_path(path, subpath)
      return path .. subpath
    end
    
    sync {
       default.rsyncssh,
       delay = 1,
       host = base_host,
       source = get_path(source_root_mount_path, "/files/"),
       targetdir = get_path(target_root_mount_path, "/files/"),
       delete = true,
       rsync = base_rsync,
       exitcodes = base_exitcodes
    }
    
    sync {
       default.rsyncssh,
       delay = 1,
       host = base_host,
       source = get_path(source_installer_path, "/configs/"),
       targetdir = get_path(target_installer_path, "/configs/"),
       delete = false,
       rsync = base_rsync,
       exitcodes = base_exitcodes,
       filter = {
          "- /replication.yaml*",
          "- /global.yaml*",
          "- /*.swp",
       }
    }
    
    sync {
       default.rsyncssh,
       delay = 1,
       host = base_host,
       source = get_path(source_root_mount_path, "/company_configs/"),
       targetdir = get_path(target_root_mount_path, "/company_configs/"),
       delete = false,
       rsync = base_rsync,
       exitcodes = base_exitcodes,
       filter = {
          "+ /reserve_servers_companies_relationship.json",
          "- /**"
       }
    }
    
    sync {
       default.rsyncssh,
       delay = 1,
       host = base_host,
       source = get_path(source_root_mount_path, ""),
       targetdir = get_path(target_root_mount_path, ""),
       delete = false,
       rsync = base_rsync,
       exitcodes = base_exitcodes,
       filter = {
          "+ /security.yaml",
          "- /**"
       }
    }
    
    sync {
       default.rsyncssh,
       delay = 1,
       host = base_host,
       source = get_path(source_root_mount_path, "/mysql_ssl/"),
       targetdir = get_path(target_root_mount_path, "/mysql_ssl/"),
       delete = false,
       rsync = base_rsync,
       exitcodes = base_exitcodes,
       filter = {
          "+ /mysqlRootCA.crt",
          "+ /mysql-replica-cert.pem",
          "+ /mysql-replica-key.pem",
          "- /**"
       }
    }
    

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

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

    Откройте файл для настройки:

    sudo visudo /etc/sudoers
    

    Добавьте строку в файл и сохраните изменения:

    rider ALL=(ALL) NOPASSWD: /usr/bin/rsync
    
  8. Для синхронизации большого количества файлов необходимо увеличить лимит наблюдения за ядром inotify.

    Для этого на обоих серверах нужно создать файл настройки ядра /etc/sysctl.d/10-max_user_watches.conf:

    sudo vim /etc/sysctl.d/10-max_user_watches.conf
    

    Добавьте строку в файл и сохраните изменения:

    fs.inotify.max_user_watches = 1048576
    

    На обоих серверах примените новую настройку:

    sudo sysctl -p /etc/sysctl.d/10-max_user_watches.conf
    
  9. Настройте ротацию логов для lsyncd на основном и резервном серверах.

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

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

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

    sudo touch /etc/logrotate.d/lsyncd
    

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

    /var/log/lsyncd/lsyncd.log {
       daily
       rotate 14
       maxsize 50M
       missingok
       notifempty
       compress
       delaycompress
    }
    

    Запустите logrotate:

    sudo logrotate -vf /etc/logrotate.d/lsyncd
    
  10. Запустите lsyncd на основном сервере:

    Внимание

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

    sudo systemctl start lsyncd; sudo systemctl disable lsyncd
    

    Проверьте, что всё настроено успешно. Проверьте статус lsyncd на наличие ошибок:

    sudo systemctl status lsyncd
    

    Проверьте логи lsyncd на наличие ошибок:

    tail -n 100 /var/log/lsyncd/lsyncd.log
    
  11. Для проверки работы синхронизации на основном сервере создайте файл в папке, куда установлено приложение <значение поля root_mount_path>/files/:

    touch <значение поля root_mount_path>/files/test_sync.txt
    

    И проверьте на резервном сервере, что созданный файл появился в той же папке:

    ls <значение поля root_mount_path>/files/test_sync.txt