Построение отказоустойчивого кластера с синхронизацией файлов посредством lsyncd и MySQL репликацией
Кластерное решение из двух серверов с репликацией данных MySQL (master-master), синхронизацией файлов через lsyncd, и распределенным DNS на базе BIND
Производим установку веб-сервера и MySQL по желанию. В моем случае NGINX + MySQL.
Подготавливаем систему для синхронизации файлов
Для синхронизации файлов, нам необходимо сделать беспарольный доступ по SSH между серверами, для этого сгенерируем пару ключей:
ssh-keygen -t rsa (passphrase не указываем) scp /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys2
и аналогично на втором сервере:
ssh-keygen -t rsa (passphrase не указываем) scp /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys2
Для синхронизации файлов я пробовал использовать Unison, но, к сожалению, необходимого функционала у него нет, поэтому в данном примере будет рассматриваться lsyncd (Rsync + inotify)
Устанавливаем lsyncd
Пакет lsyncd есть в базовых репозиториях CentOS
yum install lsyncd chkconfig lsyncd on
Можете не пытаться запускать, поскольку без рабочего конфига вы просто получите ошибку:
Starting lsyncd: Error: Nothing to watch! [FAILED]
Конфиг проще сделать один раз и дальше разнести на все ноды, закомментировав лишний для каждого конкретного сервера блок.
Комментарии — это все что находится между --[[ и ]]
Запускаем lsyncd
/etc/init.d/lsyncd start
В случае получения ошибки решение очень простое
[root@Leader lsyncd]# /etc/init.d/lsyncd start shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory Starting lsyncd: shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory [ OK ] [root@Leader lsyncd]# cd / [root@Leader /]# /etc/init.d/lsyncd start Starting lsyncd: [ OK ] [root@Leader /]#
Если ничего не работает и в логах наблюдаем ошибку, то отключаем SElinux :)
rsync: Failed to exec /usr/bin/ssh: Permission denied (13)
Настраиваем репликацию MySQL
В данном случае мы будем использовать master-master. Для репликации будем использовать нового пользователя. Создаем его на обоих серверах.
Подключаемся к базе
mysql -u root -p > CREATEUSERreplication; GRANTREPLICATIONSLAVEON *.* TOreplicationIDENTIFIEDBY'password'; FLUSHPRIVILEGES;
На leader сервере в /etc/my.cnf в секции [mysqld] добавляем:
Затем необходимо сделать небольшие модификации в конфигурационном файле /etc/named.conf:
Заменяем 1.1.1.1 адресом первого сервера, 2.2.4.4 ip-адресом второго сервера:
// // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // options { listen-on port 53 { 127.0.0.1; 1.1.1.1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; any;}; allow-transfer { localhost; 2.2.4.4; }; recursion yes; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
listen-on можно закомментировать, чтобы он был доступен на всех интерфейсах; recursion необходимо выключить, чтобы предотвратить сервер от DDoS-reflection; allow-transfer директива добавляет второй сервер в whitelists и разрешает трансфер между ними; allow-query меняем на any
Далее необходимо добавить новые зоны для первого домена, мы должны добавить следующие строки в named.conf ниже существующих зон.
zone"your-domain.com" IN { type master; file "/var/named/forward.your-domain.com"; allow-update { none; }; }; zone"4.2.2.in-addr.arpa" IN { type master; file "/var/named/reverse.your-domain.com"; allow-update { none; }; };
После сохранения named.conf с вышеуказанными изменениями, мы готовы создать файлы зон.
Cоздадим forward.your-domain.com в директории /var/named со следующим содержимым:
$TTL 300 @ IN SOA ns1.your-domain.com. root.your-domain.com. ( 2014061200 ;Serial 300 ;Refresh 300 ;Retry 300 ;Expire 300 ;Minimum TTL ) @ IN NS ns1.your-domain.com. @ IN NS ns2.your-domain.com. @ IN A 1.1.1.1 @ IN A 2.2.4.4 ns1 IN A 1.1.1.1 ns2 IN A 2.2.4.4
и reverse.your-domain.com в той же директории
$TTL 300 @ IN SOA ns1.your-domain.com. root.your-domain.com. ( 2014061200 ;Serial 300 ;Refresh 300 ;Retry 300 ;Expire 300 ;Minimum TTL ) @ IN NS ns1.your-domain.com. @ IN NS ns2.your-domain.com. @ IN PTR your-domain.com. ns1 IN A 1.1.1.1 ns2 IN A 2.2.4.4 1 IN PTR ns1.your-domain.com. 4 IN PTR ns2.your-domain.com.
Стартуем и добавляем в автозапуск named
chkconfig named on service named start
Добавляем правила в /etc/sysconfig/iptables
-A INPUT -p udp -m state --state NEW --dport 53 -j ACCEPT -A INPUT -p tcp -m state --state NEW --dport 53 -j ACCEPT
Перезапускаем iptables
service iptables restart
Проверяем конфигурацию и синтаксис зон
[root@Leader /]# named-checkconf /etc/named.conf
[root@Leader /]# named-checkzone your-domain.com /var/named/forward.your-domain.com zone your-domain.com/IN: loaded serial 2014061200 OK
[root@Leader /]# named-checkzone your-domain.com /var/named/reverse.your-domain.com zone your-domain.com/IN: loaded serial 2014061200 OK
Настройка Follower DNS-сервера
Для начала установим BIND и его утилиты
yum install bindbind-utils -y
Затем необходимо сделать небольшие модификации в конфигурационном файле /etc/named.conf:
// // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // options { listen-on port 53 { 127.0.0.1; 2.2.4.4; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; any; }; recursion no; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; zone"your-domain.com" IN { type slave; file "slaves/your-domain.com.fwd"; masters { 1.1.1.1; }; }; zone"1.1.1.in-addr.arpa" IN { type slave; file "slaves/your-domain.com.rev"; masters { 1.1.1.1; }; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
Добавляем демон в автозагрузку и запускаем
chkconfig named on service named start
Теперь прямая и обратная зоны автоматически скопируются с Leader DNS-сервера в /var/named/slaves/, проверяем:
[root@Follower slaves]# ls your-domain.com.fwd your-domain.com.rev
# cat your-domain.com.fwd $ORIGIN . $TTL 300 ; 5 minutes your-domain.com IN SOA ns1.your-domain.com. root.your-domain.com. ( 2014061200 ; serial 300 ; refresh (5 minutes) 300 ; retry (5 minutes) 300 ; expire (5 minutes) 300 ; minimum (5 minutes) ) NS ns1.your-domain.com. NS ns2.your-domain.com. A 1.1.1.1 A 2.2.4.4 $ORIGIN your-domain.com. ns1 A 1.1.1.1 ns2 A 2.2.4.4