Простая настройка 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 сек).