使用the Quorum Journal Manager实现HDFS高可用

2017/1/22 11:57:22

原文

目的(Purpose)

  1. * 这个指南提供了对HDFS-HA特性,使用QJM特性如何去配置和管理一个HA集群的概述。

Note

  1. * 通过QJMActiveStandby NameNodes之间共享edit logs

背景(Background)

  1. * Hadoop 2.0.0之前(Prior), NameNode在一个HDFS集群中是存在单点故障(SPOF)。每个集群有一个NameNode,如果这个机器或进程不可用,整个集群将不可用,直到此NameNode被重启,或在另一个单独的机器上新生成。
  2. * 在两个主要方面影响HDFS集群的总可用性
  3. * 没计划的事件,如一个机器crash, 这个集群将不可用,直到操作员重启NameNode
  4. * 计划维护的事件,如在NameNode的机器上软件或硬件升级将会导致集群的窗口停机时间。
  5. * HA特性旨在以上问题,通过 在具有热备份的主动/被动配置中 提供 在同一个集群中 运行两个冗余的NameNodes选项 解决上述问题

架构(Architecture)

  1. * 在一个典型的HA集群中,两个单独的机器被配置做为NameNodes。在任何时间点,这些NameNodes中的确切的一个是Active状态,另一个是Standby状态。这个Active NameNode负责集群中所有客户操作请求,然而Standby简单的扮演做为一个slave,保持足够的状态,在必须时提供快速的故障转移。
  2. * 为了Standby 节点和Active节点保持状态同步,两个节点通过一组被称为“JournalNodes”(JNs)独立守护进程交流。当任何namespace修改被Active 节点执行时,它持久地将修改的记录记录到这些JNs中的大多数中。Standby节点能从JNs中读取edits log,并且不断地观察他们对edit log的更改。当Standby节点看到这些改变的edits,它将应用它们到自己的namespace. 在故障转移时,Standby提升自己到Active状态之前,它将会确保它已经从JNs读取所有的edits. 这确保namespace状态在故障转移发生之前是完全同步的。
  3. * 为了提供快速地故障转移,Standby节点具有集群中块位置的最新信息是必须的。为了实现这些,所有DataNodes被配置有两个NameNode的位置,并向两者发送块位置信息和心跳。
  4. * 对于HA集群的正确操作,每次只有一个NameNodesActive状态是至关重要的。否则,namespace状态将会快速地在两者之间发散(diverge),数据丢失危险和别的不正确的结果。为了确保这种性质和防止被称为“split-brain scenario”(脑裂),JNs只允许在一个时间只有一个NameNode称为一个writer. 在故障转移期间,将要变成Active状态的NameNode将简单地接管向JNs写的角色,这将有效防止别的处在Active状态的NameNodes继续写,允许新的Active状态的NameNode去安全地处理故障转移。

硬件资源(Hardware resources)

  1. * 为了部署一个HA集群,你应该准备以下:
  2. * NameNode machines - 运行ActiveStandby NameNodes的机器,应该有相同的硬件,
  3. * JournalNode machines - 运行JournalNodes的机器。JournalNode 守护进程(daemon)是相对轻量级的,因此它们可以合理地并置在具有其他Hadoop守护进程的机器上,如NameNode,JobTracker, YARN ResourceManager.
  4. Note: 必须至少3JournalNode daemons,因为edit log 修改必须被写到大多数JNs上。这将允许系统容忍一台机器故障,你也可以运行超过3JournalNodes,但是为了实际增加系统可以容忍的故障数,你应该运行奇数个JNs,(i.e. 3, 5, 7, etc).
  5. 当运行NJournalNodes,系统能容忍最多(N-1)/2 个故障并能继续正常工作。
  6. * 在一个HA集群中,Standby NameNode 也扮演checkpoints of the namespace state, 因此在HA集群中运行一个Secondary NameNode, CheckpointNode,BackupNode不是必须的. 事实上,这样做将会是一个错误。这还允许重新配置一个非启用HAHDFS集群到启用HA的人员去重用他们先前专用于Secondary NameNode的硬件

部署(Deployment)

  1. * 配置概述
  2. * 与联合配置类似,HA配置向后兼容,允许现有的单个NameNode配置工作而不更改。新配置被设计为使得集群中的所有节点可以具有相同的配置,而不需要基于节点的类型将不同的配置文件部署到不同的机器。
  3. * HDFS联合一样,HA群集使用名称服务IDnameservice ID)来标识可能实际上由多个HA NameNode组成的单个HDFS实例.此外,一个称为NameNode ID的新抽象与HA一起添加.集群中的每个不同NameNode具有不同的NameNode ID以区分它。为了支持所有NameNode的单个配置文件,相关的配置参数后面加上nameservice IDNameNode ID
  4. * 配置详情
  5. * hdfs-site.xml
  6. * 要配置HA NameNode,必须向hdfs-site.xml配置文件中添加多个配置选项。
  7. * 设置这些配置的顺序并不重要,但是为dfs.nameservicesdfs.ha.namenodes [nameservice ID]选择的值将确定后面的那些键。因此,在设置其余配置选项之前,应决定这些值
  8. * dfs.nameservices - nameservice的逻辑名
  9. * 为此名称服务选择一个逻辑名称,例如“mycluster”,并将此逻辑名称用于此配置选项的值。你选择的名字是任意的。它将用于配置和作为集群中绝对HDFS路径的权限组件。
  10. Note:如果您还使用HDFS Federation,此配置设置还应包括其他名称服务(HA或其他)的列表,以逗号分隔列表。
  11. <property>
  12. <name>dfs.nameservices</name>
  13. <value>mycluster</value>
  14. </property>
  15. * dfs.ha.namenodes.[nameservice ID] - 唯一标识在nameservice中的每个NameNode
  16. * 使用逗号分隔的NameNode ID列表进行配置。 DataNodes将使用它来确定集群中的所有NameNode
  17. * 例如,如果以前使用“mycluster”作为名称服务ID,并且您希望使用“nn1”和“nn2”作为NameNode的各个ID,您可以这样配置:
  18. <property>
  19. <name>dfs.ha.namenodes.mycluster</name>
  20. <value>nn1,nn2</value>
  21. </property>
  22. Note:目前,每个nameservice最多只能配置两个NameNode
  23. * dfs.namenode.rpc-address.[nameservice ID].[name node ID] - 每个NameNode的完全限定RPC监听地址
  24. * 对于之前配置的NameNode ID,设置NameNode进程的完整地址和IPC端口。请注意,这将产生两个单独的配置选项。例如:
  25. <property>
  26. <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  27. <value>machine1.example.com:8020</value>
  28. </property>
  29. <property>
  30. <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  31. <value>machine2.example.com:8020</value>
  32. </property>
  33. Note:如果您愿意,您可以类似地配置“servicerpc-address”设置。
  34. * dfs.namenode.http-address.[nameservice ID].[name node ID] - 每个NameNode的完全限定HTTP监听地址
  35. * 与上面的rpc-address类似,设置NameNodeHTTP服务器的地址以进行侦听。例如:
  36. <property>
  37. <name>dfs.namenode.http-address.mycluster.nn1</name>
  38. <value>machine1.example.com:50070</value>
  39. </property>
  40. <property>
  41. <name>dfs.namenode.http-address.mycluster.nn2</name>
  42. <value>machine2.example.com:50070</value>
  43. </property>
  44. Note:如果您启用了Hadoop的安全功能,您还应该为每个NameNode设置类似的https地址。
  45. * dfs.namenode.shared.edits.dir - 标识NameNode将要读写editsJNs组的URI
  46. * 这是配置提供共享编辑存储的JournalNode的地址的地方,由Active NameNode写入并由Standby NameNode读取以保持最新与Active NameNode做出的所有文件系统更改。
  47. * 虽然必须指定多个JournalNode地址,但您只应配置其中一个URI URI的格式应为:“qjournal// host1:port1; host2:port2; host3:port3 / journalId”。Journal ID是此名称服务的唯一标识符,它允许单个集合的JournalNode为多个 Federated namesystems 提供存储. 尽管不是必需的,但是对于Journal ID 重用nameservice ID是个好主意。
  48. * 例如,如果此群集的JournalNode在计算机“node1.example.com”,“node2.example.com”和“node3.example.com”上运行,并且名称服务ID为“mycluster”,则可以使用以下作为此设置的值(JournalNode的默认端口为8485):
  49. <property>
  50. <name>dfs.namenode.shared.edits.dir</name>
  51. <value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value>
  52. </property>
  53. * dfs.client.failover.proxy.provider.[nameservice ID] - HDFS客户端用来去和Active NameNode联系的JAVA Class
  54. * 配置将由DFS客户端使用的Java类的名称,以确定哪个NameNode是当前活动的,以及因此哪个NameNode当前为客户端请求提供服务。
  55. * 目前Hadoop附带的唯一实现是ConfiguredFailoverProxyProvider,所以使用它,除非你使用自定义。例如:
  56. <property>
  57. <name>dfs.client.failover.proxy.provider.mycluster</name>
  58. <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  59. </property>
  60. * dfs.ha.fencing.methods - 将用于在故障转移期间屏蔽Active NameNode的脚本或Java类的列表
  61. * 期望系统的正确性,在任何给定时间只有一个NameNode处于活动状态
  62. * 重要的是,当使用Quorum Journal Manager时,只有一个NameNode允许写入JournalNode,因此没有可能破坏来自裂脑情景的文件系统元数据。
  63. * 但是,当发生故障转移时,以前的Active NameNode仍然可能为客户端提供读取请求,这可能已过期,直到该NameNode在尝试写入JournalNode时关闭。
  64. * 因此,仍然需要配置一些防护方法,即使在使用Quorum Journal Manager时也是如此。
  65. * 但是,为了在防护机制发生故障的情况下提高系统的可用性,建议配置可确保作为列表中最后一个防护方法返回成功的防护方法。
  66. * 请注意,如果选择不使用实际的防护方法,您仍然必须为此设置配置一些内容,例如“shell(/ bin / true)”。
  67. * 在故障转移过程中使用的防护方法被配置为一个回车符分隔的列表,将在顺序尝试,直到一个表明防护成功。
  68. * Hadoop提供了两种方法:shellsshfence
  69. * 有关实现自己的自定义防护方法的信息,请参阅org.apache.hadoop.ha.NodeFencer
  70. * sshfence - SSH Active NameNode 杀掉此进程
  71. * sshfence选项SSH到目标节点,并使用fuser来终止监听服务的TCP端口的进程。
  72. * 为了使此防护选项可以工作,它必须能够SSH到目标节点,而不提供密码短语。
  73. * 因此,还必须配置dfs.ha.fencing.ssh.private-key-files选项,这是一个用逗号分隔的SSH私钥文件列表。例如:
  74. <property>
  75. <name>dfs.ha.fencing.methods</name>
  76. <value>sshfence</value>
  77. </property>
  78. <property>
  79. <name>dfs.ha.fencing.ssh.private-key-files</name>
  80. <value>/home/exampleuser/.ssh/id_rsa</value>
  81. </property>
  82. * 可选地,可以配置非标准用户名或端口以执行SSH
  83. * 还可以为SSH配置超时(以毫秒为单位),之后此防护方法将被视为失败。它可以这样配置:
  84. <property>
  85. <name>dfs.ha.fencing.methods</name>
  86. <value>sshfence([[username][:port]])</value>
  87. </property>
  88. <property>
  89. <name>dfs.ha.fencing.ssh.connect-timeout</name>
  90. <value>30000</value>
  91. </property>
  92. * shell - 运行一个任意的shell命令来防护 Active NameNode
  93. * shell防护方法运行任意shell命令。它可以这样配置:
  94. <property>
  95. <name>dfs.ha.fencing.methods</name>
  96. <value>shell(/path/to/my/script.sh arg1 arg2 ...)</value>
  97. </property>
  98. * '('')'之间的字符串直接传递给bash shell,不能包含任何括号。
  99. * shell命令将使用设置为包含所有当前Hadoop配置变量的环境运行,其中“_”字符替换在配置键中的任何“.”字符。
  100. * 所使用的配置已经将任何特定于namenode的配置提升为其通用形式
  101. * 例如dfs_namenode_rpc-address将包含目标节点的RPC地址,即使配置可能将该变量指定为dfs.namenode.rpc-address.ns1.nn1
  102. * 此外,还可以使用以下指向要保护的目标节点的变量:
  103. $target_host: hostname of the node to be fenced
  104. $target_port: IPC port of the node to be fenced
  105. $target_address: the above two, combined as host:port
  106. $target_nameserviceid: the nameservice ID of the NN to be fenced
  107. $target_namenodeid: the namenode ID of the NN to be fenced
  108. * 这些环境变量也可以用作shell命令本身的替换。例如:
  109. <property>
  110. <name>dfs.ha.fencing.methods</name>
  111. <value>shell(/path/to/my/script.sh --nameservice=$target_nameserviceid $target_host:$target_port)</value>
  112. </property>
  113. * 如果shell命令返回退出代码0,则确定防护成功。如果它返回任何其他退出代码,防护不成功,将尝试列表中的下一个防护方法。
  114. Note:此防护方法不实现任何超时。如果超时是必要的,它们应该在shell脚本本身中实现(例如通过派生子shell在几秒钟内杀死它的父进程)。
  115. * dfs.journalnode.edits.dir - JournalNode守护进程将存储其本地状态的路径
  116. * 这是JournalNode计算机上的绝对路径,将存储JN使用的编辑和其他本地状态。
  117. * 您只能对此配置使用单个路径。
  118. * 此数据的冗余通过运行多个单独的JournalNode或通过在本地连接的RAID阵列上配置此目录来提供。例如:
  119. <property>
  120. <name>dfs.journalnode.edits.dir</name>
  121. <value>/path/to/journal/node/local/data</value>
  122. </property>
  123. * core-site.xml (可选的)
  124. * fs.defaultFS - 当没有给出时,Hadoop FS客户端使用的默认路径前缀
  125. * 可选的配置项,您现在可以配置Hadoop客户端的默认路径以使用新的HA启用的逻辑URI
  126. * 如果您之前使用“mycluster”作为名称服务ID,则这将是所有HDFS路径的权限部分的值。
  127. * 这可能是这样配置的,在您的core-site.xml文件中:
  128. <property>
  129. <name>fs.defaultFS</name>
  130. <value>hdfs://mycluster</value>
  131. </property>
  132. * 部署详情
  133. * 在设置了所有必需的配置选项后,必须在将要运行它们的计算机集上启动JournalNode守护程序。
  134. * 这可以通过运行命令“hdfs-daemon.sh journalnode”并等待守护程序在每个相关机器上启动来完成。
  135. * 一旦启动了JournalNode,必须首先同步两个HA NameNode的磁盘元数据。
  136. * 如果要设置一个新的HDFS集群,您应该首先在一个NameNode上运行format命令(hdfs namenode -format)。
  137. * 如果您已经格式化了NameNode,或者正在将非HA启用的集群转换为启用HA,那么现在应该通过在未被格式化的NameNode上运行命令“hdfs namenode -bootstrapStandby" 复制元数据目录的内容到别的,未被格式化的NameNode上。
  138. * 运行此命令还将确保JournalNode(由dfs.namenode.shared.edits.dir配置)包含足够的编辑事务,以便能够启动两个NameNode。
  139. * 如果要将非HA NameNode转换为HA,则应运行命令“hdfs -initializeSharedEdits”,该命令将使用来自本地NameNode edits目录的edits数据初始化JournalNodes。
  140. * 此时,您可以像启动一个NameNode一样启动两个HA NameNode。
  141. * 您可以通过浏览其配置的HTTP地址单独访问每个NameNodes的网页。
  142. * 您应该注意到,配置的地址旁边将是NameNode的HA状态(“备用”或“活动”。)每当HA NameNode启动时,它最初处于备用状态。
  143. * 管理命令
  144. * 现在您的HA NameNode已配置并启动,您将可以访问一些其他命令来管理HA HDFS集群。
  145. * 具体来说,您应该熟悉“hdfs haadmin”命令的所有子命令。
  146. * 运行此命令而没有任何其他参数将显示以下使用信息:
  147. Usage: DFSHAAdmin [-ns <nameserviceId>]
  148. [-transitionToActive <serviceId>]
  149. [-transitionToStandby <serviceId>]
  150. [-failover [--forcefence] [--forceactive] <serviceId> <serviceId>]
  151. [-getServiceState <serviceId>]
  152. [-checkHealth <serviceId>]
  153. [-help <command>]
  154. * 本指南介绍了每个子命令的高级用法。有关每个子命令的具体使用信息,应运行“hdfs haadmin -help <command>”。
  155. * transitionToActive and transitionToStandby - 将给定NameNode的状态转换为Active或Standby.
  156. * 这些子命令分别使给定的NameNode转换到活动或待机状态。
  157. * 这些命令不尝试执行任何防护,因此很少使用。
  158. * 相反,人们应该总是喜欢使用“hdfs haadmin -failover”子命令。
  159. * failover - 启动两个NameNode之间的故障转移
  160. * 此子命令导致从第一个提供的NameNode到第二个提供的NameNode的故障转移。
  161. * 如果第一个NameNode处于待机状态,则该命令简单地将第二个转换为活动状态而没有错误。
  162. * 如果第一个NameNode处于活动状态,将尝试正常地将其转换到备用状态。
  163. * 如果失败,将依次尝试防护方法(由dfs.ha.fencing.methods配置),直到成功。
  164. * 只有在此过程之后,第二个NameNode才会转换为活动状态。
  165. * 如果没有成功的防护方法,则第二个NameNode将不会转换为活动状态,并返回错误。
  166. * getServiceState - 确定给定的NameNode是活动还是备用
  167. * 连接到提供的NameNode以确定其当前状态,适当地打印“待机”或“活动”到STDOUT。
  168. * 此子命令可能由cron作业或监视脚本使用,这些脚本需要根据NameNode当前是活动还是待机来进行不同的操作。
  169. * checkHealth - 检查给定NameNode的运行状况
  170. * 连接到提供的NameNode以检查其健康状况。
  171. * NameNode能够对自身执行一些诊断,包括检查内部服务是否按预期运行。
  172. * 如果NameNode健康,此命令将返回0,否则为非零。可以使用此命令进行监视。
  173. Note:这还没有实现,并且目前将始终返回成功,除非给定的NameNode完全关闭。

自动故障转移(Automatic Failover)

  1. * Introduction
  2. * 上述部分介绍如何配置手动故障转移。
  3. * 在该模式下,即使活动节点发生故障,系统也不会自动触发从活动节点到备用节点的故障转移。
  4. * 本节介绍如何配置和部署自动故障转移。
  5. * Components
  6. * 自动故障转移为HDFS部署添加了两个新组件:ZooKeeper quorum(仲裁)和ZKFailoverController进程(缩写为ZKFC)。
  7. * Apache ZooKeeper是一种高可用性的服务,用于维护少量协调数据,通知客户端数据中的更改,以及监控客户端的故障。
  8. * 自动HDFS故障转移的实现依赖于ZooKeeper,用于以下事情:
  9. * Failure detection(故障检测)
  10. * 集群中的每个NameNode机器都在ZooKeeper中维护一个持久会话。
  11. * 如果机器崩溃,ZooKeeper会话将过期,通知其他NameNode应该触发故障转移。
  12. * Active NameNode electionActive NameNode 选举)
  13. * ZooKeeper提供了一种简单的机制来将节点专门选为活动节点。
  14. * 如果当前活动的NameNode崩溃,另一个节点可能在ZooKeeper中采用特殊的排它锁,表明它应该成为下一个活动。
  15. * ZKFailoverControllerZKFC)是一个新的组件,它是一个ZooKeeper客户端,也监视和管理NameNode的状态。
  16. * 每个运行NameNode的机器都运行一个ZKFCZKFC负责:
  17. * Health monitoring
  18. * ZKFC使用health-check命令周期性地ping它的本地NameNode
  19. * 只要NameNode及时响应,健康状态,ZKFC认为节点健康。
  20. * 如果节点崩溃,冻结或以其他方式进入不正常状态,则健康状况监视器将其标记为不健康。
  21. * ZooKeeper session management
  22. * 当本地NameNode健康时,ZKFCZooKeeper中保持一个打开的会话。
  23. * 如果本地NameNode是活动的,它还拥有一个特殊的“锁”znode
  24. * 这个锁使用ZooKeeper的支持“临时”节点;如果会话过期,则锁节点将被自动删除。
  25. * ZooKeeper-based election(基于ZooKeeper的选举)
  26. * 如果本地NameNode是健康的,并且ZKFC看到没有其他节点当前持有锁znode,它本身将尝试获取锁。
  27. * 如果它成功,则它“赢得选举”,并且负责运行故障转移以使其本地NameNode变为Active
  28. * 故障转移过程类似于上述的手动故障转移:首先,如果必要,先前的活动被防护,然后本地NameNode转换到Active状态。
  29. * 有关自动故障切换设计的更多详细信息,请参阅Apache HDFS JIRA上的HDFS-2185附带的设计文档。
  30. * Deploying ZooKeeper
  31. * 在典型的部署中,ZooKeeper守护程序配置为在三个或五个节点上运行。
  32. * 由于ZooKeeper本身具有轻量资源要求,因此可以在与HDFS NameNodeStandby Node相同的硬件上并置ZooKeeper节点。
  33. * 许多运营商选择在与YARN ResourceManager相同的节点上部署第三个ZooKeeper进程。
  34. * 建议将ZooKeeper节点配置为将其数据存储在HDFS元数据的不同磁盘驱动器上,以实现最佳性能和隔离。
  35. * ZooKeeper的设置超出了本文档的范围。我们假设您已经设置了一个在三个或更多节点上运行的ZooKeeper集群,
  36. * 并通过使用ZK CLI连接来验证其正确的操作。
  37. * Before you Begin
  38. * 在开始配置自动故障转移之前,应该关闭集群。
  39. * 当集群运行时,当前不可能从手动故障转移设置转换为自动故障转移设置。
  40. * Configuring automatic failover
  41. * 自动故障转移的配置需要为您的配置添加两个新参数。在您的hdfs-site.xml文件中,添加:
  42. <property>
  43. <name>dfs.ha.automatic-failover.enabled</name>
  44. <value>true</value>
  45. </property>
  46. * 这指定应为集群设置自动故障转移。在您的core-site.xml文件中,添加:
  47. <property>
  48. <name>ha.zookeeper.quorum</name>
  49. <value>zk1.example.com:2181,zk2.example.com:2181,zk3.example.com:2181</value>
  50. </property>
  51. * 这列出了运行ZooKeeper服务的主机端口对。
  52. * 与文档中先前描述的参数一样,可以通过用名称服务ID后缀配置键来在每个名称服务的基础上配置这些设置.
  53. * 例如,在启用了联合的集群中,可以通过设置dfs.ha.automatic-failover.enabled.my-nameservice-id来为仅一个名称服务器显式启用自动故障切换。
  54. * 还有几个其他配置参数可以设置为控制自动故障转移的行为;然而,它们对于大多数安装不是必需的。
  55. * 有关详细信息,请参阅配置键特定文档
  56. * Initializing HA state in ZooKeeper
  57. * 添加配置键后,下一步是在ZooKeeper中初始化所需的状态。您可以通过从一个NameNode主机运行以下命令来执行此操作。
  58. $ hdfs zkfc -formatZK
  59. * 这将在ZooKeeper中创建一个znode,其中自动故障转移系统存储其数据。
  60. * Starting the cluster with start-dfs.sh
  61. * 由于在配置中启用了自动故障转移,start-dfs.sh脚本现在将在运行NameNode的任何计算机上自动启动ZKFC守护程序。
  62. * ZKFC启动时,它们将自动选择一个NameNode成为Active
  63. * Starting the cluster manually
  64. * 如果手动管理集群上的服务,则需要在运行NameNode的每台计算机上手动启动zkfc后台驻留程序。
  65. * 您可以通过运行以下命令来启动守护程序:
  66. $ hadoop-daemon.sh start zkfc
  67. * Securing access to ZooKeeper
  68. * 如果您正在运行安全集群,您可能想要确保存储在ZooKeeper中的信息也是安全的。
  69. * 这防止恶意客户端修改ZooKeeper中的元数据或潜在地触发错误的故障转移。
  70. * 为了保护ZooKeeper中的信息,首先将以下内容添加到您的core-site.xml文件中:
  71. <property>
  72. <name>ha.zookeeper.auth</name>
  73. <value>@/path/to/zk-auth.txt</value>
  74. </property>
  75. <property>
  76. <name>ha.zookeeper.acl</name>
  77. <value>@/path/to/zk-acl.txt</value>
  78. </property>
  79. * 请注意这些值中的“@”字符 - 这指定配置不是内联的,而是指向磁盘上的文件。
  80. * 第一个配置的文件指定ZooKeeper身份验证的列表,格式与ZK CLI所使用的格式相同。
  81. * 例如,您可以指定以下内容: digest:hdfs-zkfcs:mypassword
  82. * 其中hdfs-zkfcsZooKeeper的唯一用户名,mypassword是一个用作密码的唯一字符串。
  83. * 接下来,使用以下命令生成与此身份验证对应的ZooKeeper ACL
  84. * $ java -cp $ZK_HOME/lib/*:$ZK_HOME/zookeeper-3.4.2.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider hdfs-zkfcs:mypassword
  85. output: hdfs-zkfcs:mypassword->hdfs-zkfcs:P/OQvnYyU/nF/mGYvB/xurX8dYs=
  86. * 将此输出的“ - >”字符串部分复制并粘贴到文件zk-acls.txt中,前缀为字符串“digest:”。例如:
  87. digest:hdfs-zkfcs:vlUvLnd8MlacsE80rDuu6ONESbM=:rwcda
  88. * 为了使这些ACL生效,您应该如上所述重新运行zkfc -formatZK命令。
  89. * 执行此操作后,您可以从ZK CLI验证ACL,如下所示:
  90. [zk: localhost:2181(CONNECTED) 1] getAcl /hadoop-ha
  91. 'digest,'hdfs-zkfcs:vlUvLnd8MlacsE80rDuu6ONESbM=
  92. : cdrwa
  93. * Verifying automatic failover
  94. * 一旦设置了自动故障切换,您应该测试其操作
  95. * 为此,首先查找活动的NameNode。
  96. * 您可以通过访问NameNode Web界面来确定哪个节点处于活动状态 - 每个节点都会在页面顶部报告其HA状态。
  97. * 找到活动的NameNode后,尝试导致该节点出现故障。
  98. * 例如,可以使用kill -9 <pid of NN>来模拟JVM崩溃。
  99. * 或者,您可以重新启动机器或拔掉其网络接口以模拟不同类型的中断。
  100. * 在触发您希望测试的中断之后,其他NameNode应在几秒钟内自动变成Active。
  101. * 检测故障和触发故障切换所需的时间取决于ha.zookeeper.session-timeout.ms的配置,但默认为5秒。
  102. * 如果测试不成功,您可能配置不正确。
  103. * 检查zkfc守护程序以及NameNode守护程序的日志,以便进一步诊断问题。

自动故障转移FAQ

  1. Q:我以任何特定的顺序启动ZKFCNameNode守护进程,重要吗?
  2. A:No,在任何给定的节点上,您可以在相应的NameNode之前或之后启动ZKFC
  3. Q:我应该进行什么额外的监控?
  4. A: * 您应该在运行NameNode的每个主机上添加监视,以确保ZKFC保持运行。
  5. * 在某些类型的ZooKeeper故障中,例如,ZKFC可能意外退出,
  6. * 并应重新启动以确保系统准备好进行自动故障转移。
  7. * 此外,您应该监视ZooKeeper仲裁中的每个服务器。
  8. * 如果ZooKeeper崩溃,则自动故障切换将不起作用。
  9. Q:如果ZooKeeper关闭会发生什么?
  10. A: * 如果ZooKeeper群集崩溃,则不会触发自动故障转移。
  11. * 但是,HDFS将继续运行而没有任何影响。
  12. * ZooKeeper重新启动时,HDFS将重新连接没有问题。
  13. Q:我可以将我的一个NameNode指定为主要/首选吗?
  14. A: * No,目前不支持。
  15. * 无论哪个NameNode首先启动都将变为活动状态。
  16. * 您可以选择以特定顺序启动集群,以便首选节点首先启动。
  17. Q:当配置自动故障转移时,如何启动手动故障转移?
  18. A: * 即使配置了自动故障转移,也可以使用相同的hdfs haadmin命令启动手动故障转移。
  19. * 它将执行协调故障转移。

HDFS升级/完成/回滚,带有启用HA的(HDFS Upgrade/Finalization/Rollback with HA Enabled)

  1. * 当在HDFS的版本之间移动时,有时可以简单地安装较新的软件并重新启动集群。
  2. * 然而,有时,升级您正在运行的HDFS版本可能需要更改磁盘数据。
  3. * 在这种情况下,必须在安装新软件后使用HDFS升级/完成/回滚工具。
  4. * HA环境中,这个过程变得更加复杂,因为NN依赖的磁盘元数据是定义分布式的,
  5. * 在该对的两个HA NN上,以及在使用QJM的情况下的JournalNode共享编辑存储。
  6. * 本文档部分介绍在HA设置中使用HDFS升级/完成/回滚功能的过程。
  7. To perform an HA upgrade 操作员必须执行以下操作:
  8. 1.正常关闭所有NN,并安装较新的软件。
  9. 2.启动所有JN。请注意,执行升级,回滚或最终化操作时,所有JN都必须正在运行。如果任何JN在运行任何这些操作时都关闭,操作将失败。
  10. 3.使用'-upgrade'标志启动其中一个NN
  11. 4.开始时,此NN不会像通常在HA设置中那样进入备用状态。相反,该NN将立即进入活动状态,执行其本地存储盘的升级,并且还执行共享编辑日志的升级。
  12. 5.在这一点上,HA对中的另一NN将与升级的NN不同步。为了使其恢复同步并且再次具有高可用性设置,您应该通过使用'-bootstrapStandby'标志运行NN来重新引导此NameNode。使用'-upgrade'标志启动第二个NN是一个错误。
  13. Note: 如果在任何时候想要在完成或回滚升级之前重新启动NameNodes,则应该正常启动NN,即没有任何特殊的启动标志。
  14. To finalize an HA upgrade
  15. * 操作员将使用`hdfs dfsadmin -finalizeUpgrade'命令,而NN正在运行并且其中之一处于活动状态。
  16. * 在发生此时的Active NN将执行共享日志的最终化,并且其本地存储目录包含先前FS状态的NN将删除其本地状态。
  17. To perform a rollback of an upgrade
  18. * 两个NN应首先关闭
  19. * 操作员应在NN上运行回滚命令,在那里它们发起升级过程,这将在本地dirs上以及在共享日志(NFS或JN上)上执行回滚。
  20. * 之后,应该启动此NN,并且操作员应在其他NN上运行`-bootstrapStandby',以使两个NN与此回滚的文件系统状态同步。

[原创]Hadoop-2.5.2-HA原文译的更多相关文章

  1. Hadoop 2.2.0 HA构造

    在这篇文章中<Ubuntu和CentOS分布式配置Hadoop-2.2.0>介绍hadoop 2.2.0最主要的配置.hadoop 2.2.0中提供了HA的功能,本文在前文的基础上介绍ha ...

  2. 攻城狮在路上(陆)-- hadoop分布式环境搭建(HA模式)

    一.环境说明: 操作系统:Centos6.5 Linux node1 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 ...

  3. 菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章

    菜鸟玩云计算之十九:Hadoop 2.5.0 HA 集群安装第2章 cheungmine, 2014-10-26 在上一章中,我们准备好了计算机和软件.本章开始部署hadoop 高可用集群. 2 部署 ...

  4. 菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章

    菜鸟玩云计算之十八:Hadoop 2.5.0 HA 集群安装第1章 cheungmine, 2014-10-25 0 引言 在生产环境上安装Hadoop高可用集群一直是一个需要极度耐心和体力的细致工作 ...

  5. Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    目录 目录 1.前言 1.1.什么是 Hadoop? 1.1.1.什么是 YARN? 1.2.什么是 Zookeeper? 1.3.什么是 Hbase? 1.4.什么是 Hive 1.5.什么是 Sp ...

  6. Hadoop集群搭建-HA高可用(手动切换模式)(四)

    步骤和集群规划 1)保存完全分布式模式配置 2)在full配置的基础上修改为高可用HA 3)第一次启动HA 4)常规启动HA 5)运行wordcount 集群规划: centos虚拟机:node-00 ...

  7. 一脸懵逼学习Hadoop分布式集群HA模式部署(七台机器跑集群)

    1)集群规划:主机名        IP      安装的软件                     运行的进程master    192.168.199.130   jdk.hadoop      ...

  8. 【原创 Hadoop&Spark 动手实践 12】Spark MLLib 基础、应用与信用卡欺诈检测系统动手实践

    [原创 Hadoop&Spark 动手实践 12]Spark MLLib 基础.应用与信用卡欺诈检测系统动手实践

  9. 【原创 Hadoop&Spark 动手实践 13】Spark综合案例:简易电影推荐系统

    [原创 Hadoop&Spark 动手实践 13]Spark综合案例:简易电影推荐系统

随机推荐

  1. html中DIv并排显示问题

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  2. Codeforces #377 Div2

    打得还不错的一场CF,题目质量也很高,今后还要继续努力 A题: 题意:给定一个数k,让其乘一个最小的数,使乘得以后的数要不被10整除,要不减去r以后被10整除,求这个最小的数 #include < ...

  3. org.springside.modules.orm中的page类自我解读

    // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...

  4. Part of Speech Tagging

    Natural Language Processing with Python Charpter 6.1 suffix_fdist处代码稍微改动. import nltk from nltk.corp ...

  5. 解决phpcms V9缩略图模糊的方法

    解决V9缩略图模糊/libs/classes/image.class.php注释掉else   imagecopyresized($thumbimg, $srcimg, 0, 0, $psrc_x,  ...

  6. laravel5 数据库连接问题

    [PDOException] SQLSTATE[28000] [1045] Access denied for user ‘homestead’@’localhost’ (using password ...

  7. iOS第三方常用类库

    1.AFNetworking AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交换, 操作简单, 功能强大, 现在许多人 ...

  8. HUST 1601 Shepherd

    间隔小的时候dp预处理,大的时候暴力..正确做法不会... dp[i][j]表示以i为开头,间隔为j的和,递推:dp[i][j] = dp[i + j][j] + a[i] 测试数据中间隔可能是0.. ...

  9. FastJson的用法

    一.简单数据的序列化 pubic class UserInfo implements Serializable{ private String name; private int age; publi ...

  10. linux java.net.UnknownHostException异常

    异常场景: 使用InetAddress.getLocalHost().getAddress(); 获取address byte数组.在windows上开发的时候,没有问题.部署到linux时报 jav ...