目录
一、Hadoop高可用集群的配置
第一步:配置文件
1、 [root@hadoop2 hadoop]# vi etc/hadoop/core-site.xml
<configuration>
<property>
#这里的hadoopHA是自定义的集群名称
<name>fs.defaultFS</name>
<value>hdfs://hadoopHA</value>
</property>
#下面两个配置还是保留完全分布式架构的配置
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop/tmp</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
# 使用zookeeper管理的结点列表
<property>
<name>ha.zookeeper.quorum</name>
<value>num01:2181,num02:2181,num03:2181</value>
</property>
</configuration>
2、 [root@hadoop2 hadoop]# vi etc/hadoop/hdfs-site.xml
<configuration>
# 下面两项可以不用修改
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>num02:50090</value>
</property>
# 集群名称
<property>
<name>dfs.nameservices</name>
<value>hadoopHA</value>
</property>
# 设置高可用主副结点
<property>
<name>dfs.ha.namenodes.hadoopHA</name>
<value>nn1,nn2</value>
</property>
# 设置两个namenode的RCP通信地址
<property>
<name>dfs.namenode.rpc-address.hadoopHA.nn1</name>
<value>num01:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hadoopHA.nn2</name>
<value>num03:9000</value>
</property>
# 设置两个namenode的http通信地址
<property>
<name>dfs.namenode.http-address.hadoopHA.nn1</name>
<value>num01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.hadoopHA.nn2</name>
<value>num03:50070</value>
</property>
# 指定namenode元数据在journalnode上的存放地址
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://num01:8485;num02:8485;num03:8485/hadoopHA</value>
</property>
# 配置隔离机制,同一时刻只能保有一个namenode对外通信
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
# 使用ssh无密钥登录
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
# 设置journalnode服务器存储目录
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/hadoop/data/jn</value>
</property>
# 关闭权限检查
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
# 访问代理类: client, mycluster, active 配置失败自动切换实现方
式
<property>
<name>dfs.client.failover.proxy.provider.hadoopHA</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
# 设置自动故障切换
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
第二步:删除所有机器都tmp和logs文件夹
rm -rf logs/ rm -rf tmp/
第三步:启动journalnode(所有机器都要启动)
[root@hadoop2 hadoop]# hadoop-daemon.sh start journalnode
第四步:主结点操作初始化
[root@hadoop2 hadoop]# hdfs namenode -format
第五步:将初始化生成的tmp文件夹同步给副结点(有两种方式)
第一种:直接使用scp同步:scp -r tmp @主机名:$PWD
第二种:执行同步命令:hdfs namenode -bootstrapStandby
第六步:主节点初始化zookeeper服务
[root@hadoop2 hadoop]# hdfs zkfc -formatZK
第七步:主节点启动hdfs服务:
[root@hadoop2 hadoop]# start-hdfs.sh
服务启动后可以看到,设置的主副结点都有namenode和DFSZKFailoverController服务
二、什么是高可用集群
1、什么是高可用集群
高可用集群(High Availability Cluster,简称HA Cluster),是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断地提供服务,把因为软件,硬件,人为造成的故障对业务的影响降低到最小程度。总而言之就是保证公司业务7*24小时不宕机
2、高可用集群的衡量标准
通常用平均无故障时间(MTTF:mean time to failure)来衡量系统的可靠性,用平均故障维修时间(MTTR:Mean Time Between Failures)来度量系统的可维护性。于是可用性被定义为: HA=MTTF/(MTTF+MTTR)*100%。
3、高可用集群实现原理
高可用集群主要是实现自动侦测(Auto-Detect)故障、自动切换/故障转移(FailOver)和 自动恢复(FailBack)。
(1:自动侦测、故障检测:通过集群各节点间心跳信息判断节点是否出现故障;
(2:当有节点(一个或多个)和另外节点互相接收不到对方心跳信息时,如何决定哪一部分接点是正常运行的,而哪一部分是出现故障需要隔离的呢?
这时候通过法定票数(quorum)决定,即当有节点故障时,节点间投票决定哪个节点是有问题,得票数大于半数为合法,每个节点可以设置其票数,当一个节点能和另一个节点保持心跳信息,该节点就获取了另一个节点的票数,该节点获得就是正常节点,反之为故障节点。
三、JournalNode的作用
**为了使Standby节点保持其状态与Active 节点同步,两个节点都与一组称为"JournalNodes"(JN)的单独守护进程进行通信。**当Active 节点执行任何命名空间修改时,它会持久地将修改记录记录到这些JN的大多数中。Standby节点能够从JN读取edit log内容,并不断监视它们以查看edit log内容的更改。当“Standby节点”看到edit log变化时,会将其应用到自己的命名空间。发生故障转移时,备用服务器将确保在将自身升级为活跃状态之前,已从JournalNode读取所有edit log内容。这样可确保在发生故障转移之前,命名空间状态已经完全同步。
JournalNode守护程序相对较轻,因此可以合理地将这些守护程序与其他Hadoop守护程序(例如NameNodes,JobTracker或YARN ResourceManager)并置在计算机上。
注意:必须至少有3个JournalNode守护程序,因为必须将编辑日志修改写入大多数JN。这将允许系统容忍单个计算机的故障。您可能还会运行3个以上的JournalNode,但是为了实际增加系统可以容忍的故障数量,您应该运行奇数个JN(即3、5、7等)。请注意,当与N个JournalNode一起运行时,系统最多可以容忍(N-1)/ 2个故障,并继续正常运行
四、主节点namenode初始化的作用
1 初始化操作
bin/hdfs namenode -format
初始化作用:
1.会生成namenode的文件目录结构
in_use.lock是在使用的时候生成和
edits相关的也是在使用之后生成
2. 确定了三个id namespace cluster blockpool
namespaceID:是系统文件的唯一标识符,格式化文件系统之后会生成
clusterID :生成的集群的ID
blockpoolID:针对每一个namespace对应的blockpool的ID 包含储存节点IP等信息
3. 生成了fsimage_00000
五、journalnode和zookeeper区别
journalnode的作用是在HA的两个namenode之间保持editlog的共享同步。
zookeeper用于两个namenode之间互相的错误感知(active的掉了,standby的可以看见)。