HDFS高可用性HA架构原理及环境搭建
1、元数据同步
HDFS高可用性保证两个namenode内存中存储的文件系统元数据是一致的。
namenode的启动过程:一个namenode启动时,读取fsimage和edits文件,读取后会生成新的fsimage和edits文件,另一个namenode同样需要去读取这两个文件,变化后的edits日志文件,同样需要读取。在启动过程中还需要注册、发送心跳报告、读取块的报告,需要向另一个namenode实时的汇报。
日志文件的安全性:cloudera公司提出:分布式日志存储方案。找到一个datanode节点目录,zookeeper在2n+1个节点上有n+1个节点日志文件写成功,就说明该日志文件写成功。写多份,再读取,节点数目必须是奇数。日志文件还可以存储在zookeeper上。
通过代理来让客户端判断现在对外提供服务的是哪台namenode。
有两个namenode,但是必须在任何情况下,只能有一个namenode对外提供服务。
HA架构还有JournalNode日志节点,用来保存运行日志,
而SecondaryNameNode在HA架构下就不需要了。
2、HDFS HA配置步骤
(1)关闭已经启动的所有进程。
(2)配置文件hdfs-site.xml。
dfs.nameservices ns1
指定两个namenodeID名称:
dfs.ha.namenodes.ns1 nn1,nn2
指定namenode所在的机器位置以及交互端口号:
dfs.namenode.rpc-address.ns1.nn1 hadoop-senior.ibeifeng.com:8020 dfs.namenode.rpc-address.ns1.nn2 hadoop-senior02.ibeifeng.com:8020
指定namenode所在的机器位置以及外部交互端口号:
dfs.namenode.http-address.ns1.nn1 hadoop-senior.ibeifeng.com:50070 dfs.namenode.http-address.ns1.nn2 hadoop-senior02.ibeifeng.com:50070
指定日志节点的机器以及端口号以及命名空间名称:
dfs.namenode.shared.edits.dir qjournal://hadoop-senior.ibeifeng.com:8485;hadoop-senior02.ibeifeng.com:8485;hadoop-senior03.ibeifeng.com:8485/ns1
指定并创建日志节点存储的位置路径:
dfs.journalnode.edits.dir /opt/app/hadoop-2.5.0/data/dfs/jn
指定代理访问文件系统:
dfs.client.failover.proxy.provider.ns1 org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
指定隔离的方式,选择的是SSH远程协议:
dfs.ha.fencing.methods sshfence dfs.ha.fencing.ssh.private-key-files /home/beifeng/.ssh/id_rsa
(3)配置文件core-site.xml,指定命名空间:
fs.defaultFS hdfs://ns1
(4)将配置分发到各个节点[beifeng@hadoop-senior etc]$ scp -r hadoop/
hadoop-senior02.ibeifeng.com:/opt/app/hadoop-2.5.0/etc/
(5)先启动zookeeper和日志节点(三台机器上都启动)$ cd /opt/app/zookeeper-3.4.5/
$ bin/zkServer.sh start
$ bin/zkServer.sh status
$ cd /opt/app/hadoop-2.5.0/
$ sbin/hadoop-daemon.sh start journalnode
(6)格式化namenode
注意:如果不清楚有什么选项,可以在输入的命令后加-help$ bin/hdfs namenode -format
启动namenode(一台namenode启动)$ sbin/hadoop-daemon.sh start namenode
另一台namenode做同步$ bin/hdfs namenode -bootstrapStandby
启动datanode(三台datanode都启动)$ sbin/hadoop-daemon.sh start datanode
将一台namenode转为活跃$ bin/hdfs haadmin -transitionToActive
(7)向HDFS上传文件$ bin/hdfs dfs -put etc/hadoop/hdfs-site.xml /user/beifeng/temp/conf
将活跃的namenode进程杀死$ kill -9 3306
将不活跃的namenode进程转为活跃,通过查看HDFS上的文件,以验证HDFS是否共享$ bin/hdfs haadmin -transitionToActive nn2
查看HA服务状态:$ bin/hdfs haadmin -getServiceState
(8)关闭NameNode:$ sbin/hadoop-daemon.sh stop namenode
关闭JournalNode:$ sbin/hadoop-daemon.sh stop journalnode
关闭zookeeper:zookeeper-3.4.5]$ bin/zkServer.sh stop