[译]HDFS 滚动升级和降级
介绍
HDFS滚动升级可以升级单独的HDFS守护进程. 例如, datanode们可以独立于namenode来升级. 一个namenode也可以独立于其他的namenode们来升级. namenode们也可以独立于datanode们和journal node们升级.
升级
在Hadoop版本2中, HDFS支持高可用(HA)namenode服务并结合兼容性. 这两项能力使其可以在避免停机时间的情况升级HDFS. 要无停机地升级一个HDFS集群, 这个集群就必须是配置为高可用的.
如果升级后, 在新版中有任何在旧版本中不能使用的新特性, 那么这次升级就必须按以下步骤进行:
- 关闭新特性
- 升级集群
- 开启新特性
请注意, 滚动升级是在Hadoop 2.4版本开始支持的.
无停机升级
在一个高可用集群中, 有至少2个namenodes(NNS), 多个datanodes(DNs), 少数JournalNodes(JNs)和少数Zookeeper节点(ZKNs). JNs相当稳定,在多数情况下, 升级HDFS时不需要升级. 在本文描述的滚动升级中, 只考虑升级NNs(namenodes)和DNs(datanodes), 但是JNs和ZKNs不考虑. 升级JNs和ZKNs可能会导致集群停机.(按: Zookeeper其实也可以进行滚动升级)
升级非联邦集群
假设集群有两个namenodes: NN1和NN2, 各种处于活动和待机状态. 按以下步骤进行高可用集群升级:
-
准备滚动升级
1.1. 执行"hdfs dfsadmin rollingUpgrade prepare"以生成一个文件系统镜像以供回滚.
1.2. 执行"hdfs dfsadmin -rollingUpgrade query
"来检查回滚镜像的状态. 来回执行并等待, 直到显示消息"Proceed with rolling upgrade". -
升级活动和待机NNs
2.1. 关闭并升级NN2 (待机节点)
2.2. 用"-rollingUpgrade started
"选项, 启动NN2到待机状态.
2.3. 从NN1(活动)切换NN2(待机), NN2成为活动节点, NN1变成待机节点.
2.4. 关闭并重启NN1
2.5. 用"-rollingUpgrade started
"选项, 启动NN1到待机状态. -
升级DNs
3.1. 选择一小部分datanodes(例如, 某个机架上的所有datanodes).
3.1.1 执行"hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade
"来关闭其中某一个指定的datanodes.
3.1.2 执行 "hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>
" 来检查并等待datanode关闭.
3.1.4. 同时对所有要操作所有datanode执行以上操作.
3.2 反复执行上述步骤直到集群中所有的datanode都被升级. -
结束滚动升级
4.1. 执行"hdfs dfsadmin -rollingUpgrade finalize
"来结束滚动升级.
升级联盟集群
在一个联盟集群中, 有多个命名空间, 每个命名空间都有各自的活动和待机NNs. 升级一个联盟集群的过程类似于升级非联盟集群, 区别在于第一步和第四步在每一个命名空间上都执行, 而第二步在每一对活动和待机namenodes上执行. 例如:
- 为每个命名空间准备滚动升级
- 升级各个命名空间的活动和待机namenodes
- 升级datanodes
- 结束各个命名空间的升级
停机并升级
对于非高可用的集群, 是不可能升级HDFS且避免停机, 因为要重启namenodes. 不过, datanodes还是可以滚动升级的.
升级非高可用集群
在一个非高可用集群中, 有一个Namenode(NN),一个SecondaryNameNode(SNN)和多个datanodes(DNs). 升级一个非高可用集群的过程类似于升级一个高可用集群, 除了第二步"升级活动和待机节点"要改成以下步骤:
- 升级namenode和secondary namenode
1.1 关闭Secondary namenode
1.2 关闭并升级Namenode
1.3 用"-rollingUpgrade started
"选项启动Namenode
1.4 升级和启动Secondary Namenode
降级和回滚
当升级的版本不是需要的版本,或者在某些不太可能的情况下, 升级失败了(因为新版本中的某些bug), 管理员可以选择降级HDFS到升级之前的版本, 或者回滚到升级前的版本和状态.
请注意, 降级可以用滚动方式进行, 但是回滚不行. 回滚时就要停机.
请注意, 降级和回滚只能在一个滚动升级开始后, 和升级终止之间进行. 一个升级过程可以被"结束", 降级或者回滚 其中之一操作终止. 所以, 结束升级,或者降级之后,或无法回滚, 或者结束后无法降级.
降级
降级把系统恢复到升级前版本,且保持用户数据. 假设在时间点T, 滚动升级开始, 这个升级被降级所终止的话, 在时间点T之前或者之后创建的文件都保持在HDFS上, 在时间点T之前或之后删除的文件也是在HDFS里被删除的.
在新版本和旧版本之间, 只有当两边的namenode版本和datanode版本还没在这两个版本之间改变时, 新版本才能降级到旧版本.(不清楚, 请赐教,谢谢. A newer release is downgradable to the pre-upgrade release only if both the namenode layout version and the datanode layout version are not changed between these two releases.)
在一个高可用集群, 当滚动升级从旧版本到新版本在进行中时, 是可以滚动方式降级的, 升级的机器回到旧版本. 同前例, 假设NN1和NN2各自在活动和待机状态. 以下是无停机滚动降级的步骤:
-
降级Datanodes
1.1 选择一小部分datanodes(例如, 某个机架上的所有datanodes).
1.1.1. 执行"hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade" 来关闭其中某个datanode.
1.1.2. 执行"hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>
" 来检查并等待datanode关闭.
1.1.3. 降级并重新启动datanode
1.1.4. 对所有选择的datanode同时执行上述操作.
1.2 对所有已经升级的datanode同时执行上述操作, 直到集群中所有datanode都被降级. -
降级活动和待机的namenodes
2.1. 关闭和降级待机的NN2
2.2. 正常重启NN2到待机状态
2.3. 从活动的NN1切换到待机NN2上, NN2变成活动状态, NN1变成待机状态.
2.4. 关闭和降级NN1
2.5. 重启NN1到待机状态 -
结束滚动降级
3.1 执行"hdfs dfsadmin -rollingUpgrade finalize
"来结束滚动降级.
请注意, datanodes必须在namenode降级之前降级, 因为通讯协议是向下兼容的而不是向上兼容的. 例如老版本的datanode可以和新版本的namenode通讯,但是新版本的datanode未必能和老版本的namenode通讯.
回滚
回滚把系统恢复到升级前版本, 还把用户的数据恢复到升级前状态. 假设在时间点T, 滚动升级开始, 这个升级被回滚所终止的话, 在时间点T之前创建的文件都保持在HDFS上, 时间点T之后创建的文件就不存在了. 在时间点T之前的文件在HDFS里被删除的, 在时间点T之后删除的文件就被恢复了.
从新版本回滚到旧版本是一直支持的. 但是, 回滚操作不能滚动执行. 这需要停机时间. 设NN1和NN2分别处于活动和待机状态. 以下是回滚步骤:
- 回滚HDFS
1.1. 关闭所有namenodes和datanodes
1.2. 在所有机器上恢复到旧版本
1.3. 用"-rollingUpgrade rollback
"选项吧NN1启动为活动状态.
1.4. 用"-bootstrapStandby"选项执行NN2,并启动为待机状态.
1.5. 以"-rollback"选项启动DNs
滚动升级用到的命令和启动选项
DFSAdmin 命令
hdfs dfsadmin -rollingUpgrade <query|prepare|finalize>
执行一个滚动升级操作
选项 | 说明 |
---|---|
query | 查询当前滚动升级状态 |
prepare | 准备一个新的滚动升级 |
finalize | 结束当前滚动升级 |
dfsadmin -getDatanodeInfo
hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>
获取指定datanode的信息, 这个命令就像unix的ping命令,可以检查一个datanode是否还活着
dfsadmin -shutdownDatanode
hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> [upgrade]
提交一个关闭请求到指定的datanode. 如果upgrade选项指定了, 访问这个datanode的客户端都会被指示要等这个datanode重启, 同时快速启动模式也要被激活. 当重启不够及时, 客户端就超市,并忽略这个datanode. 在这种情况下, 快速启动模式就被关闭.
请注意, 这个命令并不会等到datanode完全关闭. "hdfs dfsadmin -getDatanodeInfo"命令可以检查datanode是否被完成了关闭.
Namenode 启动选项
namenode -rollingUpgrade
hdfs namenode -rollingUpgrade <rollback|started>
当一个滚动升级在进行中, -rollingUpgrade 启动选项可以指定不同滚动升级行为
选项 | 说明 |
---|---|
rollback | 恢复namenode回到升级前的版本,同时回滚用户数据到升级前状态 |
started | 指定已启动一个滚动升级, namenode启动时可以允许镜像目录哟不同的layout版本 |