HA如是说
甚么是HA
HA: High Availability,高需用软件产业,指的是软件产业7*24半小时无间断服务项目。
为甚么须要HA
在HDFS中,有NameNode、DataNode和SecondaryNameNode配角的原产,应用程序所有的操作方式都是要与NameNode可视化的,与此同时整座软件产业的重新命名遥感也都留存在NameNode结点。但是,那时的软件产业实用性中多于两个NameNode,只好就有两个难题:ECC
所以,甚么是ECC呢?那时软件产业中多于两个NameNode,所以倘若那个NameNode不幸无法访问、升级换代硬体等,导致NameNode不需用了,整座软件产业呢也就不需用了?这是ECC的难题。
为的是化解这样的难题,就须要高需用软件产业了。
高需用的存储方式
characterization商业模式(冷备)预备三台伺服器, 预备完全相同的流程。 三台伺服器对内提供更多服务项目, 称为主结点(Active结点); 除此之外三台伺服器平常不对内提供更多服务项目, 主要负责和Active结点之间进行数据的并行, 称为存储结点(Standby结点). 嫡男结点出现机械故障, Standby结点能手动提高为Active结点, 对内提供更多服务项目。
ZooKeeper实现的软件产业高需用, 选用的是这种商业模式。我作为两个年级的客座教授,在年级负责管理听课的工作。倘若我有六天患病告假了,呢咱年级就得数学课六天了?为的是化解这种的难题,教研室精心安排除此之外两个客座教授,每晚跟著我。我听课听课,他就在旁听着;我听课发问难题,他就在旁看著;我去喝茶,他也在旁跟著;我去上个洗手间,他也在跟著!作为我的两个另一面存在着。由于那个与此同时每晚单厢跟著我,因此我的一举一动,讲了甚么文本,留了甚么工作台,吃了甚么饭,抽了两根烟,他都知道!所以,倘若有六天我患病告假了,他呢就能直接代替我为年级听课呢?
双主互备(接口卡)(了解)预备三台伺服器, 预备完全相同的流程. 与此同时对内提供更多服务项目(这时, 这三台伺服器彼此之间为旁人的存储), 这种, 当三台结点无法访问的时候, 除此之外三台结点还能继续提供更多服务项目.
小明到肯德基喝茶,找服务项目员点餐,这是正常的流程。但是,倘若服务项目员多于两个,并且恰好患病了,所以小明呢将没有办法正常点餐了。为的是化解那个难题,肯德基雇了两个服务项目员,与此同时提供更多服务项目,这种两个服务项目员出难题了,除此之外两个服务项目员依然能提供更多服务项目。
软件产业多备(了解)基本上等同于双主互备, 区别就在于与此同时对内提供更多服务项目的结点数量更多, 存储数量更多 肯德基觉得两个服务项目员也不保险,有两个与此同时患病的可能性,只好又多雇了几个服务项目员。
高需用的实现
我们在这里选用的是characterization商业模式的存储方式,也是预备两个NameNode,两个对内提供更多服务项目,称为Active结点;除此之外两个不对内提供更多服务项目,只是实时的并行Active结点的数据,称为Standby的结点。
为的是提供更多快速的机械故障转移,Standby结点还必须具有软件产业中块位置的最新信息。为的是实现这一点,DataNodes被实用性了两个NameNodes的位置,并向两者发送块位置信息和心跳信号。也是说,DataNode与此同时向两个NameNode心跳反馈。
高需用架构图
编辑
JournalNode
JournalNode的功能Hadoop2.x版本之后, Clouera提出了QJM/QuromJournal Manager, 这是两个基于Paxos算法实现的HA的实现方案
1. 基本的原理是使用2N+1台JN存储EditLog, 每次写入数据的时候, 有半数以上的JN返回成功的信息, 就表示本次的操作方式已经并行到了JN
2. 在HA中, SecondaryNameNode那个配角已经不存在了, 保证Standby结点的元数据信息与Active结点的元数据信息一致, 须要通过若干个JN
3. 当有任何的操作方式发生在Active结点上的时候, JN会记录这些操作方式到半数以上的结点中. Standby结点检测JN中的log日志文件发生了变化, 会读取JN中的数据到自己的内存中, 维护最新的目录树结构与元数据信息
4. 当发生机械故障的时候, Active结点挂掉, 这时Standby结点在成为新的Active结点之前, 会将读取到的EditLog文件在自己的内存中进行推演, 得到最新的目录树结构. 这时再升为Active结点, 能无缝地继续对内提供更多服务项目.防止脑裂的发生对于HA群集的正确操作方式至关重要,一次只能有两个NameNode处于Active状态。否则,名称空间状态将在两者之间迅速分散,从而有数据丢失或其他不正确结果的风险。为的是确保该属性并防止所谓的“裂脑情况”,JournalNode将一次仅允许单个NameNode成为作者。在机械故障转移期间,变为活动状态的NameNode将仅承担写入JournalNodes的配角,这将有效地防止另两个NameNode继续处于活动状态,从而使新的Active能安全地进行机械故障转移。
– 怎么理解脑裂?
是Active结点处于网络震荡状态,假死状态,Standby就转为Active。等网络震荡过后,就有两个Active了,这是脑裂。JournalNode软件产业正常工作的条件– 至少3个Journalnode结点
– 运行个数建议奇数个(3,5,7等)
– 满足(n+1)/2个以上,才能正常服务项目。即能容忍(n-1)/2个机械故障。JournalNode的缺点在这种商业模式下,即使活动结点发生机械故障,系统也不会手动触发从活动NameNode到备用NameNode的机械故障转移,必须须要人为的操作方式才行。要是有两个能监视Active结点的服务项目功能就好了。
那个时候,我们就能使用zookeeper集群服务项目,来帮助我们进行手动容灾了。手动容灾原理
倘若想进行HA的手动机械故障转移,所以须要为HDFS布署两个新组件:ZooKeeper quorum和ZKFailoverController进程(缩写为ZKFC)
Zookeeper quorum
Apache ZooKeeper是一项高需用性服务项目,用于维护少量的协调数据,将数据中的更改通知应用程序并监视应用程序的机械故障。HDFS手动机械故障转移的实现依赖ZooKeeper进行以下操作方式:
– 机械故障检测
软件产业中的每个NameNode计算机都在ZooKeeper中维护两个持久性会话。倘若计算机崩溃,则ZooKeeper会话将终止,通知另两个NameNode应触发机械故障转移。
– 活动的NameNode选举(HA的第一次启动)
ZooKeeper提供更多了一种简单的机制来专门选举两个结点为活动的结点。倘若当前活动的NameNode崩溃,则另两个结点可能会在ZooKeeper中采取特殊的排他锁,指示它应成为下两个活动的NameNode。ZKFC
ZKFailoverController(ZKFC)是两个新组件,它是两个ZooKeeper应用程序,它监视和管理namenode的状态。运行namenode的每台机器单厢运行两个ZKFC,该ZKFC负责管理以下文本:
– 运行状况监视
ZKFC使用运行状况检查命令定期ping其本地NameNode。只要NameNode以健康状态及时响应,ZKFC就会认为该结点是健康的。倘若结点崩溃,冻结或以其他方式进入不正常状态,则运行状况监视器将其标记为不正常。
– ZooKeeper会话管理
当本地NameNode运行状况良好时,ZKFC会在ZooKeeper中保持打开的会话。倘若本地NameNode处于活动状态,则它还将持有两个特殊的“锁定” znode。该锁使用ZooKeeper对“临时”结点的支持。倘若会话到期,则锁定结点将被手动删除。
– 基于ZooKeeper的选举
eNode处于活动状态。机械故障转移过程类似于上述的手动机械故障转移:首先,如有必要,将先前的活动结点隔离,然后将本地NameNode转换为活动状态。手动容灾的过程描述
ZKFC(是两个进程,和NN在同两个物理结点上)有两只手,分别拽着NN和Zookeeper。(监控NameNode健康状态,并向Zookeeper注册NameNode);软件产业一启动,2个NN谁是Active?谁又是Standby呢?
2个ZKFC先判断自己的NN是否健康,倘若健康,2个ZKFC会向zoopkeeper软件产业抢着创建两个结点,结果是多于1个会最终创建成功,从而决定active地位和standby位置。倘若ZKFC1抢到了结点,ZKFC2没有抢到,ZKFC2也会监控watch那个结点。倘若ZKFC1的Active NN异常退出,ZKFC1最先知道,就访问ZK,ZK就会把曾经创建的结点删掉。删除结点是两个事件,谁监控那个节点,就会调用callback回调,ZKFC2就会把自己的地位上升到active,但在此之前要先确认ZKFC1的结点是否真的挂掉?这就引入了第三只手的概念。
ZKFC2通过ssh远程连接NN1尝试旁人降级,判断旁人是否挂了。确认真的不健康,才会真的 上升地位之active。所以ZKFC2的步骤是:
1.创建新结点。
2.第三只手把旁人降级。
3.把自己升级换代
那倘若NN都没毛病,ZKFC挂掉了呢?Zoopkeepkeeper 就会删除该方创建的结点,与此同时另一方创建结点,上升地位。HA的实用性
守护进程布局
qianfeng01: NameNode、DataNode、JournalNode、QuorumPeerMain、ZKFC
qianfeng02: NameNode、DataNode、JournalNode、QuorumPeerMain、ZKFC
qianfeng03: DataNode、JournalNode、QuorumPeerMain那时,先停止HDFS的进程,修改如下的实用性文件吧!
hdfs-site.xml
<!– 注意: 高需用的软件产业,没有SecondaryNameNode的存在,因此在那个文件中之前存在的SecondaryNameNode的实用性须要删除 –> <configuration> <!– 实用性NameNode的逻辑名称 –> <!– 注意: 后面的很多参数实用性都是须要使用到那个名称的 –> <property> <name>dfs.nameservices</name> <value>supercluster</value> </property> <!– 实用性两个NameNode的唯一标识符 –> <property> <name>dfs.ha.namenodes.supercluster</name> <value>nn1,nn2</value> </property> <!– 针对每两个NameNode,实用性自己的RPC通信地址和端口 –> <property> <name>dfs.namenode.rpc-address.supercluster.nn1</name> <value>qianfeng01:9820</value> </property> <property> <name>dfs.namenode.rpc-address.supercluster.nn2</name> <value>qianfeng02:9820</value> </property> <!– 针对每两个NameNode,实用性WebUI的地址和端口 –> <property> <name>dfs.namenode.http-address.supercluster.nn1</name> <value>qianfeng01:9870</value> </property> <property> <name>dfs.namenode.http-address.supercluster.nn2</name> <value>qianfeng02:9870</value> </property> <!– 定义journalnode进程的数据存储的父路径, 目录在上面已经定义好了的:journalData –> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/hadoop-3.3.1/tmp</value> </property> <!– 实用性journalnode的伺服器地址和存储目录(数目为奇数个) –> <!– 伺服器地址使用分号“;”作为分隔符–> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://qianfeng01:8485;qianfeng02:8485;qianfeng03:8485/journalData</value> </property> <!– 指定应用程序连接Active的namenode结点的java类型 –> <property> <name>dfs.client.failover.proxy.provider.supercluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!–为的是保证系统的正确性,在任何时间多于两个NameNode处于Active状态,须要实用性两个防护机制 –> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!–为的是使该防护选项起作用,它必须能够在不提供更多密码的情况下SSH到目标结点。因此,还必须实用性以下属性–> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!– 免密登陆超时时间,超过这时间未连接上,则登陆失败,此实用性可选–> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <!– 支持手动容灾属性 –> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!– 块的副本数量 –> <property> <name>dfs.replication</name> <value>3</value> </property> </configuration>core-site.xml
<configuration> <!–注意:使用到的是在hdfs-site.xml中实用性的逻辑名称 –> <property> <name>fs.defaultFS</name> <value>hdfs://supercluster</value> </property> <!– hdfs的数据留存的路径,被其他属性所依赖的两个基础路径 –> <property> <name>hadoop.tmp.dir</name> <value>/usr/local/hadoop-3.3.1/tmp</value> </property> <!– ZooKeeper服务项目的地址 –> <property> <name>ha.zookeeper.quorum</name> <value>qianfeng01:2181,qianfeng02:2181,qianfeng03:2181</value> </property> </configuration>hadoop-env.sh
# 添加两行 export HDFS_JOURNALNODE_USER=root export HDFS_ZKFC_USER=root分发实用性文件到其他结点
[root@qianfeng01 ~]# cd $HADOOP_HOME/etc [root@qianfeng01 hadoop]# scp -r hadoop qianfeng02:$PWD [root@qianfeng01 hadoop]# scp -r hadoop qianfeng03:$PWD启动软件产业
那时,软件产业已经搭建成为的是高需用的软件产业了。在启动软件产业之前,我们须要先明确一件事情: 软件产业那时的状态有两种:
那个软件产业我之前使用过,NameNode已经存储有数据了(fsimage和edits已生成)那个软件产业是我新搭建的,我直接搭建软件产业的时候就搭建的高需用的软件产业,之前从来没有启动过倘若你是第一种情况,请跳转到普通软件产业转HA
倘若你是第二种情况,请跳转到 直接搭建HA
启动: 普通软件产业转HA
# 1. 启动软件产业的JournalNode服务项目。 # 注意事项: 倘若之前软件产业还在运行,须要先将其停止!使用命令 stop-dfs.sh [root@qianfeng01 ~]# hdfs –daemon start journalnode [root@qianfeng02 ~]# hdfs –daemon start journalnode [root@qianfeng03 ~]# hdfs –daemon start journalnode # 2. 启动以前结点上的namenode进程[root@qianfeng01 ~]# hdfs –daemon start namenode # 3. 在新的namenode结点上拉取镜像文件 [root@qianfeng02 ~]# hdfs namenode -bootstrapStandby # 4. 并行日志到journalnode软件产业上,再启动软件产业 # 先关namenode [root@qianfeng01 ~]# hdfs –daemon stop namenode # 再并行日志 [root@qianfeng01 ~]# hdfs namenode -initializeSharedEdits # 5. 格式化zkfc # 5.1. 前提QuorumPeerMain服务项目必须处于开启状态,应用程序zkfc才能格式化成功 [root@qianfeng01 ~]# zkServer.sh start [root@qianfeng02 ~]# zkServer.sh start [root@qianfeng03 ~]# zkServer.sh start # 5.2. 选择其中两个namenode结点进行格式化zkfc[root@qianfeng01 ~]# hdfs zkfc -formatZK # 6. 你就能快乐的开启HA软件产业进行测试了 [root@qianfeng01 ~]# start-all.sh # 查看NameNode的状态[root@qianfeng01 ~]# hdfs haadmin -getServiceState nn1 # 注意: 以后开HA软件产业时,要先开zookeeper服务项目,再开HDFS。启动: 直接搭建HA
# 1. 启动三个结点上的journalnode服务项目 [root@qianfeng01 ~]# hdfs –daemon start journalnode [root@qianfeng02 ~]# hdfs –daemon start journalnode [root@qianfeng03 ~]# hdfs –daemon start journalnode # 2. 格式化namenode # – 先删除所有结点的${hadoop.tmp.dir}/tmp/的数据(可选,这一步表示弃用fsimage.) # – 选择其中两个namenode进行格式化 [root@qianfeng01 ~]# hdfs namenode -format # – 并启动namenode进程 [root@qianfeng01 ~]# hdfs –daemon start namenode # 3. 在另三台namenode上拉取已格式化的那台机器的镜像文件(数据的一致性) [root@qianfeng02 ~]# hdfs namenode -bootstrapStandby # 4. 然后关闭已经启动的namenode[root@qianfeng01 ~]# hdfs –daemon stop namenode # 5. 格式化zkfc # 5.1. 前提QuorumPeerMain服务项目必须处于开启状态,应用程序zkfc才能格式化成功 [root@qianfeng01 ~]# zkServer.sh start [root@qianfeng02 ~]# zkServer.sh start [root@qianfeng03 ~]# zkServer.sh start # 5.2. 选择其中两个namenode结点进行格式化zkfc [root@qianfeng01 ~]# hdfs zkfc -formatZK # 6. 你就能快乐的开启HA软件产业进行测试了 [root@qianfeng01 ~]# start-all.sh # 注意:以后开HA软件产业时,要先开zookeeper服务项目,再开HDFS。手动容灾测试
由于CentOS7的minimal版本缺少容灾切换ActiveNameNode结点时所须要的组件,因此须要手动安装一下:
yum install -y psmisc
1. 首先查看当前活跃的Active结点是谁
2. Kill掉活跃结点上的NameNode进程,模拟无法访问
3. 观察除此之外两个结点,是否已经变成Active的状态优秀的你与大厂之间只差两个“好流程员”!