目录
高可靠性与高可用性
日志管理器QJM
搭建HA集群
ZooKeeper简介
自动故障转移
高可靠性也可以称为高容错性,体现在一份数据以多份副本的形式存储在datanode中,并且通过自身持续的状态监控快速检测到冗余错误,并且能够快速、自动恢复失效的组件。
可以说高可靠性是保证了datanode上的数据可靠,而普通集群中只有一个namenode,如果唯一namenode失效了,此时任何与集群有关的操作都失效了,因为namenode是唯一存储元数据与块地址映射的地方。这样的话,必须要启动一个新的namenode,并且需要拥有原namenode的文件系统元数据。所以新的namenode需要将命令空间的镜像导入到内存中,重演编辑日志文件,接受足够多的的来自datanode的数据块报告并退出安全模式。而高可靠性解决了集群中的namenode存在的单点故障。
影响集群的可用性主要在于两方面:对于计划外事件(例如计算机崩溃),在操作员重新启动NameNode之前,群集将不可用;计划维护事件(如NameNode计算机上的软件或硬件升级)将导致群集停机。
高可用性是通过在同一集群中运行两个冗余namenode,实际上这是一对活动-备用namenode,当活动namenode失效时,备用namenode会接管它的任务并开始服务来自客户端的请求,期间没有明显的中断,允许机器在崩溃时快速故障转移,解决了集群中的namenode存在的单点故障。
为了达到高可靠性:
hdfs-site.xml
配置名称服务的昵称
dfs.nameservices
mycluster
为名称服务配置相应的ID唯一标识符,每个名称服务最多只能配置两个NameNode
dfs.ha.namenodes.mycluster
nn1,nn2
为名称服务的唯一标识符配置独立完整的rpc地址
dfs.namenode.rpc-address.mycluster.nn1
master1:9000
dfs.namenode.rpc-address.mycluster.nn2
slave1:9000
为名称服务的唯一标识符配置独立完整的http地址
dfs.namenode.http-address.mycluster.nn1
master1:50070
dfs.namenode.http-address.mycluster.nn2
slave1:50070
指定journalnode守护进程所在的机器,及其指定目录;JournalNode的默认端口为8485
dfs.namenode.shared.edits.dir
qjournal://master1:8485;slave2:8485;slave3:8485/mycluster
配置client用于连接ActiveNamenode的java类型
dfs.client.failover.proxy.provider.mycluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
配置防护方式sshfence,防止脑裂的产生,还必须配置无密码登陆
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/home/jinge/.ssh/id_rsa
core-site.xml
配置默认的namenode的请求路径
fs.defaultFS
hdfs://mycluster
配置journalnode所产生的目录的具体路径
dfs.journalnode.edits.dir
/home/jinge/apps/hadoop/tmp
在设置了所有必需的配置选项后,必须在将运行它们的一组计算机上启动JournalNode守护程序,通过以下命令
hadoop-daemon.sh start journalnode
元数据无非是镜像文件和编辑日志
同步镜像文件
1、如果是新搭建的集群,在其中一个namenode中运行格式化命令
hdfs namenode -format
2、如果您已经格式化了NameNode,则需要将已格式化namenode中的元数据目录(镜像文件)复制到另一个未格式化的namenode上,会在未格式化的机器上生成${hadoop.tmp.dir}/dfs/name,并存储最新的镜像文件
首先在已格式化的namenode上开启namenode服务
hadoop-daemon.sh start namenode
再在未格式化的namenode上同步元数据
hdfs namenode -bootstrapStandby
同步编辑日志
共享编辑日志是存放在journalnode中的
1、首先关闭已格式化namenode中的namenode进程
hadoop-daemon.sh stop namenode
2、journalnode共享日志初始化,同步编辑日志,journalnode故障数需不能>(n-1/2),再任一日志节点中运行一下命令
hdfs namenode -initializeSharedEdits
start-dfs.sh
服务开启顺序:namenode→datanode→journalnode
hdfs haadmin
[-transitionToActive [--forceactive] ]
[-transitionToStandby ]
[-failover [--forcefence] [--forceactive] ]
[-getServiceState ]
[-checkHealth ]
[-help ]
当进行故障转移时,需要手动通过hdfs haadmin -transitionToActive命令将备用namenode激活,而可以通过zookeeper达到自动故障转移。
zookeeper是hadoop的分布式协调服务。部分失败是分布式系统固有的特征,zookeeper提供了一组工具可在构建分布式应用时能够对部分失败进行正确处理。
zookeeper的特点:
不难发现QJM的工作方式与zookeeper相似,但QJM的实现并没有使用zookeeper。而HA集群在选取活动namenode时使用了zookeeper技术中的领导者选举。
自动故障转移为HDFS部署添加了两个新组件:ZooKeeper仲裁和ZKFailoverController进程(ZKFC)
自动故障转移的实现依赖于ZooKeeper来实现以下功能:
ZKFailoverController是一个ZooKeeper客户端,由它坚实和管理namenode的状态,运行NameNode的每台机器也运行ZKFC,ZKFC负责:
zookeeper的安装
下载zookeeper-3.4.6.tar.gz并上传至虚拟机中,解压并在~/.bash_profile中配置环境变量ZOOKEEPER_HOME及PATH=$ZOOKEEPER_HOME/bin:$PATH
独立模式
在$ZOOKEEPER_HOME/conf下复制一份模板zoo_sample.cfg命名为zoo.cfg,内容如下
tickTime=2000
initLimit=10
syncLimit=5
#dataDir=/tmp/zookeeper zookeeper持久化数据的存储位置,可更改在$ZOOKEEPER_HOME下
dataDir=/home/jinge/apps/zookeeper/tmp/zookeeper
clientPort=2181
在本地上开启server
zkServer.sh start
此时通过jps可发现多了一个名为QuorumPeerMain的进程
使用客户端连接服务
zkCli.sh [-server] [host] -> zkCli.sh -server 127.0.0.1:2181
此时多了一个名为ZooKeeperMain的进程,可通过help查看相关zk命令
集群模式
修改zoo.cfg配置文件内容
tickTime=2000
dataDir=/home/jinge/apps/zookeeper/tmp/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
#zookeeper仲裁进程QuorumPeerMain运行在3台机器上
server.1=master1:2888:3888
server.2=slave2:2888:3888
server.3=slave3:2888:2888
通过scp将zookeeper复制到相应节点
scp ~/apps/zookeeper-3.4.6 jinge@slave2:~/apps/
scp ~/apps/zookeeper-3.4.6 jinge@slave3:~/apps/
在server.n对应的机器上的dataDir指定的目录下添加mymid文件,内容为n
在通过zkServer.sh start启动,此时可以通过zkCli.sh [-server] [host]访问到3个server中任一客户端,并且内容是一致的
配置HA自动故障转移
修改hdfs-site.xml,支持自动故障转移
dfs.ha.automatic-failover.enabled
true
修改core-site.xml,配置zookeeper服务器,与zoo.cfg指定的一致
ha.zookeeper.quorum
master1:2181,slave2:2181,slave3:2181
在任一namenode上进行格式化zookeeper,这将在ZooKeeper中创建一个znode,其中自动故障转移系统存储其数据
hdfs zkfc -formatZK
开启HA集群
首先开启zkServer,再通过 start-dfs.sh 开启HA集群,启动顺序:namenode→datanode→journalnode→zkfc
手动开启zkfc:
hadoop-daemon.sh start zkfc
zkfc的进程名为DFSZKFailoverController,会运行在2个namenode中
此时会在zk中多了一个hadoop-ha结点,并且有一个名为mycluster(名称服务的唯一标识符)的子结点,mycluster下:
[zk: master1(CONNECTED) 4] ls /hadoop-ha/mycluster
[ActiveBreadCrumb, ActiveStandbyElectorLock]