zookeeper安装

来源:互联网 发布:海岛奇兵 科技升级数据 编辑:程序博客网 时间:2024/06/01 08:03

ZooKeeper 
** 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 zookeeperzookeeper


清理:
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.106.130:2888:3888
server.2=192.168.106.131:2888:3888
server.3=192.168.106.132: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 datanodedatanode
journalnode journalnodejournalnode
zookeeper zookeeperzookeeper




** 备注:建议在配置前,把之前服务器配置备份一次,方便以后使用
$ 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/tom/.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.zkfc提供了下面的功能:
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
resourcenanagerresourcenanager
nodemanager nodemanagernodemanager   
zookeeper zookeeperzookeeper


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


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: 拒绝连接; 







原创粉丝点击