Zookeeper

来源:互联网 发布:sqlyog导入数据库 编辑:程序博客网 时间:2024/05/21 06:41
====zookeeper==============================================

ZooKeeper  -- 动物园管理员
    hadoop -- 大象
    Hive   -- 蜜蜂
    pig       -- 猪
    HBase  -- 马
    ...

    ** apache的顶级开源项目
    ** zookeeper.apache.org
    ** 开源、分布式集群
    ** 服务器数量是2n+1,允许服务器宕机个数为n(不影响整个集群的功能)      3台  5台  7台
    ** 为分布式应用提供协调服务
    ** 选举算法:
        ** 活动的投票数量过半就是leader
    ** 正常情况下,集群会选择出一个leader服务器,其他服务器角色是follower

zookeeper功能:
    ** 配置管理(Configuration Management)
    ** 集群管理(Group Membership)
    ** 共享锁(Locks)/同步锁
    ** 统一命名服务(Name Service)

角色:
    leader : 做决定、做决策
    follower :  接受客户端请求, 投票
    
====zookeeper安装=======================

1、解压
$ tar zxvf /opt/softwares/zookeeper-3.4.5.tar.gz

2、修改配置文件
$ mkdir /opt/modules/zookeeper-3.4.5/zkData
$ cp -a zoo_sample.cfg zoo.cfg
修改:dataDir=/opt/modules/zookeeper-3.4.5/zkData

3、启动
$ bin/zkServer.sh start
$ bin/zkServer.sh status

----zookeeper集群-----------------

规划:    
blue01        blue02        blue03    
zookeeper    zookeeper    zookeeper
    
清理:
1.停止服务
$ bin/zkServer.sh stop
2.重建zkData目录
$ rm -rf zkData
$ mkdir zkData
    
配置:
1、配置zoo.cfg
dataDir=/opt/modules/zookeeper-3.4.5/zkData
同时添加下面三条:(2888端口用来通讯,3888用来选举)
server.1=192.168.122.128:2888:3888
server.2=192.168.122.130:2888:3888
server.3=192.168.122.131:2888:3888    
    
2、在zkData目录下添加myid文件 (注意:一定要在linux里创建)
$ vi zkData/myid
1    

3、把zookeeper目录拷贝给其他集群服务器
$ scp -r zookeeper-3.4.5/ blue02.mydomain:/opt/modules/
$ scp -r zookeeper-3.4.5/ blue03.mydomain:/opt/modules/

4、修改另外两条机器的myid文件
    blue02 为 2
    blue03 为 3
    
5、依次启动所有集群服务  
$ bin/zkServer.sh start
$ bin/zkServer.sh status
    
=========================================================================

冷备:实时或者周期性从业务服务器备份重要数据,
      当该业务服务器宕机时,手动启动备份服务器
      ** 业务切换间隔时间比较长
      
热备:实时备份业务服务器备份重要数据,
      当该业务服务器宕机时,集群会自动切换业务服务器,从而替换掉宕机的服务器
      ** 业务切换间隔时间比较短(秒级)

====NameNode HA===============================

Namenode 要考虑热备HA   ---  借助zookeeper    
    
hadoop 0.2+  1.0+ 不支持配置HA
    ** 借助keepalived + drbd
hadoop 2.0+ 支持配置HA    
    ** 借助zookeeper
    
    
思考问题:
    如何保证两台namenode服务器的元数据保持一致?
    ** 专业的存储设备: 比较昂贵
    ** NFS  :  成本低、效率也比较低
    ** QJM (Quorum Journal Manager) 分布式日志系统

        
----Namenode HA部署-------------

目标: 防止单个Namenode宕机后,整个HDFS集群无法访问

规划:
blue01            blue02            blue03
Namenode        Namenode        
datanode        datanode        datanode
journalnode        journalnode        journalnode
zookeeper        zookeeper        zookeeper


** 备注:建议在配置前,把之前服务器配置备份一次,方便以后使用
$ cp -ra hadoop-2.5.0/ cluster-hadoop-2.5.0/


1、配置hdfs-site.xml(替换掉原来的内容)

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>
    
    <!--声明集群名称-->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>
    
    <!--声明集群有几个namenode节点-->
    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>blue01.mydomain:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>blue02.mydomain:8020</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn1</name>
      <value>blue01.mydomain:50070</value>
    </property>
    <property>
      <name>dfs.namenode.http-address.mycluster.nn2</name>
      <value>blue02.mydomain:50070</value>
    </property>
    
    <!--声明journalnode集群服务器-->
    <property>
      <name>dfs.namenode.shared.edits.dir</name>
      <value>qjournal://blue01.mydomain:8485;blue02.mydomain:8485;blue03.mydomain:8485/mycluster</value>
    </property>    
    <!--声明journalnode服务器数据存储目录-->
    <property>
      <name>dfs.journalnode.edits.dir</name>
      <value>/opt/modules/hadoop-2.5.0/data/jn</value>
    </property>
    
    <!--访问代理类: client通过代理类访问active namenode -->
    <property>
      <name>dfs.client.failover.proxy.provider.mycluster</name>
      <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</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/tmm/.ssh/id_rsa</value>
    </property>    
</configuration>


2、配置core-site.xml,修改如下属性
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://mycluster</value>
    </property>

3、拷贝文件给其他服务器
    $ rm -rf data/    --删除三台服务器的数据目录
    $ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml  blue02.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/
    $ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml  blue03.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/

4、启动服务
    1、在各个JournalNode节点上,输入以下命令启动journalnode服务
    $ sbin/hadoop-daemon.sh start journalnode
    
    2、在[nn1]上,对其进行格式化,并启动
    $ bin/hdfs namenode -format
    $ sbin/hadoop-daemon.sh start namenode
    
    3、在[nn2]上,同步nn1的元数据信息,并启动
    $ bin/hdfs namenode -bootstrapStandby
    $ sbin/hadoop-daemon.sh start namenode
    
    4、查看每个服务器进程信息(如果有问题,就把datanode和zookeeper也启动起来)
    在[nn1]上
    $ jps
    3796 JournalNode
    3917 NameNode
    
    在[nn2]上
    $ jps
    2910 JournalNode
    3046 NameNode
    
打开浏览器:
        http://192.168.122.128:50070/
        http://192.168.122.130:50070/
        ** 此时两个namenode都是standby
    
    5、手动把nn1设置为active
    $ bin/hdfs haadmin -transitionToActive nn1
    ** 再次查看http://192.168.122.128:50070/,变为active

5、启动故障自动转移功能
    ** 借助zookeeper
    ** 选举某台namenode为active
    ** 监控namenode的状态信息
    ** 如果active的namenode宕机,zookeeper会自动切换服务器状态(standby-->active)    
    ** zkfc (ZK Failover Controllers) 客户端程序

a)
在hdfs-site.xml文件里,添加如下属性:
 <property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>

PS:
1.dfs.ha.automatic-failover.enabled —– 启动自动failover。自动failover依赖于zookeeper集群和ZKFailoverController(ZKFC),
后者是一个zookeeper客户端,用来监控NN的状态信息。每个运行NN的节点必须要运行一个zkfc。
2.zkfs提供了下面的功能:
Health monitoring zkfc:定期对本地的NN发起health-check的命令,如果NN正确返回,那么这个NN被认为是OK的。否则被认为是失效节点。
ZooKeeper session management: 当本地NN是健康的时候,zkfc将会在zk中持有一个session。
如果本地NN又正好是active的,那么zkfc还有持有一个”ephemeral”的节点作为锁,一旦本地NN失效了,那么这个节点将会被自动删除。
ZooKeeper-based election: 如果本地NN是健康的,并且zkfc发现没有其他的NN持有那个独占锁。
那么他将试图去获取该锁,一旦成功,那么它就需要执行Failover,然后成为active的NN节点。Failover的过程是:第一步,对之前的NN执行fence,如果需要的话。第二步,将本地NN转换到active状态。
启动zkfc的方法如下:hadoop-daemon.sh start zkfc。不过,通过start-dfs.sh会自动启动该进程,一般无需手动起停。

b)
在core-site.xml里添加如下属性:
 <property>
   <name>ha.zookeeper.quorum</name>
   <value>blue01.mydomain:2181,blue02.mydomain:2181,blue03.mydomain:2181</value>
 </property>    

c)
拷贝文件给后面两台服务器:
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml blue02.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml blue03.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/    
    

6、启动响应服务
    1、关闭所有HDFS服务
    在[nn1]执行:
    $ sbin/stop-dfs.sh    
    
    2、启动三个节点上的zookeeper
    
    3、初始化HA在Zookeeper中状态
    在[nn1]执行:
    $ bin/hdfs zkfc -formatZK

    4、启动HDFS服务
    在[nn1]执行:    
    $ sbin/start-dfs.sh
    
    blue01:
    6049 NameNode
    7755 DataNode
    7942 JournalNode
    7441 QuorumPeerMain
    8104 DFSZKFailoverController
    
    blue02:
    6856 DFSZKFailoverController
    6486 QuorumPeerMain
    6660 DataNode
    6752 JournalNode
    6591 NameNode
    
    blue03:
    5588 DataNode
    5674 JournalNode
    5492 QuorumPeerMain
    
    
7、测试观察
http://192.168.122.128:50070/        --active
http://192.168.122.130:50070/        --standby

模拟nn1故障:
    杀掉nn1上面的namenode、关闭网卡 ...
    $ kill -9 6049
    通过浏览器观察nn2的状态 standby --> active


=================resourcemanager HA==================

hadoop 2.x

YARN HA部署:
目标: 防止单个resourcemanager宕机以后,整个YARN集群失效

zookeeper集群:
    ** 监控resourcemanager的状态[是否宕机]
    ** 故障转移
    ** 保存resourcemanager的状态信息
            **  任务运行的状态(进度)
            **  资源分配的状态
      

集群规划:
blue01            blue02            blue03
                resourcenanager    resourcenanager
nodemanager        nodemanager        nodemanager
zookeeper        zookeeper        zookeeper

----部署-------------

1.配置yarn-site.xml文件:
** 历史日志服务配置存在问题,需要调整(自己尝试)

<configuration>

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    
    <!--启用resourcemanager ha-->
    <property>
       <name>yarn.resourcemanager.ha.enabled</name>
       <value>true</value>
     </property>
    
    <!--指定两台resourcemanager的cluster-id-->
     <property>
       <name>yarn.resourcemanager.cluster-id</name>
       <value>cluster1</value>
     </property>
     <property>
       <name>yarn.resourcemanager.ha.rm-ids</name>
       <value>rm1,rm2</value>
     </property>
     <property>
       <name>yarn.resourcemanager.hostname.rm1</name>
       <value>blue02.mydomain</value>
     </property>
     <property>
       <name>yarn.resourcemanager.hostname.rm2</name>
       <value>blue03.mydomain</value>
     </property>
    
    <!--指定zookeeper集群的地址-->
     <property>
       <name>yarn.resourcemanager.zk-address</name>
       <value>blue01.mydomain:2181,blue02.mydomain:2181,blue03.mydomain:2181</value>
     </property>

    <!--启用自动恢复-->
     <property>
       <name>yarn.resourcemanager.recovery.enabled</name>
       <value>true</value>
     </property>
    
    <!--指定resourcemanager的状态信息存储在zookeeper集群-->
    <property>
       <name>yarn.resourcemanager.store.class</name>
       <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
    
    <!--启用日志聚合功能-->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!--日志保存时间,单位秒-->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>
</configuration>

2.复制配置文件给其他服务
$ scp  -r etc/hadoop/yarn-site.xml blue02.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/
$ scp  -r etc/hadoop/yarn-site.xml blue03.mydomain:/opt/modules/hadoop-2.5.0/etc/hadoop/

3.启动各个服务器的服务
    ** zookeeper
    ** HDFS
    ** resourcemanager和nodemanager
    在blue02:
    $ sbin/start-yarn.sh
    在blue03:
    $ sbin/yarn-daemon.sh start resourcemanager
    
4.测试:
** 检查状态
$ bin/yarn rmadmin -getServiceState rm1
active
$ bin/yarn rmadmin -getServiceState rm2
standby

** 运行一个jar包进行测试
$ bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /input /output

** 在job运行的同时,把active服务器的resourcemanager进程杀掉,观察job任务运行状态
$ kill -9 8179

注意:会抛出如下异常,但是仍能得到正确的结果,想想为什么?
java.net.ConnectException: Call From blue02.mydomain/192.168.122.130 to blue02.mydomain:8032 failed on connection exception: java.net.ConnectException: 拒绝连接;


===================================================

PS:
面试题:
hadoop1 与 hadoop 2 的区别?
    1、hadoop1里没有yarn,jobtracker和tasktracker集成在mapreduce
       hadoop2单独把任务管理和资源管理抽出来命名为yarn, resourcemanager和nodemanager
    2、hadoop1里没有Namenode HA和resourcemanager HA,存在单点故障
    3、hadoop2在性能和安全性方面有所加强


hadoop(HDFS)如何保证数据安全?
    1、HDFS采用的是分布式架构,datanode数据存储采用block的形式,把文件存入分布式文件系统
    2、每个block默认有3个副本,第一个副本本地机器,第二个副本放在同机架的不同服务器,第三个副本放置在不同机架的其他服务器
    3、hdfs集群设计了safemode安全模式,当集群坏块太多,触发了阀值整个集群会进入安全模式,只能读,不能写;
       启动过程中也会进入安全模式,等待datanode向namenode发送块报告和心跳
    4、HDFS里面的文件也有类似linux系统的权限
    5、针对HDFS和YARN的高可用,设计HA功能
0 0