1、NN–Active 如果挂掉了 failoveController Active 会报告给另外一个 然后将NN–Active降下去 NN–Standby 升起来
2、如果failoveController Active 挂掉 NN–Active没挂 另外一个也会收到 然后将NN–Active 降下去 将NN–Standby 升起来
所以搭建HA 还需要搭建Zookeeper
ZKFC(ZKFailoverController)作用: 监测NameNode,进行active, standby 之间的切换
ZKFailoverController主要职责:
健康监测:周期性的向它监控的NN发送健康探测命令,从而来确定某个NameNode是否处于健康状态,如果机器宕机,心跳失败,那么zkfc就会标记它处于一个不健康的状态
会话管理:如果NN是健康的,zkfc就会在zookeeper中保持一个打开的会话,如果NameNode同时还是Active状态的,那么zkfc还会在Zookeeper中占有一个类型为短暂类型的znode,当这个NN挂掉时,这个znode将会被删除,然后备用的NN,将会得到这把锁,升级为主NN,同时标记状态为Active
当宕机的NN新启动时,它会再次注册zookeper,发现已经有znode锁了,便会自动变为Standby状态,如此往复循环,保证高可靠,需要注意,目前仅仅支持最多配置2个NN
master选举:如上所述,通过在zookeeper中维持一个短暂类型的znode,来实现抢占式的锁机制,从而判断那个NameNode为Active状态
JN (JournalNode) 两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信
必须允许至少3个节点。当然可以运行更多,但是必须是奇数个
1、配置hdfs-site.xml 其他配置全删
①、 名字服务的逻辑名称,两个NameNode做一个来使用,通过该逻辑名称引用
dfs.nameservices
mycluster
②、- mycluster有两个namenode服务
dfs.ha.namenodes.mycluster
nn1,nn2
③、指定nn1和nn2具体是哪个进程 -->
dfs.namenode.rpc-address.mycluster.nn1
node001:8020
dfs.namenode.rpc-address.mycluster.nn2
node002:8020
④、 指定浏览器访问nn1和nn2的地址 -->
http://node001:50070访问nameNode -->
dfs.namenode.http-address.mycluster.nn1
node001:50070
dfs.namenode.http-address.mycluster.nn2
node002:50070
⑤、<指定journalnode所在的位置 -->
dfs.namenode.shared.edits.dir
qjournal://node001:8485;node002:8485;node003:8485/
⑥、 如果发生了故障转移,如何跟另一台通信,
杀死那个Active的NameNode,因为要发生切换了 -->
dfs.ha.fencing.methods
sshfence
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value> <!--存放私有的key的地方-->
</property>
<!-- 启用自动故障转移操作 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 客户端如何跟Active的NameNode通信 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
2、配置 core-site.xml 其他配置全删
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定journalnodes写的状态信息保存的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/hadoop/ha/jdns</value>
</property>
<!-- 指定zookeeper所在的位置 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node002:2181,node003:2181,node004:2181</value>
</property>
<!-- 指定hadooop.tmp.dir的路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop/ha</value>
</property>
2.1、将这两个文件 拷贝到其他节点去
3、配置好zookeeper
4、使用hadoop-daemon.sh start journalnode在每个JN节点上启动journalnode进程
5、在node001上格式化HDFS
6、在node002上同步数据
a 在node001上启动namenode进程hadoop-daemon.sh start namenode
b、hdfs namenode -bootstrapStandby
7、hdfs zkfc -formatZK在node001上执行,在zookeeper上初始化HA状态
8、start-dfs.sh启动集群
hadoop-daemon.sh start namenode
hadoop-daemon.sh stop namenode
stop-dfs.sh停止集群
zkServer.sh stop停止各个zookeeper进程
zkServer.sh start启动各个zookeeper进程
start-dfs.sh启动ha集群
cd /opt/hadoop-2.6.5/etc/hadoop
1、vim core-site.xml
然后复制
fs.defaultFS
hdfs://mycluster
<!-- 指定journalnodes写的状态信息保存的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/hadoop/ha/jns</value>
</property>
<!-- 指定zookeeper所在的位置 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>node002:2181,node003:2181,node004:2181</value>
</property>
<!-- 指定hadooop.tmp.dir的路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop/ha</value>
</property>
2、vim hdfs-site.xml
然后复制上去
dfs.nameservices
mycluster
dfs.ha.namenodes.mycluster
nn1,nn2
<!-- 指定nn1和nn2具体是哪个进程 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node001:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node002:8020</value>
</property>
<!-- 指定浏览器访问nn1和nn2的地址 -->
<!-- http://node001:50070访问nameNode -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node001:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<!-- 指定journalnode所在的位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node001:8485;node002:8485;node003:8485/mycluster</value>
<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>
<!-- 启用自动故障转移操作 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 客户端如何跟Active的NameNode通信 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
3、将这两个文件 拷贝到其他节点去
scp core-site.xml hdfs-site.xml node002:pwd
scp core-site.xml hdfs-site.xml node003:pwd
scp core-site.xml hdfs-site.xml node004:pwd
4、安装zooKeeper
先将zooKeeper 拉进linux里
tar -zxf zookeeper-3.4.9.tar.gz -C /opt
5、node002免秘登录配置到其他节点 因为node002 是作为node001的替代品 所以 需要其他也免秘登录
node002 的/root/.ssh cd ~/.ssh
scp id_dsa.pub node003:pwd
/node002.pub
scp id_dsa.pub node004:pwd
/node002.pub
node003的 的/root/.ssh
cat node002.pub >> authorized_keys
node004的 的/root/.ssh
cat node002.pub >> authorized_keys
6、node02配置zooKeeper
在 这个 /opt/zookeeper-3.4.9/conf
复制一份 cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
7、node002拷贝zooKeeper到node003、node004
scp -r zookeeper-3.4.9/ node003:pwd
scp -r zookeeper-3.4.9/ node004:pwd
8、被zookeeper选中的节点 node002、node003、node004都要写
mkdir -p /var/hadoop-data/ha/zookeeper
echo 1 > /var/hadoop-data/ha/zookeeper/myid
数字是根据创建的ip 来根据写的
9、最后配置一下变量
配置node002、node003、node004
vim /etc/profile 或者 vim ~/.bash_profile
分别source /etc/profile
然后每个 zkServer.sh start 启动
zkServer.sh status 查看启动状态
二、然后开始启动启动journalnode进程
1、命令:hadoop-daemon.sh start journalnode 需要启动node01 node02 node03 这三个节点
2、node001 格式化hdfs hadoop namenode -format
3、 在node001上启动namenode进程hadoop-daemon.sh start namenode
4、secondary node(node002)节点上 :hdfs namenode -bootstrapStandby
两台机器在 /var/hadoop/ha/dfs/name/current 的 VERSION数据是一样的 因为 secondary node 是第二个备用的
启动单台机器的zkfc hadoop-daemon.sh start zkfc
在node001
3、hdfs zkfc -formatZK在node001上执行,在zookeeper上初始化HA状态
4、start-dfs.sh 启动集群
5、start-dfs.sh 在node001运行
hadoop-daemon.sh start namenode 启动namenode
hadoop-daemon.sh stop namenode 关闭namenode
关闭
stop-dfs.sh 是关闭所有的节点 在node001运行
但是zookeeper 是不关的 需要手动关闭 zkServer.sh stop
stop-dfs.sh停止集群
zkServer.sh stop停止各个zookeeper进程
启动
zkServer.sh start启动各个zookeeper进程
start-dfs.sh启动ha集群