一、規劃角色
TIPS:
- ZKFC和NN成對出現
- NN:獨享硬件
- ZK:單獨一個集羣
二、ZK配置(在node02、node03、node04上安裝ZK)
1、解壓
2、配置環境變量(node02、node03、node04都配置,配置完成記得加載profile文件)
vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_67
export HADOOP_HOME=/opt/hadoop-2.6.5
export ZOOKEEPER_HOME=/opt/zookeeper-3.4.6
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
3、配置ZK
cp zoo_sample.cfg zoo.cfg
dataDir=/var/zookeeper
clientPort=2181
server.1=192.168.224.12:2888:3888
server.2=192.168.224.13:2888:3888
server.3=192.168.224.14:2888:3888
創建目錄並將自己的數字寫入myid
mkdir -p zookeeper
echo 1 > zookeeper/myid
4、ZK原理
zk運行時有兩個狀態,一個可用(有主模型),一個不可用(無主模型)。
zk工作在主從模型,一個leader,多個follower,follower提交增刪改的操作給leader,leader是單點,當leader掛掉,即無法提供服務,此時進入無主模型,將進行選舉,選出新的leader對外提供服務。
當leader掛掉,然後選舉,再恢復,官方壓測結果爲200ms。端口2888用於有主模型,端口3888用於無主模型。
過半機制:
一半寫成功即成功,不爲強一致性,損失可用性。在事務決策和選舉時,一半成功即成功。
如何選舉:
- 看zxid(事務id)
數據版本的id,誰的更全,更大,誰就是leader
- 看serverid
server.1、server.2、server.3三個數字,當無主模型下,哪個數字大,哪個就是leader。
5、分發ZK到node03、node04,並配置myid
scp -r ./zookeeper-3.4.6/ node03:`pwd`
scp -r ./zookeeper-3.4.6/ node04:`pwd`
mkdir -p zookeeper
echo 2 > zookeeper/myid
mkdir -p zookeeper
echo 3 > zookeeper/myid
6、啓動ZK
啓動node02(因爲過半機制,三臺機器需要啓動兩臺才能進入有主模式)
啓動node03(此時,選舉完成,node03是leader,node02是follower)
啓動node04(此時,毫無意外,node04是follower)
三、配置Hadoop
1、備份完全分佈式配置文件
2、配置NameNode(邏輯到物理的映射)
vi hdfs-site.xml
<property>
<name>dfs.nameservices</name>
<value>mycluster</value> #邏輯名
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:50070</value>
</property>
TIPS:SecondaryNameNode的配置不再需要,它的功能由StandbyNameNode實現了。
3、配置JournalNode
vi hdfs-site.xml
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property> #JournalNode的位置、數據目錄
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/hadoop/ha/jn</value> #持久化數據存放目錄
</property>
TIPS:
- NN和JN的通信
- 管理腳本啓動JN
- 使用JN的數據目錄
4、故障轉移的實現和代理
vi hdfs-site.xml
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
5、配置ZKFC
vi hdfs-site.xml
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
6、配置HDFS客戶端的路徑和數據存放目錄
vi core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop/ha</value>
</property>
7、在Hadoop中配置Zookeeper
vi core-site.xml
<property>
<name>ha.zookeeper.quorum</name>
<value>node02:2181,node03:2181,node04:2181</value>
</property>
8、往node02、node03、node04分發hadoop配置
9、免密鑰
9.1、場景:
- 管理節點給其他節點分發,node01到其他節點
- ZKFC免祕鑰,node01到自己,node01到node02,node02到自己,node02到node01。
9.2、創建祕鑰(node01、node02、node03、node04):
ssh-keygen -t dsa -P '' -f /root/.ssh/id_dsa
- -t:類型
- -P:密碼
- -f:文件生成路徑(公鑰)
- ls -a:顯示隱藏文件
9.3、對自己免密鑰(node01、node02):
cat id_dsa.pub >> authorized_keys
9.4、對其他節點免祕鑰(node01對node02、node03、node04)(node02對node01):
9.4.1、祕鑰分發到node02、node03、node04
scp id_dsa.pub node02:`pwd`/node01.pub
scp id_dsa.pub node03:`pwd`/node01.pub
scp id_dsa.pub node04:`pwd`/node01.pub
9.4.2、將node01的祕鑰添加到node02、node03、node04的授權文件
cat node01.pub >> authorized_keys(node02、node03、node04)
9.4.3、將node02的祕鑰發給node01
9.4.4、將node02的祕鑰添加到node01的授權文件
9.4.5、測試
四、部署
1、啓動JournalNode(node01、node02、node03)
hadoop-daemon.sh start journalnode
TIPS:
JN裏面保存了edits,格式化需要清理的內容
2、格式化並啓動其中一臺NameNode(看到successfully formatted表示格式化成功)
hdfs namenode -format
hadoop-daemon.sh start namenode
3、另外一臺NameNode以Standby方式啓動(去同步第一臺NameNode元數據)
hdfs namenode -bootstrapStandby
TIPS:
此時不對ZK格式化並啓動ZK,工作模式就是半自動HA。
4、ZKFC格式化ZK(其實就是在zk下創建一個節點,不會影響到其他的HDFS集羣)
hdfs zkfc -formatZK
5、查看ZK
6、啓動HDFS
start-dfs.sh
7、查看各個節點的角色
8、查看ZK
9、查看圖像化界面
五、驗證HA
1、手動殺死node01的NameNode
訪問http://node01:50070和http://node02:50070,發現node01無法訪問,node02升級爲Active。
ZK的目錄鎖也變成node02的
2、恢復node01的NameNode
hadoop-daemon.sh start namenode
訪問http://node01:50070和http://node02:50070,發現node01爲Standby,node02爲Active。
3、手動殺死node02的ZKFC
訪問http://node01:50070和http://node02:50070,發現node01升級爲Active,node02降級爲Standby。
ZK的目錄鎖也變成node01的
4、恢復node02的ZKFC
hadoop-deamon.sh start zkfc
六、停止HDFS
stop-dfs.sh