NameNodeHA構成時のFencingMethod動作確認

今回はNameNodeHA構成時のFencingMethodの動作をログから確認してみます。

環境

CDH5.2を使用しHAは下記の構成で組みました。
Namenode2台
JournalNode1台
 
NameNodeHAの設定は下記を参照してください。
HDFS High Availability

hdfs-site.xmlの設定(抜粋)

  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>
      sshfence
      shell(/bin/true)
    </value>
  </property>

  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/var/lib/hadoop-hdfs/.ssh/id_rsa</value>
  </property>

dfs.ha.fencing.methods
 Method方法を指定しています。
 設定はsshfenceとshellfenceを有効にします。
dfs.ha.fencing.ssh.private-key-files
 sshログイン時の鍵の場所を指定します。
 ログインユーザーはhdfsです。

設定に問題がなければActive側のNameNodeに障害が発生したらActiveに昇格したNameNodeからsshでログインしてFencingが実行されるはずです。

初期状態の確認

NameNodeステータスの確認

$ hdfs haadmin -getServiceState nn1
active
$ hdfs haadmin -getServiceState nn2
standby

nn1がActiveになっています。

nn1のListenポート確認

# netstat -ltn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:4242                0.0.0.0:*                   LISTEN
tcp        0      0 10.6.19.145:8019            0.0.0.0:*                   LISTEN
tcp        0      0 10.6.19.145:8020            0.0.0.0:*                   LISTEN
tcp        0      0 10.6.19.145:50070           0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:47518               0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:8480                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:2049                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:10050               0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:8485                0.0.0.0:*                   LISTEN
tcp        0      0 :::111                      :::*                        LISTEN
tcp        0      0 :::3888                     :::*                        LISTEN
tcp        0      0 :::22                       :::*                        LISTEN
tcp        0      0 ::1:631                     :::*                        LISTEN
tcp        0      0 ::1:25                      :::*                        LISTEN
tcp        0      0 :::33180                    :::*                        LISTEN
tcp        0      0 :::57213                    :::*                        LISTEN
tcp        0      0 :::10050                    :::*                        LISTEN
tcp        0      0 :::2181                     :::*                        LISTEN

8020や50070がListenされています。

nn1のnamenodeプロセス確認

# ps ax | grep namenode
 1420 ?        Sl     0:16 /usr/java/jdk1.7.0_67/bin/java -Dproc_namenode -Xmx1000m -Dhadoop.log.dir=/var/log/hadoop-hdfs -Dhadoop.log.file=hadoop-hdfs-namenode-nn1.local.log -Dhadoop.home.dir=/usr/lib/hadoop -Dhadoop.id.str=hdfs -Dhadoop.root.logger=INFO,RFA -Djava.library.path=/usr/lib/hadoop/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Xmx1000m -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=10080 -Dhadoop.security.logger=INFO,RFAS org.apache.hadoop.hdfs.server.namenode.NameNode
 2111 pts/1    R+     0:00 grep hadoop

プロセスも起動しています。

障害の模擬

Activeになっているnn1のiptablesを操作して障害を模擬します。
下記を投入します。

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -j DROP

投入したらしばらく待ちます。

動作確認

NameNodeステータスの確認

$ hdfs haadmin -getServiceState nn2
active

nn2がAcitveになりました。
 
nn1のListenポート確認

# netstat -ltn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:4242                0.0.0.0:*                   LISTEN
tcp        0      0 10.6.19.145:8019            0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:47518               0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:8480                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:2049                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:10050               0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:8485                0.0.0.0:*                   LISTEN
tcp        0      0 :::111                      :::*                        LISTEN
tcp        0      0 :::3888                     :::*                        LISTEN
tcp        0      0 :::22                       :::*                        LISTEN
tcp        0      0 ::1:631                     :::*                        LISTEN
tcp        0      0 ::1:25                      :::*                        LISTEN
tcp        0      0 :::33180                    :::*                        LISTEN
tcp        0      0 :::57213                    :::*                        LISTEN
tcp        0      0 :::10050                    :::*                        LISTEN
tcp        0      0 :::2181                     :::*                        LISTEN

8020と50070が消えています。

nn1のnamenodeプロセス確認

# ps ax | grep namenode
 2124 pts/1    R+     0:00 grep hadoop

プロセスも起動していません。
問題なくFencingが実行されているようです。

最後にログを確認してみます。

Fencingログ

2014-12-12 22:51:46,110 INFO org.apache.hadoop.ha.NodeFencer: ====== Beginning Service Fencing Process... ======
2014-12-12 22:51:46,110 INFO org.apache.hadoop.ha.NodeFencer: Trying method 1/2: org.apache.hadoop.ha.SshFenceByTcpPort(null)
2014-12-12 22:51:46,112 INFO org.apache.hadoop.ha.SshFenceByTcpPort: Connecting to nn1.local...
2014-12-12 22:51:46,112 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: Connecting to nn1.local port 22
2014-12-12 22:51:46,115 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: Connection established
2014-12-12 22:51:46,121 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: Remote version string: SSH-2.0-OpenSSH_5.3
2014-12-12 22:51:46,121 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: Local version string: SSH-2.0-JSCH-0.1.42
2014-12-12 22:51:46,121 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256
2014-12-12 22:51:46,446 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: aes256-ctr is not available.
2014-12-12 22:51:46,446 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: aes192-ctr is not available.
2014-12-12 22:51:46,446 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: aes256-cbc is not available.
2014-12-12 22:51:46,446 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: aes192-cbc is not available.
2014-12-12 22:51:46,446 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: arcfour256 is not available.
2014-12-12 22:51:46,447 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: SSH_MSG_KEXINIT sent
2014-12-12 22:51:46,447 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: SSH_MSG_KEXINIT received
2014-12-12 22:51:46,448 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: kex: server->client aes128-ctr hmac-md5 none
2014-12-12 22:51:46,448 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: kex: client->server aes128-ctr hmac-md5 none
2014-12-12 22:51:46,466 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: SSH_MSG_KEXDH_INIT sent
2014-12-12 22:51:46,469 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: expecting SSH_MSG_KEXDH_REPLY
2014-12-12 22:51:46,483 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: ssh_rsa_verify: signature true
2014-12-12 22:51:46,485 WARN org.apache.hadoop.ha.SshFenceByTcpPort.jsch: Permanently added 'nn1.local' (RSA) to the list of known hosts.
2014-12-12 22:51:46,486 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: SSH_MSG_NEWKEYS sent
2014-12-12 22:51:46,486 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: SSH_MSG_NEWKEYS received
2014-12-12 22:51:46,491 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: SSH_MSG_SERVICE_REQUEST sent
2014-12-12 22:51:46,492 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: SSH_MSG_SERVICE_ACCEPT received
2014-12-12 22:51:46,494 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: Authentications that can continue: gssapi-with-mic,publickey,keyboard-interactive,password
2014-12-12 22:51:46,494 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: Next authentication method: gssapi-with-mic
2014-12-12 22:51:46,511 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: Authentications that can continue: publickey,keyboard-interactive,password
2014-12-12 22:51:46,511 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: Next authentication method: publickey
2014-12-12 22:51:46,645 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: Authentication succeeded (publickey).
2014-12-12 22:51:46,645 INFO org.apache.hadoop.ha.SshFenceByTcpPort: Connected to nn1.local
2014-12-12 22:51:46,645 INFO org.apache.hadoop.ha.SshFenceByTcpPort: Looking for process running on port 8020
2014-12-12 22:51:46,768 WARN org.apache.hadoop.ha.SshFenceByTcpPort: PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 8020 via ssh:                      USER        PID ACCESS COMMAND
2014-12-12 22:51:46,770 WARN org.apache.hadoop.ha.SshFenceByTcpPort: PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 8020 via ssh: 8020/tcp:            hdfs      F.... java
2014-12-12 22:51:46,784 INFO org.apache.hadoop.ha.SshFenceByTcpPort: PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 8020 via ssh:   1420
2014-12-12 22:51:46,786 INFO org.apache.hadoop.ha.SshFenceByTcpPort: Successfully killed process that was listening on port 8020
2014-12-12 22:51:46,786 INFO org.apache.hadoop.ha.SshFenceByTcpPort.jsch: Disconnecting from nn1.local port 22
2014-12-12 22:51:46,788 INFO org.apache.hadoop.ha.NodeFencer: ====== Fencing successful by method org.apache.hadoop.ha.SshFenceByTcpPort(null) ======

sshでnn1にログインして下記が実行されている様子がわかります。

fuser -v -k -n tcp 8020 via ssh:   1420

以上。動作確認でした。
(ノ´▽`)ノ{+++THANK YOU+++}ヽ(´▽`ヽ)

Hadoop 第3版

Hadoop 第3版

Hadoopオペレーション ―システム運用管理ガイド

Hadoopオペレーション ―システム運用管理ガイド