Работа с отказоустойчивыми NFS серверами
Значит понадобилось мне рассмотреть варианты работы 2-х серверов, с которых одна папка монтировалась с использованием NFS на несколько других серверов.
Тоесть имеется 3 web сервера и 1 app сервер на котором лежат файлы. Между web серверами и app сервером настоен шаринг папки /var/www по средствам NFS.
Статья о том, как установить и настроить NFS.
Один app сервер - довольно слабо для отказоустойчивого кластера, поэтому возникла идея сделать еще один и настроить синхронизацию контанта с помощью lsync
Осталось подружить web сервера со вторым app сервером в автоматическом режиме.
Понадобилось сделать велосипед, который автоматически монтировал бы папку со второго сервера, если первый выключен.
Собственно этот велосипед должен применяться на каждом web сервере.
На Web сервера нужно установить nmap:
yum install nmap -y
На всех серверах нужно отредактировать файл /etc/sysconfig/nfs
и раскоментировать следующую строку:
MOUNTD_PORT=892
Дальше, для удобства, правим файл /etc/hosts
:
192.168.1.134 nfs1
192.168.1.168 nfs2
Дальше я буду использовать имена серверов вместо их ip адресов.
Я решил разместить все в папке /etc/nfs
mkdir /etc/nfs
Содержимое файла /etc/nfs/nfs
#!/bin/bash usage() { echo "usage: $0 (nf1|nf2)" exit 1 } mn1() { umount /var/www/html/media /sbin/mount.nfs nfs1:/var/www/html/media /var/www/html/media } mn2() { umount /var/www/html/media /sbin/mount.nfs nfs2:/var/www/html/media /var/www/html/media } case "$1" in mn1) mn1 ;; mn2) mn2 ;;
Примсотритесь к коду скрипта. Возможно Вам нужно отредактировать пути.
Делаем скрипт исполняемым:
chmod +x /etc/nfs/nfs
Осталось сделать проверялку. Содержимое файла /etc/nfs/checker
- в спойлере:
#!/bin/bash nfs1_state="active"; nfs2_state="inactive"; while true; do #check if nfs1 server is avaialble live_nfs1=$(nmap -p 892 nfs1 |grep open |awk '{print $2}'); live_nfs2=$(nmap -p 892 nfs2 |grep open |awk '{print $2}'); #Proceed if server is avaialble if [[ "$live_nfs1" = "open" ]]; then if [[ "$nfs1_state" = "inactive" ]]; then /etc/nfs/nfs mn1; nfs1_state="active"; nfs2_state="inactive"; fi sleep 3; elif [[ "$live_nfs2" = "open" ]]; then nfs1_state="inactive"; if [[ "$nfs2_state" = "inactive" ]]; then nfs2_state="active"; /etc/nfs/nfs mn2; fi sleep 3; else nfs2_state="inactive"; sleep 3; fi echo -e "NFS1: $nfs1_state \nNFS2: $nfs2_state \n";
Делаем скрипт исполняемым:
chmod +x /etc/nfs/checker
На всякий случай /etc/init.d/nfs-check
скрипт, который будет стартовать при загрузке системы:
#!/bin/bash ### BEGIN INIT INFO # Should-Start: # Should-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 ### END INIT INFO # Author: TechNoter NAME="NFS Checker" DAEMON="/etc/nfs/checker" start_nfs_checker() { if [ $(ps aux |grep $DAEMON |wc -l) -gt 1 ]; then echo "$NAME is running" else $DAEMON 2>&1 >> /var/log/nfs_checker.log & echo "$NAME Started" fi } stop_nfs_checker() { if [ $(ps aux |grep $DAEMON |wc -l) -gt 1 ]; then kill -9 $(ps aux |grep $DAEMON | sed -n '1p' |awk '{print $2}') echo "Done"; else echo "$NAME not running"; fi } status_nfs_checker() { if [ $(ps aux |grep $DAEMON |wc -l) -gt 1 ] then echo "$NAME is running" else echo "$NAME not running"; fi } case "$1" in start) start_nfs_checker ;; stop) stop_nfs_checker ;; restart) stop_nfs_checker && sleep 2 && start_nfs_checker ;; status) status_nfs_checker ;; *) echo "Usage: $0 {start|stop|restart|status}" esac
Делаем скрипт исполняемым и ставим на автозагрузку:
chmod +x /etc/init.d/nfs-check chkconfig nfs-check on
Предложеный чекер будет проверять какой из серверов жив и будет монтировать с него нажную папку.