Простая настройка CDN через rsync и ssh

К примеру, дано два сервера. Нужно на них настроить реплику. И раздавать статику с этих серверов через nginx. При этом папку примонтировать и заливать файлы в нее с других серверов. Это можно сделать через lsyncd и ssh.

Пусть LEADER будет srv1, а srv2 - FOLLOWER.

srv1 - 192.168.1.51
srv2 - 192.168.1.52

Настройка SSH

Пропишите хосты в /etc/hosts на двух серверах:

192.168.1.51 srv1
192.168.1.52 srv2

Пропишите конфиг /root/.ssh/config на двух серверах:

Host *
	Protocol 2
	KeepAlive yes
	TCPKeepAlive yes
	ServerAliveInterval 5
	ServerAliveCountMax 17280
	Compression no
	#CompressionLevel 9
	#ForwardX11 yes
	UseRoaming no

Host srv1
	Hostname srv1
	User root
	Port 22
	
Host srv2
	Hostname srv2
	User root
	Port 22

Параметры:
ServerAliveInterval - Через какое время в секундах клиенты пытается подключиться к серверу после потери соединения
ServerAliveCountMax - Сколько раз клиент пытается подключиться
Компрессию нужно выключить, она грузит процессор

Сгенерируйте root ключи ssh на двух серверах:

ssh-keygen

Пропишите теперь на двух серверах публичных ключи. Вообщем содержимое файлов /root/.ssh/id_rsa.pub с двух серверов надо скопировать в /root/.ssh/authorized_keys на оба сервера.

Проверьте подключение к серверам.

На первом сервере:

ssh srv2

На втором сервере:

ssh srv1

Подключение должно идти без пароля

Настройка lsyncd

Установите lsyncd на двух серверах:

apt-get install rsync lsyncd

ВАЖНО! Нужно на втором сервере остановить lsyncd:

systemctl stop lsyncd
systemctl disable lsyncd

Это необходимо, чтобы первый сервер был лидером, второй фоловером. Дело в том, что когда запускается lsyncd, то он сначала рсинкает файлы с локального на удаленный, а затем запускается сам. Т.е. если на втором запуститься lsync и там не будет каких то файлов, то он может удалить файлы с первой ноды. Чтобы это не происходило, нужно на втором сервере отключить lsyncd.

При старте lsyncd запускается такая команда: /usr/bin/rsync --delete --ignore-errors -gLpusoltSD --temp-dir=/data/tmp -r /data/files/ srv2:/data/files/ 
Она синхронизирут зеркально папку /data/files/ на с первого на второй сервер.

Создайте папки на обоих серверах:

mkdir -p /etc/lsyncd
mkdir -p /data/files
mkdir -p /data/tmp
mkdir -p /var/log/lsyncd

Папка /data/files будет синхронизироваться с srv1 на srv2

/data/tmp - Временная папка, туда будут загружаться файлы, а потом переносится в /data/files

На srv1 пропишите.

settings{
   logfile = "/dev/null",
   statusFile = "/var/log/lsyncd/lsyncd.status",
   statusInterval = 10,
   nodaemon = false,
   maxDelays = 10,
   maxProcesses = 1,
}

sync {
  default.rsyncssh,
  source = "/data/files",
  host = "srv2",
  targetdir = "/data/files",
  rsync = {
    archive = true,
    owner = true,
    copy_links = true,
    compress = false,
    sparse = true,
    temp_dir = "/data/tmp",
    update = true,
  }
}

На srv2 пропишите такой же конфиг, только поменяйте host на srv1.

Значение maxProcesses установите <кол-во процессоров - 1>

Запустите команду и проверьте правильно ли все настроено

lsyncd -nodaemon /etc/lsyncd/lsyncd.conf.lua

Если все норм, ребутните lsyncd на srv1

systemctl restart lsyncd

После этого синхронизация будет запущена

Подключение клиента

Установить sshfs:

apt install sshfs

Важно. Нужно также сгенерировать ssh ключ клиента и прописать его в /root/.ssh/authorized_keys на обоих серверах.

Проверьте подключение по ssh с клиента:

ssh srv1

Подключить клиента можно через sftp:

sshfs -o reconnect,ServerAliveInterval=5,ServerAliveCountMax=17280 srv1:/data/files /media/files

Либо пропишите в fstab на клиенте:

sshfs#srv1:/data/files /media/files fuse defaults,allow_other,reconnect,ServerAliveInterval=5,ServerAliveCountMax=17280 0 0

Важно

При падения сервера лидера, все смонтированные папки к нему зависают, и перестают отвечать. Это может привести зависанию приложений, которые работают с примонтированной папкой. При текущих настройках, соединение с сервером будет пытаться восстановить подключение в течении 24х часов (17280 x 5 сек).

Литература

  1. https://axkibe.github.io/lsyncd/manual/config/file/