![Hadoop HDFS 备份和灾难恢复策略](https://linux22.com/image/616286/Hadoop%20HDFS%20%E5%A4%87%E4%BB%BD%E5%92%8C%E7%81%BE%E9%9A%BE%E6%81%A2%E5%A4%8D%E7%AD%96%E7%95%A5.png)
我们正在准备实施我们的第一个 Hadoop 集群。因此,我们从四节点设置开始。(1 个主节点和 3 个工作节点)每个节点将有 6TB 的存储空间。(6 x 1TB 磁盘)我们采用了 SuperMicro 4 节点机箱,这样所有四个节点共享一个 4U 机箱。
我们现在正在研究如何备份此解决方案以进行灾难恢复。(考虑机架或站点丢失,而不是驱动器丢失)最好的解决方案似乎是集群到集群的复制。虽然我也读过关于人们复制 NAS 或 SMB 共享数据的文章。此外,我们将通过传统备份方式备份主节点。我只关心 HDFS 数据。以下是我的问题:
1)对于集群到集群的复制,我可以设置一个具有大量存储空间的单节点集群作为我的异地副本吗?我不关心它的性能,只关心它的存在和保存整个数据集的能力。(恢复时间不是问题,因为这个集群不是关键任务)是否可以安排复制,以便它每天只运行一次,等等?
2)对于 SMB 或 NAS 选项,它是如何工作的?目标磁盘是否需要格式化为 HDFS?我是否需要完整备份三个工作节点?或者是否有一些智能脚本可以备份没有奇偶校验的数据集?我对这个解决方案不太熟悉,只在网上看到过对它的引用。我在查找资源或信息方面运气不佳。
我也愿意接受任何其他适用于 Hadoop HDFS 的 DR 选项。我们的目标是获取 HDFS 数据集的完整副本,以便我们可以使用它来从机架或站点丢失中恢复。
谢谢!
答案1
对于选项 1,你可以使用分布式连接协议从一个集群复制到另一个集群。备份集群当然可以是单节点服务器,只要它上面运行着 namenode 和 datanode 即可。基本上,你正在查看运行在伪分布模式. 要定期运行 distcp,
为了定期执行此操作,我将创建一个 shell 脚本,执行如下操作:
- 检查锁文件
- 如果锁文件存在,则退出(如果锁文件存在的时间太长,则可以选择向您发送警报 - 这表明之前的 distcp 退出不正确且未解锁,或者之前的 distcp 花费的时间比您预期的要长)。
- 如果不存在,则触摸锁文件。
- 运行 distcp。
- 检查 distcp 作业的状态以验证其是否正确完成。
- 开锁。
我建议使用锁文件,因为你不想运行多个 distcp在这个特定的设置中。最终,您将无法控制伪分布式集群。我还会在伪分布式集群配置中将默认复制因子设置为 1。如果不需要,则无需将块加倍(不过,我不记得伪集群是否默认这样做;YMMV)。
distcp 可以像愚蠢的 rsync 一样工作,仅复制那些发生变化的内容。
对于选项 2,您可以使用 hadoop fs -copyToLocal。这样做的缺点是每次都是完全复制,因此如果您复制 /,则每次运行时都会复制所有内容。
对于 hadoop 元数据,您需要复制 fsimage 和 edits 文件。 本博客有相当合理的概述。它适用于使用 Cloudera,但对于任何 Hadoop 1.0 或 2.0 集群来说应该基本相同。
答案2
Hdfs 在设计上是复制的,通常至少在 3 个节点上,因此如果您有 3 个节点,则数据已经在这 3 个节点上复制。
当然,这些节点应该位于不同的物理服务器上。这样就不太可能发生故障,或者所有 3 个节点应该同时发生故障。
要复制当前的 hdfs,您只需将节点添加到其他服务器上的 hdfs 服务,数据就会复制。要确保数据复制的节点超过 3 个原始节点,请将容错设置增加到 4 个或更多节点。关闭单个单元上的其他节点,您的数据将保留在所有处于活动状态的节点上。