高可用(HA) -- ZooKeeper
ZooKeeper
- 一个开源的分布式的,为分布式应用提供服务的项目
- 提供原语集合以便分布式应用可以在它之上构建更高层次的同步服务
-
角色
观察者模式: leader: 领导者负责进行投票的发起及决议, 更新状态 学习者: follower: 接受客户端请求并发挥客户端返回结果,参与投票 observer: 接受请求,转发给leader,不参与投票,只同步leader. 客户端: 发起请求 观察者模式的应用: 软件皮肤, 编辑工具设置
-
安装
-
伪分布模式
1)安装ZooKeeper (再次注意权限) $ tar -zxf /opt/software/zookeeper-3.4.5.tar.gz -C /opt/modules/ 2)新建一个Zookeeper的data目录 $ mkdir zkData --//可以不用手动创建,启动自动生成 3)修改配置文件${ZOOKEEPER_HOME}/conf (注意: 配置文件为模板,需拷贝重名为zoo.cfg) $cd /opt/modules/zookeeper-3.4.5/ ##切换目录到zookeeper-3.4.5 $ cp conf/zoo_sample.cfg conf/zoo.cfg ##拷贝 $ vi conf/zoo.cfg ##修改12行,设置以下: dataDir=/opt/modules/zookeeper-3.4.5/zkData 4)启动zookeeper $bin/zkServer.sh start $ jps #查看java进程如下 2088 QuorumPeerMain 5)查看zookeeper的状态 $bin/zkServer.sh status #信息如下 JMX enabled by default Using config: /opt/modules/zookeeper-3.4.5/bin/../conf/zoo.cfg Mode: standalone #单机模式 6)一些命令的认识 $ bin/zkCli.sh #进入zookper help #查看命令 quit #退出 create #创建 -e临时znode -s 自动编号 get path #查看信息 ls path #查看指定目录的列表 rmr path #删除 ls / #查看根目录 create -e /myapp msg #创建目录 get /myapp #查看myapp创建信息 ls / watch # 添加关注事件 rmr /myapp #删除触发关注事件 quit
-
完全分布模式
1.安装JDK(3台PC都要安装JDK) 2.安装完全分布式集群 1)安装zk(注意权限) $ tar -zxvf /opt/software/zookeeper-3.4.5.tar.gz -C /opt/modules/ 2)配置zoo.cfg文件 $ cd /opt/modules/zookeeper-3.4.5/ $ cp conf/zoo_sample.cfg conf/zoo.cfg $ vi conf/zoo.cfg #修改添加以下内容 #修改 dataDir=/opt/modules/zookeeper-3.4.5/zkData #15行添加 server.1=centos01.ibeifeng.com:2888:3888 server.2=centos02.ibeifeng.com:2888:3888 server.3=centos03.ibeifeng.com:2888:3888 3)创建zkData目录,在zkData目录目录下创建myid文件,分发 $ mkdir zkData $ touch zkData/myid $ cd /opt/modules/ #切到modules下 从pc1分发到pc2, pc3 $ scp -r zookeeper-3.4.5/ centos02.ibeifeng.com:/opt/modules/ $ scp -r zookeeper-3.4.5/ centos03.ibeifeng.com:/opt/modules/ 4) 修改pc1, pc2, pc3 的myid文件 $ cd /opt/modules/zookeeper-3.4.5/ $ vi zkData/myid #根据conf/zoo.zfg中绑定的server.n对应 pc1的zkData/myid内容是1 pc2的zkData/myid内容是2 pc3的zkData/myid内容是3 5)启动3台的zookeeper $ bin/zkServer.sh start 6)检查进程 $ jps 3050 QuorumPeerMain 3111 Jps 8)检查并核对状态3台的状态 $ bin/zkServer.sh status Zookeeper shell命令 bin/zkCli.sh -server 主机名:2181 或者 bin/zkCli.sh
-
I) 文件系统(数据结构)
Znode
1.代表zookeeper文件系统中的一个目录,
2.代表客户端(如:Namenode)
|---/
|---app
|---app1
|---app2
|---app2
动物 -> hadoop 中的节点 Namende
II) Watch事件
1.NameNode启动,然后向Zookeeper,触发注册事件,同时会创建一个唯一的目录
2.通过心跳信息,来确认节点的状态(存活或者宕机)
3.如果宕机,长时间未收到心跳,触发节点丢失事件,删除这个目录
III)投票(偶数可能僵持)
leader的候选人必须获取到超过半数的选票 n+1
zookeeper集群中存活的节点数据必须过半数
Namenode HA
一)安装hadoop
此步骤要求,ip映射,主机名,jdk安装配置,hadoop解压
如果分布式已经搭建好,需对三台进行操作.
注意删除data,logs目录!!!
注意修改搭建前,停止相关进程
删除/tmp/*.pid文件 (注意不要全删了!!!!,是删除/tmp/的以pid结尾的)
$ rm /tmp/*.pid
免密登录
可以按照下面的步骤修改即可
二)配置环境文件
检查
hadoop-env.sh
mapred-env.sh
yarn-env.sh
配置
export JAVA_HOME=/opt/modules/jdk1.7.0_67
三)配置hdfs文件
1.========core-site.xml========
<!--NameNode HA的逻辑访问名称-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/modules/hadoop-2.5.0/data</value>
</property>
2.=======hdfs-site.xml=============
<!-- 分布式副本数设置为3 -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 关闭权限检查用户或用户组 -->
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!-- 指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns1</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>centos01.ibeifeng.com:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn1</name>
<value>centos01.ibeifeng.com:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns1.nn2</name>
<value>centos02.ibeifeng.com:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns1.nn2</name>
<value>centos02.ibeifeng.com:50070</value>
</property>
<!-- 指定NameNode的edit文件在哪些JournalNode上存放 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://centos01.ibeifeng.com:8485;centos02.ibeifeng.com:8485;centos03.ibeifeng.com:8485/ns1</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/modules/hadoop-2.5.0/journal</value>
</property>
<!-- 当Active出问题后,standby切换成Active,此时,原Active又没有停止服务,这种情况下会被强制杀死进程。-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 /home/hadoop为我的用户家目录,我的是hadoop, ssh也能免密登录了, 才行,切记!! -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
3. ==========配置 slaves start==========
centos01.ibeifeng.com
centos02.ibeifeng.com
centos03.ibeifeng.com
4. ============向第二台和第三台分发数据===============
$ cd /opt/modules/hadoop-2.5.0/
其他两台机器安装了hadoop,直接覆盖对应的配置文件
(如果没有其他的服务器没有hadoop,可以把hadoop-2.5.0分发到其他两个服务器上)
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml centos02.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml centos03.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
使用命令检查是否分发成功在对应的pc上
$ cat etc/hadoop/hdfs-site.xml
$ cat etc/hadoop/core-site.xml
切换到
$ cd /opt/modules/zookeeper-3.4.5/
四) 启动相关进程
1. ============启动zookeeper相关===========
$ bin/zkServer.sh start
$ jps #查看进程
3129 QuorumPeerMain
$ bin/zkServer.sh status # 查看状态
JMX enabled by default
Using config: /opt/modules/zookeeper-3.4.5/bin/../conf/zoo.cfg
Mode: leader #或者是follower
2. ============启动HDFS HA start=================
## 注意:每一个步骤都严格按照以下步骤执行
$ cd /opt/modules/hadoop-2.5.0/ #切换目录
1. 启动journalnode
$ sbin/hadoop-daemon.sh start journalnode #在三台分别启动, 日志同步的journalnode进程
$ jps #三台服务器显示
3422 Jps
3281 QuorumPeerMain
3376 JournalNode
2. 格式化namenode 在第一台上操作!!!!! 切记
$ bin/hdfs namenode -format
出现提示:successfully formatted
3. 在第一台(centos01)上启动namenode
$ sbin/hadoop-daemon.sh start namenode #jps 查看是否启动
4. 切到第二台(centos02.ibeifeng.com)服务器,让另一个namenode 拷贝元数据
$ bin/hdfs namenode -bootstrapStandby
$ sbin/hadoop-daemon.sh start namenode #启动namenode
可以在web页面观察,现在只有namenode启动了, 都是standby状态
http://centos01.ibeifeng.com:50070
http://centos02.ibeifeng.com:50070
5. 使用以下命令将一个namenode active
$ bin/hdfs haadmin -transitionToActive nn2 #将第二个namenode作为active
http://centos02.ibeifeng.com:50070 发现centos2服务器的namenode 时active状态
开启故障自动转移
先停止HDFS进程,在机器centos01上执行
$ sbin/stop-dfs.sh
1.配置故障转移 ( 追加)
1)=====core-site.xml
<!-- 向哪个zookeeper注册 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>centos01.ibeifeng.com:2181,centos02.ibeifeng.com:2181,centos03.ibeifeng.com:2181</value>
</property>
2)====hdfs-site.xml
<!-- 开启ha自动故障转移 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
2.分发配置文件
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml centos02.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
$ scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml centos03.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
3.启动故障转移服务
1)首先停止hdfs和zk
$ sbin/stop-dfs.sh
##关闭zk(3台服务器)
$ bin/zkServer.sh stop
重启##启动zk(3台服务器)
$ bin/zkServer.sh start
2)初始化zkfc[PC1也就是nn1] 在第一台(cd /opt/modules/hadoop-2.5.0/ )
$ bin/hdfs zkfc -formatZK ##初始化ZKFC
17/12/22 04:50:55 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns1 in ZK.
17/12/22 04:50:55 INFO zookeeper.ZooKeeper: Session: 0x2607abd3bee0000 closed
17/12/22 04:50:55 INFO zookeeper.ClientCnxn: EventThread shut down
3) 启动hdfs 在centos01启动即可
$ sbin/start-dfs.sh ##启动hdfs
$ bin/hdfs haadmin -getServiceState nn1 #查看nn1状态
$ bin/hdfs haadmin -getServiceState nn2 #查看nn2状态
4. 查看三台进程,确认开启
$jps
[centos01]
[hadoop@centos01 hadoop-2.5.0]$ jps
3281 QuorumPeerMain
4793 JournalNode
4610 DataNode
5137 Jps
4518 NameNode
4974 DFSZKFailoverController
[centos02]
[hadoop@centos02 hadoop-2.5.0]$ jps
3129 QuorumPeerMain
4270 Jps
4176 DFSZKFailoverController
3892 NameNode
3955 DataNode
4046 JournalNode
[centos03]
[hadoop@centos03 hadoop-2.5.0]$ jps
3630 Jps
3553 JournalNode
3022 QuorumPeerMain
3465 DataNode
5. 模拟active namenode 故障
$ kill -9 4518 #杀死active namenode standby namenode 切为active
$ sbin/hadoop-daemon.sh start namenode #于该主机再次namenode ,为standby
ResourceManager HA
集群规划
PC01 PC02 PC03
NameNode NameNode
ZKFC ZKFC
ResourceManager ResourceManager
DataNode DataNode DataNode
JournalNode JournalNode JournalNode
NodeManager NodeManager NodeManager
ZooKeeper ZooKeeper ZooKeeper
先停止hdfs进程
$ sbin/hadoop-daemon.sh start namenode
1) 修改配置文件
=====yarn-site.xml (覆盖)
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</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>
<!--启用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>rmcluster</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>centos02.ibeifeng.com</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>centos03.ibeifeng.com</value>
</property>
<!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>centos01.ibeifeng.com:2181,centos02.ibeifeng.com:2181,centos03.ibeifeng.com: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>
2) 分发配置文件
将yarn-site.xml分发到其他两台
$ scp etc/hadoop/yarn-site.xml centos02.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
$ scp etc/hadoop/yarn-site.xml centos03.ibeifeng.com:/opt/modules/hadoop-2.5.0/etc/hadoop/
3) 启动ResourceManagere
先在centos01启动hdfs
$ sbin/start-dfs.sh
在rm1(centos02)上:
$ sbin/start-yarn.sh
在rm2(centos03)上手动启动:
$ sbin/yarn-daemon.sh start resourcemanager
4) 检查进程是否启动
$ jps
[hadoop@centos01 hadoop-2.5.0]$ jps
6737 DFSZKFailoverController
6559 JournalNode
3281 QuorumPeerMain
6375 DataNode
6975 Jps
6277 NameNode
6854 NodeManager
[hadoop@centos02 hadoop-2.5.0]$ jps
5471 DataNode
4917 ResourceManager
5403 NameNode
3129 QuorumPeerMain
6020 Jps
5866 NodeManager
5687 DFSZKFailoverController
5564 JournalNode
[hadoop@centos03 hadoop-2.5.0]$ jps
3022 QuorumPeerMain
4373 NodeManager
4174 DataNode
4577 Jps
4263 JournalNode
4518 ResourceManager
5) 查看serverid为rm1的resourcemanager节点的状态
$ bin/yarn rmadmin -getServiceState rm1
或网页查看
http://centos02.ibeifeng.com:8088/cluster
http://centos03.ibeifeng.com:8088/cluster
6) 测试ResourceManager HA
kill -9 4917 然后查看web界面的访问
centos03变为active
再次启动centos02的resourcemanager 状态为standby
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。