共计 10384 个字符,预计需要花费 26 分钟才能阅读完成。
高可用(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
正文完