NameNodeをKeepalivedでVIP化する

NameNodeをKeepalivedでVIP化した話です。
NameNodeHAを組んでHadoop-Clientを設定すればあまり必要はないのですが。
必要に迫られ設定したので残しておきます。

構成

CDH5.2.1(NameNodeHA構成)
Keepalived1.2.13
CentOS6.6
f:id:kashigeru:20150311221827j:plain

NameNode(nn001とnn002)にKeepalivedをインストールしてVIP化し、
notify_masterでMasterになった側が常にNameNode Activeになるようにします。
今回は通常時nn001がMaster、nn002がBackupとします。

keepalivedコンフィグ

Master側(nn001)コンフィグ

vrrp_script check_namenode {
    script "/root/namenodecheck.sh"
    interval 2
    fall 2
    raise 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 121
    priority 101
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.1.1.200
    }
    track_script {
        check_namenode
    }
    notify_master /root/masterscript.sh
}

Backup側(nn002)コンフィグ

vrrp_script check_namenode {
    script "/root/namenodecheck.sh"
    interval 2
    fall 2
    raise 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 121
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.1.1.200
    }
    track_script {
        check_namenode
    }
    notify_master /root/masterscript.sh
}

nopreemptを設定しているので障害が復旧しても切り戻りはありません。

Notify_Masterスクリプト

KeepalivedのステートがMasterになると実行されるスクリプト
Master側(nn001)スクリプト

#!/bin/sh
su - hdfs -c "hdfs haadmin -failover nn002 nn001"

Backup側(nn002)スクリプト

#!/bin/sh
su - hdfs -c "hdfs haadmin -failover nn001 nn002"

Masterになったら常に自分がNameNode Activeになるようにします。

プロセス監視スクリプト

vrrp_scriptで指定する監視スクリプト
failedになればKeepalivedのステートが切り替わります。
Master側(nn001)、Backup側(nn002)共通

#!/bin/sh
count=`ps -ef | grep "hadoop.hdfs.server.namenode.NameNode" | grep -v grep | wc -l`
if [ $count = 1 ]; then
    echo 0
    exit 0
fi
echo 1
exit 1

vrrp_scriptは戻り値0の時が正常とみなされます。

動作確認

筐体障害の場合はそもそもNameNodeもKeepalivedも切り替わるので問題ありません。

今回はプロセスが落ちた場合を考えます。
まず、NameNodeのステータスを確認しておきます。

$ sudo -u hdfs hdfs haadmin -getServiceState nn001
active

$ sudo -u hdfs hdfs haadmin -getServiceState nn002
standby

ではMaster(nn001)のNameNodeプロセスを落とします。

Master(nn001)のログ
VRRP_Scriptに失敗してKeepalivedのステータスがFAULTになります。

Mar 11 21:53:07 nn001 Keepalived_vrrp[1790]: VRRP_Script(check_namenode) failed
Mar 11 21:53:08 nn001 Keepalived_vrrp[1790]: VRRP_Instance(VI_1) Entering FAULT STATE
Mar 11 21:53:08 nn001 Keepalived_vrrp[1790]: VRRP_Instance(VI_1) removing protocol VIPs.
Mar 11 21:53:08 nn001 Keepalived_healthcheckers[1789]: Netlink reflector reports IP 10.1.1.200 removed
Mar 11 21:53:08 nn001 Keepalived_vrrp[1790]: VRRP_Instance(VI_1) Now in FAULT state

Backup(nn002)のログ
KeepalivedのステータスがMasterになります。

Mar 11 21:53:08 nn002 Keepalived_vrrp[7913]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar 11 21:53:09 nn002 Keepalived_vrrp[7913]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 11 21:53:09 nn002 Keepalived_vrrp[7913]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 11 21:53:09 nn002 Keepalived_vrrp[7913]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.1.1.200

NameNodeのステータスを確認します。 nn002がActiveになります。

$ sudo -u hdfs hdfs haadmin -getServiceState nn002
active

参考までにnn001はNameNodeプロセスが起動したらVRRP_Scriptに成功しBackupステータスになります。

Mar 11 21:53:39 nn001 Keepalived_vrrp[1790]: VRRP_Script(check_namenode) succeeded
Mar 11 21:53:39 nn001 Keepalived_vrrp[1790]: VRRP_Instance(VI_1) Entering BACKUP STATE

つぎはKeepalivedプロセスです。
Master(nn001)のKeepalivedプロセスを落とします。

Master(nn001)のログ
VIPがRemoveされます。

Mar 11 21:56:17 nn001 Keepalived[1788]: Stopping Keepalived v1.2.13 (10/15,2014)
Mar 11 21:56:17 nn001 Keepalived_vrrp[1790]: VRRP_Instance(VI_1) sending 0 priority
Mar 11 21:56:17 nn001 Keepalived_vrrp[1790]: VRRP_Instance(VI_1) removing protocol VIPs.

Backup(nn002)のログ
KeepalivedのステータスがMasterになります。

Mar 11 21:56:17 nn002 Keepalived_vrrp[9237]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar 11 21:56:18 nn002 Keepalived_vrrp[9237]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar 11 21:56:18 nn002 Keepalived_vrrp[9237]: VRRP_Instance(VI_1) setting protocol VIPs.
Mar 11 21:56:18 nn002 Keepalived_vrrp[9237]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.1.1.200

NameNodeのステータスは

$ sudo -u hdfs hdfs haadmin -getServiceState nn001
standby

$ sudo -u hdfs hdfs haadmin -getServiceState nn002
active

以上、VIP化でした。
(ノ´▽`)ノ{+++THANK YOU+++}ヽ(´▽`ヽ)

Hadoop徹底入門 第2版

Hadoop徹底入門 第2版

広告を非表示にする