Работа с отказоустойчивыми 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

/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 - в спойлере:

/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 скрипт, который будет стартовать при загрузке системы:

/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

Предложеный чекер будет проверять какой из серверов жив и будет монтировать с него нажную папку.

Share Button
(Visited 197 times, 1 visits today)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *