HA简介
在hadoop 2.0之前,hadoop 的集群都是单个namenode 节点,这样,一旦任意一个namenode 挂掉。都会导致该集群废掉。
硬件前提
JournalNode machines - 由于JournalNode 是很轻量级的, 所以这个程序一般和其他的程序一起运行, 例如NameNodes, JobTracker, YARN ResourceManager. 注意: 最少得有3台, 建议添加奇数个QJN,例如3,5,.).系统最多可以忍受 (N - 1) / 2 个节点挂掉,N表示总共的节点数
注意,在HA集群中。StandByNamenode 同时扮演着checkpoints namespace 的共给你。所以,你也就没有必要去开启SecondaryNamenode了。
配置全景
进行配置
配置所在的git 仓库地址。
https://gitee.com/blueboz/hadoopconfig
配置完成之后
1.首先需要启动journalNodehdfs --daemon start journalnode
,
使用netstat -nltp 查看端口占用,发现端口确实占用了。
访问界面
2.执行hadoop namenode -format
从随意的一个namenode 节点执行
随后将namenode 中的数据拷贝到另外的一个节点。
3.发现两个节点都是standby ,这是因为我们还没有配置好自动切换哦,这时候,我们需要自己使用命令去切换
官方为我们提供了这个命令去切换
用法:haadmin
[-transitionToActive <serviceId>]
[-transitionToStandby <serviceId>]
[-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
[-getServiceState <serviceId>]
[-getAllServiceState]
[-checkHealth <serviceId>]
[-help <command>]
执行了如下的命令之后,便可以切换成主节点。
./hdfs haadmin -ns ns1 -transitionToActive nn1
这时候,如果我们再次执行主从节点的切换,会失败,原因是已经有了一个节点是主节点,我们此时需要-transitionToStandby 这个命令帮我们先把主节点切换成为备用节点,之后,才能顺利的切换为主节点。
**更简单 的命令 **
这个命令意思是,将nn1主节点切换到nn2
./hdfs haadmin -failover nn1 nn2
注意,在使用联邦的时候由于具有不同的nameserice ,所以在执行上面的命令的 时候,还需要设置参数[-ns <nameserviceId>]
查看指定namenode的状态,在非联邦的情况下,可以只使用serviceId.
查看所有节点的状态,
关于负载均衡
可以尝试访问http://namenode地址:9870/isActive进行节点的状态判断的操作!结果情况如下图片
如何自动切换
从目前的现象来看,他是没有办法帮我们自动的切换主从节点的
自动切换,我们需要为hdfs添加项配置。
- Zookeeper Quorum
- ZkFailOverController(ZKFC)
失败侦测如何侦测服务是否挂掉?依赖zookeeper是个好方法,利用每一个namenode 注册到zk上,一旦服务器崩掉,注册到zk上的信息将会消失。
主namenode选举zookeeper独占锁?
ZKFC(ZKFailoverController )这是一个zookeeper客户端,监控namenode状态,每一个namenode 需要跑一个zkfc,其作用有:
健康监控通过ping 本机的namenode等监控其状态,并且可以修改节点的状态
zk session监控当本地的nn是正常运行
配置信息
<!--hdfs-site.xml -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--core-site.xml-->
<property>
<name>ha.zookeeper.quorum</name>
<value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
</property>
HADOOP_HOME/bin/hdfs zkfc -formatZK
HADOOP_HOME/bin/hdfs --daemon start zkfc
异常处理
java.lang.RuntimeException: Mismatched address stored in ZK for NameNode at /172.17.0.3:8020: Stored protobuf was nameserviceId: "ns1"
namenodeId: "nn2"
hostname: "0e0bf432c069"
port: 8020
zkfcPort: 8019
, address from our own configuration for this NameNode was /172.17.0.3:8020
上面的异常信息是,zk存储的hostname与我们的namenode 不一致导致的,因为zk中只存储域名,而在我们当前主机是ping不同对应的主机,故而出现此错误。解决方法是在/etc/hosts文件中添加所有主机的映射信息。
从下面的图中,虽然我们节点切换成功了,但是出现了一个意外的错误,就是sshfence错误,在于,其使用fuser命令的时候失败了。这个是其内置的命令,原因是我们并没有fuser程序的