0
点赞
收藏
分享

微信扫一扫

Linux-0.11 文件系统file_dev.c详解

追风骚年 2023-06-02 阅读 93

HA高可用集群

HA介绍

什么是HA

HA: High Availability,高可用集群,指的是集群7*24小时不间断服务。

为什么需要HA

在HDFS中,有NameNode、DataNode和SecondaryNameNode角色的分布,客户端所有的操作都是要与NameNode交互的,同时整个集群的命名空间信息也都保存在NameNode节点。但是,现在的集群配置中只有一个NameNode,于是就有一个问题: 单点故障

那么,什么是单点故障呢?现在集群中只有一个NameNode,那么假如这个NameNode意外宕机、升级硬件等,导致NameNode不可用了,整个集群是不是也就不可用了?这就是单点故障的问题。

为了解决这样的问题,就需要高可用集群了。

高可用的备份方式

  • 主从模式(冷备)

  • 双主互备(热备)(了解)

  • 集群多备(了解)

高可用的实现

我们在这里采用的是主从模式的备份方式,也就是准备两个NameNode,一个对外提供服务,称为Active节点;另外一个不对外提供服务,只是实时的同步Active节点的数据,称为Standby的节点。

为了提供快速的故障转移,Standby节点还必须具有集群中块位置的最新信息。为了实现这一点,DataNodes被配置了两个NameNodes的位置,并向两者发送块位置信息和心跳信号。也就是说,DataNode同时向两个NameNode心跳反馈。

高可用架构图

JournalNode

  • JournalNode的功能

  • 防止脑裂的发生

  • JournalNode集群正常工作的条件

  • JournalNode的缺点

自动容灾原理

如果想进行HA的自动故障转移,那么需要为HDFS部署两个新组件:ZooKeeper quorum和ZKFailoverController进程(缩写为ZKFC)

Zookeeper quorum

Apache ZooKeeper是一项高可用性服务,用于维护少量的协调数据,将数据中的更改通知客户端并监视客户端的故障。HDFS自动故障转移的实现依赖ZooKeeper进行以下操作:

ZKFC

ZKFailoverController(ZKFC)是一个新组件,它是一个ZooKeeper客户端,它监视和管理namenode的状态。运行namenode的每台机器都会运行一个ZKFC,该ZKFC负责以下内容:

自动容灾的过程描述

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这样可以避免不必要的麻烦

启动: 普通集群转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。
复制代码

自动容灾测试

API操作

对于HA集群来说,如果想要使用JavaAPI进行集群的访问,需要在Configuration中设置好每一个属性,也就是再上方配置集群时进行的各种配置。如果觉得麻烦,最简单的方法就是将core-site.xml、hdfs-site.xml拷贝到项目的Resources目录下。

也可以观看大数据相关视频:
 

千锋大数据Hadoop全新增强版-先导片

举报

相关推荐

0 条评论