搭建高可用HA

完全分布式系统:
完全分布式系统的hadoop是不能用于生产环境
为什么?
1: 单点故障((SPOF:A Single Point of Failure):整个集群崩溃(如果NameNode挂掉,整个集群都会挂掉)
2: 内存不足:随着业务的越来越大,内存的需求肯定跟不上数据的增长(压力过大内存受限)
3: 启动时间 日志越来越大,启动的时间会越来越长
4: 业务隔离:如果其中一额内存占用较大,会影响其他的业务

解决方法:
配置高可用的分布式系统

1: 解决单点故障:
1: HDFS HA:高可用,其中一个节点出现故障,另外一个节点直接成为主节点开始工作(通过主备NameNode解决,如果主NameNode发生故障,则切换到备NameNode上,设置两个节点(NameNode),一个是活动的active,另外一个是备用的standby节点,正常情况下,主节点对外提供服务,备用节点同步主节点(NameNode)元数据,且备用节点有进程监控主节点的运行,当主节点挂掉,备节点取而代之.
2: standby:备用NameNode,完成edits.log文件合并产生新的fsimage
3: 所有的DN同时向两个NameNode汇报数据块信息(位置,权限,大小等等)
4: JN:实现主备NN之间的数据同同步

主节点的日志同步到备用节点的方式:
1: NFS 属于linux自带的同步方式(但是linux版本太多,所以不推荐使用,且容易出现脑裂的现象,不易控制)
2: QJM(Quorum Journal Manager):是hadoop为了NameNode共享储存开发的的组件,其集群运行一组journalNode,主备节点通过一组journalNode进行通信.active namenode把edits文件写入2n+1个journalNode(数量为奇数,3,57…)中,只要有n+1个节点确认写入成功,就可以认为是写入成功的.而这时备用节点(Standby namenode就可以从journalNode中读取edits文件),备用节点监控journalNode中log的变化,当发现log发生变化时,会自动把journalNode中的数据同步到自己的目录镜像树中.
3: 如果active NameNode挂掉了,Standby NameNode会在成为 active NameNode之前,读取JN中所有的修改文件,这样就可以高可靠的保证和之前挂掉的active NameNode一样的目录镜像树,从而无缝的接替active NameNode的职责,维护客户端的请求,从而到高可用的目的,

备用节点的日常:
1:接受同步日志,开始重做 ,保证和主节点内存一致(有相同的目录,文件列表)
2: 和DN保持心跳(Block与DN的映射关系)
3: 拥有检查点:3600 64 ,合并fsimage与edits文件,将合并好的fsimage发送给主节点(所有在下次主节点重新启动的时候,就拥有最新的fsimage文件)

主备NameNode切换方式有两种方式:
1: 手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
2: 基于Zookeeper实现

基于Zookeeper自动切换主备节点:
1: Zookeeper FailoverController(zkfc): 监控NameNode的健康状态,如果主节点挂掉,启动命令调用备用节点切换成为主节点

2: 解决内存受限问题:
联邦机制(HDFS Federation):可以让而更多的namenode同时提供服务(解决内存受限问题)

**Federation(解决NameNode压力过大)?*将原来一个NN节点的操作分割到多个节点上
1.x;只要一个命令空间namespace
2.x:可以根据自己IDE需求设置多个namespace,一个NN对应一个namespace,但是namespace可以对应多个DN

在这里插入图片描述
步骤:
1: DN现在同时向主备节点同时发送心跳链接,同时向主备节点汇报节点信息
2: SecondaryNameNode被移除了,日志与fsimage合并需要另外一个节点来完成
3: 真个HDFS对外的还是只有主节点,所以我们的日志文件主要还是保存在主节点上面
4: 随着时间的增长,日志文件越来越多,肯定需要别的节点来合并日志
4: 这是需要将主节点的日志文件同步到备用节点上,然后备用文件重做日志记录,但是不作用到集群上

HA搭建:

在三台机器互相免密的基础上代建,免密登录上一篇文章已经有了详细的教程,就不在多说了

1 分别查看三台机器中的authorized_keys文件中,是否有三台机器的公钥
vim .ssh/authorized_keys
在这里插入图片描述

2 搭建Zookerper集群

1:上传解压zookeeper安装包
在这里插入图片描述
2 :进入 root/zookeeper-3.4.6/conf中 拷贝zoo_sample.cfg文件,重命名为zoo.cfg
cp zoo_sample.cfg zoo.cfg

3:vim zoo.cfg 修改配置文件

修改数据存放路径:dataDir=/var/sxt/zookeeper
客户端连接的端口: clientPort=2181
在这里插入图片描述
4 在配置数据存放路径的(dataDir)目录下,创建myid文件,并编写对应的id
echo 1/2/3 > /var/sxt/zookeeper/myid
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5、 拷贝zookeeper目录到其他台机器
scp -r zookeeper-3.4.6/ root@node2:/opt/shsxt/
scp -r zookeeper-3.4.6/ root@node3:/opt/shsxt/
在这里插入图片描述
6 将zookeeper_home配置到/etc/profile下,并将bin目录添加至path中
在这里插入图片描述
7: 将node1下面修改好的profile分别发送给node2,node3之后,重新加载文件: source /etc/profile
scp -r /etc/profile root@node2:/etc/profile
scp -r /etc/profile root@node3:/etc/profile
在这里插入图片描述
8: 三台机器都启动… zkServer.sh start
在这里插入图片描述
9: 查看每台zookeeper的角色: zkServer.sh status
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关闭 zkServer.sh stop 拍摄快照

hdfs HA配置

1 上传解压hadoop压缩包
2: 修改hadoop/etc中三个配置文件中的jdk路径
3: vim core-site.xml 修改核心配置文件

在这里插入图片描述
4:vim hdfs-site.xml

<configuration>
       <value>shsxt</value>
     </property>
     <property>
        <name>dfs.ha.namenodes.shsxt</name>
        <value>nn1,nn2</value>
     </property>
     <property>               // shsxt中nn1对外服务的RPC地址。
         <name>dfs.namenode.rpc-address.shsxt.nn1</name>
        <value>node1:8020</value>
     </property>
     <property>
         <name>dfs.namenode.rpc-address.shsxt.nn2</name>
        <value>node2:8020</value>
     </property>
     <property>         shsxt中nn1对外服务http地址
        <name>dfs.namenode.http-address.shsxt.nn1</name>
        <value>node1:50070</value>
     </property>
     <property>
         <name>dfs.namenode.http-address.shsxt.nn2</name>
         <value>node2:50070</value>
     </property>
     <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node1:8485;node2:8485;node3:8485/shsxt</value>
     </property>
     <property>
         <name>dfs.journalnode.edits.dir</name>
          <value>/var/sxt/hadoop/ha/jn</value>
     </property>
     <property>
          <name>dfs.client.failover.proxy.provider.shsxt</name>
          <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
     </property>
     <property>            隔离机制
        <name>dfs.ha.fencing.methods</name>
         <value>sshfence</value>
     </property>
     <property>             // //使用隔离机制时需要ssh 免密登录
         <name>dfs.ha.fencing.ssh.private-key-files</name>
         <value>/root/.ssh/id_rsa</value>
     </property>
     <property>      //  //是否开启NameNode失败之后自动切换
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
     </property>

</configuration>

5: 修改slaves配置文件:
在这里插入图片描述
6: 修改系统配置文件 vim /etc/profile
在这里插入图片描述
7: 把node1的hadoop文件拷贝给node2 node3
scp -r /opt/shsxt/hadoop-2.6.5/ root@node2:/opt/shsxt/
scp -r /opt/shsxt/hadoop-2.6.5/ root@node3:/opt/shsxt/

8: 把node1的/etc/profile文件拷贝给node2 node3,然后重新加载文件 source /etc/profile
在这里插入图片描述
9 查看zookeeper状态的时候,报错的原因可能是防火墙没有关闭,关一下就好了
在这里插入图片描述
10 分别在三台JNN启动 jn 进程 hadoop-daemon.sh start journalnode
在这里插入图片描述
11 在两台NN 中选一台进行格式化,然后启动:
hdfs namenode -format
hadoop-daemon.sh start namenode

在这里插入图片描述
在这里插入图片描述

12 在另一台NN上同步格式化后的相关信息….
hdfs namenode -bootstrapStandby
在这里插入图片描述

13、格式化zkfc hdfs zkfc -formatZK
14、启动hdfs 集群 start-dfs.sh

这是第一次配置集群的时候要这样…以后启动集群只要start-dfs.sh直接启动即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值