HDFS 2.x 高可用性集群架构
在这篇博客中,我将讨论 HDFS 2.x 高可用性集群架构以及设置 HDFS 高可用性集群的过程。这是大数据课程的重要组成部分。 本博客中涵盖主题的顺序如下:
- HDFS HA 架构
- 介绍
- 名称节点可用性
- 架构
- HA(日志节点和共享存储)的实施
- 如何在 Hadoop 集群中设置 HA(日志节点)
介绍:
高可用性集群的概念是在Hadoop 2中引入的。x 来解决 Hadoop 1.x 中的单点故障问题。正如您从我之前的博客中知道的那样,HDFS架构遵循主/从拓扑,其中NameNode充当主守护进程,并负责管理称为DataNodes的其他从属节点。这个单一的主守护进程或 NameNode 成为瓶颈。虽然,辅助 NameNode 的引入确实防止了数据丢失并减轻了 NameNode 的一些负担,但它并没有解决 NameNode 的可用性问题。
名称节点可用性:
如果考虑HDFS集群的标准配置,NameNode将成为单点故障。发生这种情况是因为当NameNode变得不可用时,整个集群将变得不可用,直到有人重新启动NameNode或带来新的NameNode。
NameNode不可用的原因可能是:
- 像维护工作这样的计划事件具有软件或硬件的升级。
- 这也可能是由于计划外事件,其中NameNode由于某些原因而崩溃。
在上述任何一种情况下,我们都有停机时间,无法使用HDFS集群,这成为一个挑战。
HDFS HA 架构:
让我们了解HDFS HA架构如何解决NameNode可用性这个关键问题:
HA 架构通过允许我们在主动/被动配置中拥有两个 NameNode 来解决 NameNode 可用性问题。因此,我们在高可用性集群中同时运行两个 NameNode:
- Active NameNode
- Standby NameNode。
如果一个 NameNode 出现故障,另一个 NameNode 可以接管责任,从而减少集群停机时间。备用 NameNode 用于备份 NameNode(与辅助 NameNode 不同),后者将故障转移功能整合到 Hadoop 集群中。因此,使用 StandbyNode,我们可以在 NameNode 崩溃(计划外事件)时进行自动故障转移,也可以在维护期间进行正常(手动启动)故障转移。
在 HDFS 高可用性集群中维护一致性存在两个问题:
- 活动和备用 NameNode 应始终彼此同步,即它们应具有相同的元数据。这将允许我们将Hadoop集群恢复到它崩溃的相同命名空间状态,因此,将为我们提供快速故障转移。
- 一次只能有一个活动的 NameNode,因为两个活动的 NameNode 会导致数据损坏。这种场景称为裂脑场景,其中集群被划分为较小的集群,每个集群都认为自己是唯一活跃的集群。为了避免这种情况,进行了屏蔽。屏蔽是确保只有一个 NameNode 在特定时间保持活动状态的过程。
HA 架构的实施:
现在,您知道在HDFS HA架构中,我们有两个NameNode同时运行。因此,我们可以通过以下两种方式实现活动和备用名称节点配置:
- 使用仲裁日志节点
- 使用 NFS 的共享存储
让我们了解这两种实现方式,一次采取一种:
1. 使用仲裁日志节点:
- 备用 NameNode 和活动 NameNode 通过一组单独的节点或守护程序(称为 JournalNodes)保持同步。 日志节点遵循环形拓扑,其中节点相互连接以形成环。 JournalNode 为到达它的请求提供服务,并将信息复制到环中的其他节点中。这在日志节点发生故障时提供了容错能力。
- 活动的 NameNode 负责更新 JournalNode 中存在的 EditLogs(元数据信息)。
- StandbyNode 读取对 JournalNode 中的 EditLogs 所做的更改,并以恒定的方式将其应用于自己的命名空间。
- 在故障转移期间,备用节点确保在成为新的活动名称节点之前,它已从日志节点更新其元数据信息。这使当前命名空间状态与故障转移前的状态同步。
- 两个名称节点的 IP 地址可供所有数据节点使用,它们将其心跳和块位置信息发送到两个名称节点。这提供了快速故障转移(更少的停机时间),因为 StandbyNode 具有有关集群中块位置的更新信息。
名称节点的围栏:
现在,如前所述,确保一次只有一个活动名称节点非常重要。因此,屏蔽是确保群集中此属性的过程。
- JournalNode 通过一次只允许一个 NameNode 作为编写器来执行此屏蔽。
- 备用名称节点接管写入日志节点的责任,并禁止任何其他名称节点保持活动状态。
- 最后,新的活动名称节点可以安全地执行其活动。
2. 使用共享存储:
- 备用节点和活动名称节点通过使用共享存储设备保持同步。 活动 NameNode 将在其命名空间中所做的任何修改的记录记录到此共享存储中存在的 EditLog 中。 StandbyNode 读取对此共享存储中的 EditLogs 所做的更改,并将其应用于自己的命名空间。
- 现在,在故障转移的情况下,备用节点首先使用共享存储中的 EditLogs 更新其元数据信息。然后,它承担活动名称节点的责任。这使当前命名空间状态与故障转移前的状态同步。
- 管理员必须至少配置一种屏蔽方法,以避免出现脑裂情况。
- 该系统可以采用一系列围栏机制。它可能包括终止 NameNode 的进程并撤销其对共享存储目录的访问权限。
- 作为最后的手段,我们可以使用一种称为STONITH的技术来围栏先前活动的NameNode,或者“射击头部的另一个节点”。STONITH 使用专门的配电单元强制关闭 NameNode 机器的电源。
自动故障转移:
故障转移是系统在检测到故障或故障时自动将控制权移交给辅助系统的过程。有两种类型的故障转移:
平稳故障转移:在这种情况下,我们手动启动故障转移以进行日常维护。
自动故障转移:在这种情况下,在 NameNode 发生故障(计划外事件)时,将自动启动故障转移。
Apache Zookeeper 是一项在 HDFS High Availabilty 集群中提供自动故障转移功能的服务。它维护少量的协调数据,通知客户端该数据中的更改,并监视客户端的故障。Zookeeper 维护与 NameNode 的会话。如果发生故障,会话将过期,Zookeeper 将通知其他 NameNode 启动故障转移过程。如果 NameNode 发生故障,其他被动 NameNode 可以在 Zookeeper 中锁定,声明它希望成为下一个 Active NameNode。
ZookeerFailoverController (ZKFC) 是一个 Zookeeper 客户端,它还监视和管理 NameNode 状态。每个NameNode也运行一个ZKFC。ZKFC负责定期监控NameNodes的健康状况。
现在您已经了解了 Hadoop 集群中的高可用性,是时候进行设置了。要在Hadoop集群中设置高可用性,您必须在所有节点中使用Zookeeper。
Active NameNode 中的守护进程是:
- Zookeeper
- Zookeeper Fail Over controller
- JournalNode
- NameNode
Standby NameNode中的守护进程包括:
- Zookeeper
- Zookeeper Fail Over controller
- JournalNode
- NameNode
DataNode 中的守护进程包括:
- Zookeeper
- JournalNode
- DataNode
在 Hadoop 中设置和配置高可用性集群:
您必须首先设置每个节点的 Java 和主机名。
Virtual machine | IP address | Host name |
Active NameNode | 192.168.1.81 | nn1.cluster.com or nn1 |
Standby NameNode | 192.168.1.58 | nn2.cluster.com or nn2 |
DataNode | 192.168.1.82 | dn1.cluster.com or dn1 |
下载Hadoop和Zookeeper二进制tar文件,解压文件以编辑配置文件。
命令 : wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
解压缩zookeeper-3.4.6.tar.gz
命令: tar –xvf zookeeper-3.4.6.tar.gz
从Apache Hadoop站点下载稳定的Hadoop二进制tar。
命令: wget https://archive.apache.org/dist/hadoop/core/hadoop-2.6.0/hadoop-2.6.0.tar.gz
提取Hadoop。
命令: tar –xvf hadoop-2.6.0.tar.gz
将Hadoop,Zookeeper和路径添加到.bashrc文件。
打开 .bashrc 文件。
命令: sudo gedit ~/.bashrc
添加以下路径:
export HADOOP_HOME=< Path to your Hadoop-2.6.0 directory> export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop export JAVA_HOME=<Path to your Java Directory> export ZOOKEEPER_HOME =<Path to your Zookeeper Directory> export PATH=$PATH: $JAVA_HOME/bin: $HADOOP_HOME/bin: $HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
在所有节点中启用 SSH。
在所有节点中生成 SSH 密钥。
命令: ssh-keygen –t rsa (此步骤在所有节点中)
不要提供任何指向 Enter 文件的路径来保存密钥,也不要提供任何密码。按回车键。
在所有节点中生成 ssh 密钥进程。
生成 ssh 密钥后,您将获得公钥和私钥。
.ssh 密钥目录应包含权限 700,.ssh 目录中的所有密钥应包含权限 600。
将目录更改为 .ssh,并将文件的权限更改为 600
您必须将命名节点 ssh 公钥复制到所有节点。
在“活动名称节点”中,使用 cat 命令复制 id_rsa.pub。
命令: cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
使用 ssh-copy-id 命令将 NameNode 公钥复制到所有节点。
命令: ssh-copy-id –i .ssh/id_rsa.pub edureka@nn2.cluster.com
将 NameNode 公钥复制到数据节点。
命令: ssh-copy-id –i .ssh/id_rsa.pub edureka@dn1.cluster.com
在所有节点中重新启动 sshd 服务。
命令:sudo service sshd restart (在所有节点中执行)
现在,您可以从Namenode登录到任何节点,而无需任何身份验证。
从“Active Namenode”节点打开core-site.xml文件,并添加以下属性。
在 Active Namenode 中打开 hdfs-site.xml 文件。添加以下属性。
<property> <name>dfs.namenode.name.dir</name> <value>/home/edureka/HA/data/namenode</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <name>dfs.nameservices</name> <value>ha-cluster</value> </property> <property> <name>dfs.ha.namenodes.ha-cluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.ha-cluster.nn1</name> <value>nn1.cluster.com:9000</value> </property> <property> <name>dfs.namenode.rpc-address.ha-cluster.nn2</name> <value>nn2.cluster.com:9000</value> </property> <property> <name>dfs.namenode.http-address.ha-cluster.nn1</name> <value>nn1.cluster.com:50070</value> </property> <property> <name>dfs.namenode.http-address.ha-cluster.nn2</name> <value>nn2.cluster.com:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://nn1.cluster.com:8485;nn2.cluster.com:8485;dn1.cluster.com:8485/ha-cluster</value> </property> <property> <name>dfs.client.failover.proxy.provider.ha-cluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>ha.zookeeper.quorum</name> <value> nn1.cluster.com:2181,nn2.cluster.com:2181,dn1.cluster.com:2181 </value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/edureka/.ssh/id_rsa</value> </property>
将目录更改为zookeeper的 conf 目录。
命令: cd zookeeper-3.4.6/conf
在 conf 目录中zoo_sample.cfg文件,使用zoo_sample.cfg文件创建zoo.cfg。
命令:cp zoo_sample.cfg zoo.cfg
在任何位置创建目录,并使用此目录存储zookeeper数据。
命令:mkdir <path,您要在其中存储zookeeper文件>
打开zoo.cfg文件。
命令:gedit zoo.cfg
将在上述步骤中创建的目录路径添加到 dataDir 属性,并在 zoo.cfg 文件中添加有关剩余节点的以下详细信息。
Server.1=nn1.cluster.com:2888:3888
Server.2=nn2.cluster.com:2888:3888
Server.3=dn1.cluster.com:2888:3888
现在使用 scp 命令将 Java 和 Hadoop-2.6.0、zookeeper-3.4.6 目录和 .bashrc 文件复制到所有节点(备用名称节点、数据节点)。
命令: scp –r <目录> edureka@<IP 地址的路径>:需要复制的路径<>
同样,将 .bashrc 文件和 zookeeper 目录复制到所有节点,并根据各自的节点更改每个节点中的环境变量。
在数据节点中,创建需要存储 HDFS 块的任何目录。
在数据节点中,必须添加 dfs.datanode.data.dir 属性。
就我而言,我创建了数据节点目录来存储块。
更改对数据节点目录的权限。
打开 HDFS-site.xml 文件,在 dfs.datanode.data.dir 属性中添加此数据节点目录路径。
注意:保留从活动名称节点复制的所有属性;在 NameNode 中添加 dfs.datanode.data.dir 一个提取属性。
<property> <name> dfs.datanode.data.dir</name> <value>/home/edureka/HA/data/datanode</value> </property>
在活动名称节点中,更改要存储 zookeeper 配置文件的目录(dataDir 属性路径)。
在目录中创建 myid 文件,并将数字 1 添加到文件中并保存文件。
命令: vi myid
在备用名称节点中,更改要存储 zookeeper 配置文件的目录(dataDir 属性路径)。
在目录中创建 myid 文件,并将数字 2 添加到文件中并保存文件。
在数据节点中,更改要存储 zookeeper 配置文件的目录(dataDir 属性路径)。
在目录中创建 myid 文件,并将数字 3 添加到文件中并保存文件。
在所有三个节点中启动日志节点。
命令:hadoop-daemon.sh 启动日志节点
当您输入 jps 命令时,您将在所有节点中看到 JournalNode 守护进程。
设置活动名称节点的格式。
命令:HDFS namenode -format
在活动名称节点中启动名称节点守护程序。
命令:hadoop-daemon.sh start namenode
将 HDFS 元数据从活动名称节点复制到备用名称节点。
命令:HDFS namenode -bootstrapStandby
运行此命令后,您将获得元数据从哪个节点和位置复制以及复制是否成功的信息。
将元数据从活动名称节点复制到备用名称节点后,您将在屏幕截图中看到如下所示的消息。
在备用名称节点计算机中启动名称节点守护程序。
命令:hadoop-daemon.sh start namenode
现在在所有三个节点中启动 Zookeeper 服务。
命令:zkServer.sh 启动(在所有节点中运行此命令)
在活动名称节点中:
在备用名称节点中:
在“数据”节点中:
运行 Zookeeper 服务器后,输入 JPS 命令。在所有节点中,您将看到仲裁对等主服务。
在数据节点计算机中启动数据节点守护程序。
命令:hadoop-daemon.sh start datanode
在活动名称节点和备用名称节点中启动 Zookeeper 故障转移控制器。
在活动名称节点中格式化动物园管理员故障转移控制器。
命令:HDFS zkfc –formatZK
在活动名称节点中启动 ZKFC。
命令:hadoop-daemon.sh start zkfc
输入 jps 命令以检查 DFSZkFailoverController 守护程序。
在备用名称节点中格式化动物园管理员故障转移控制器。
命令: hdfs zkfc –formatZK
在备用名称节点中启动 ZKFC。
命令:hadoop-daemon.sh start zkfc
输入 jps 命令以检查 DFSZkFailoverController 守护程序。
现在,使用以下命令检查每个名称节点的状态,哪个节点处于活动状态或哪个节点处于待机状态。
Command: hdfs haadmin –getServiceState nn1
现在使用网络浏览器检查每个名称节点的状态。
打开 Web 浏览器并输入以下 URL。
<活动名称节点的 IP 地址>:50070
它将显示名称节点是处于活动状态还是处于备用状态。
使用 Web 浏览器打开另一个名称节点详细信息。
在活动名称节点中,终止名称节点守护程序以将备用名称节点更改为活动名称节点。
在活动名称节点中输入 jps 并杀死守护程序。
命令: sudo kill -9 <namenode 进程 ID>
名称节点进程 ID 为 7606,终止名称节点。
命令:sudo kill -9 7606
通过Web浏览器打开两个节点并检查状态。
名称节点状态。
恭喜您,您已成功在 Hadoop 中设置 HDFS 高可用性集群。
暂无评论内容