irpas技术客

分布式应用协调服务Zookeeper_是七月吖_分布式应用协调服务

irpas 6804

一、学习目标

了解zookeeper架构及角色

了解zookeeper数据结构

理解zookeeper内部原理

会使用zookeeper实现高可用集群

二、zookeeper简介 zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目 zookeeper=文件系统+通知机制

(1) Zookeeper从设计模式上来看是一个基于观察者模式设计的分布式服务管理框架。

它负责存储和管理大家都关心的数据,然后接受观察者的注册。

(2) 一旦数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出响应的反应,从而实现集群中类似Master/Slave管理模式。

三、zookeeper数据结构 znode

zookeeper数据模型的结构与linux文件系统很像,可以看成一棵树,树的每个节点都称作一个znode。每个znode默认能够存储1MB的数据,每个znode都可以通过其路径唯一表示

节点类型

PERSISTENT:持久化节点,默认类型

PERSISTENT_SEQUENTIAL:持久化顺序编号节点

EPHEMERAL: 临时节点

EPHEMERAL_SEQUENTIAL: 临时顺序编号节点

四、zookeeper命令

?五、zookeeper角色 Leader(领导者)

负责进行投票的发起和决议,更新系统装填

Follower(跟随者)

用于接收客户端请求并向客户端返回结果

在选主过程中参与投票

Observer(观察者)

可以接收客户端连接,将写请求转发给leader节点。

但Observer不参与投标过程,只同步leader状态。

Observer的目的是为了扩展系统,提高读取速度。

六、zookeeper选举机制 半数机制

集群中半数以上机器存活,集群可用。

zookeeper工作时,有一个节点为leader,其他为follower,leader是通过内部选举机制临时产生的。

leader选举是保证分布式数据一致性的关键所在。

leader选举触发时机

服务器初始化启动。

服务器运行期间无法和leader保持连接。

老版本的zookeeper容易出现脑裂问题(当leader挂了之后,导致出现两个follower集群,此时产生两个leader,当老的leader修好之后成为了follower后,会出现两个leader导致两个集群的数据产生不一致,这种现象就是脑裂),新版本已修复。新版本采用了Quorums这种方法来防止脑裂。

七、搭建高可用hadoop集群搭建 (1)准备3台centos7服务器 (2)修改hostname hosts文件 配置网络 关闭防火墙

这是hosts文件内容,将三台主机的ip地址和主机名写进去

?(3)生成公私钥使得三台虚拟机能够互相访问 #hd01 做ssh 公私钥 无秘 ssh-keygen -t rsa -P '' # copy 公钥到 hd02 hd03 ssh-copy-id 192.168.192.201#hd02 ssh-copy-id 192.168.192.202#hd03 #进入另外一个虚拟机 ssh 主机名#IP地址 (4)所有服务器时间同步 # 安装chrony yum -y install chrony #配置chrony vi /etc/chrony.conf server ntp1.aliyun.com server ntp2.aliyun.com server ntp3.aliyun.com 注释掉server 0.centos.pool.ntp.org iburst 类似的也要注释掉 可以看下图 #启动chrony systemctl start chronyd

(5)安装 gcc wget psmisc yum install -y gcc yum install -y wget yum install -y psmisc

?psmisc(linux命令工具包 namenode主备切换时要用到 只需要安装在两个namenode节点上)

(6) 修改yum源(阿里云) # 进入阿里云镜像站点 https://developer.aliyun.com/mirror/ #这里有阿里云的指导 #备份原始源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup #下载源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo #清除缓存 yum clean all # 清除系统所有的yum缓存 yum makecache # 生成yum缓存 (7)安装jdk

这条命令可以拷贝到其他服务器里面。如果有ssh远程互联就不需要登录密码。

(8)安装zookeeper(要跟hadoop版本一样)

?zookeeper安装包

链接:https://pan.baidu.com/s/1Pew6HRZEFG-udwPC_GUt1g? 提取码:3ppt

#zookeeper解压 tar -zxf zookeeper-3.4.5-cdh5.14.2.tar.gz #移动解压后的文件并修改文件名 mv zookeeper-3.4.5-cdh5.14.2 soft/zookeeper345 #移动到conf文件夹下 cd soft/zookeeper345/conf #copy zoo_sample.cfg cp zoo_sample.cfg zoo.cfg #修改zoo.cfg dataDir=/opt/soft/zk345/data #server.1 里面的1 代表你的第几个服务器,不同服务器代表的数字不同。 #hd01代表主机名可用ip地址代替 #2888端口号代表zookeeper服务器文件上传下载的端口号 #3888端口号代表zookeeper服务器选举投票leader server.1=hd01:2888:3888

这是其中一个服务器的zoo.cfg配置

clientPort端口号要记住

?

?(9)使用echo 在data文件夹里面生成myid

这里的1在第二个服务器里面写 2 同理一次往后类推 3,4,5,。。。

echo "1">myid?

(10) 启动集群

增加环境变量 vim /etc/profile

刷新环境变量配置文件 source?/etc/profile

zkServer.sh start

启动成功效果图:

?(11)安装hadoop集群 1.在单台上配置一个hadoop环境 创建文件夹 # 解压 tar -zxf hadoop-2.6.0-cdh5.14.2.tar.gz # 移动到自己的安装文件夹下 mv hadoop-2.6.0-cdh5.14.2 soft/hadoop260 # 添加对应各个文件夹 mkdir -p /opt/soft/hadoop260/tmp mkdir -p /opt/soft/hadoop260/dfs/journalnode_data mkdir -p /opt/soft/hadoop260/dfs/edits mkdir -p /opt/soft/hadoop260/dfs/datanode_data mkdir -p /opt/soft/hadoop260/dfs/namenode_data 2.配置hadoop-env.sh export JAVA_HOME=/opt/soft/jdk180 export HADOOP_CONF_DIR=/opt/soft/hadoop260/etc/hadoop 3.配置core-site.xml <!--指定hadoop集群在zookeeper上注册的节点名--> <property> <name>fs.defaultFS</name> <value>hdfs://hacluster</value> </property> <!--指定hadoop运行时产生的临时文件--> <property> <name>hadoop.tmp.dir</name> <value>file:///opt/soft/hadoop260/tmp</value> </property> <!--设置缓存大小 默认4KB--> <property> <name>io.file.buffer.size</name> <value>4096</value> </property> <!--指定zookeeper的存放地址--> <property> <name>ha.zookeeper.quorum</name> <value>hd01:2181,hd02:2181,hd03:2181</value> </property> <!--配置允许root代理访问主机节点--> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <!--配置该节点允许root用户所属的组--> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> 4.配置hdfs-site.xml <property> <!--数据块默认大小128M--> <name>dfs.block.size</name> <value>134217728</value> </property> <property> <!--副本数量 不配置默认为3--> <name>dfs.replication</name> <value>3</value> </property> <property> <!--namenode节点数据(元数据)的存放位置--> <name>dfs.name.dir</name> <value>file:///opt/soft/hadoop260/dfs/namenode_data</value> </property> <property> <!--datanode节点数据(元数据)的存放位置--> <name>dfs.data.dir</name> <value>file:///opt/soft/hadoop260/dfs/datanode_data</value> </property> <property> <!--开启hdfs的webui界面--> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <property> <!--datanode上负责进行文件操作的线程数--> <name>dfs.datanode.max.transfer.threads</name> <value>4096</value> </property> <property> <!--指定hadoop集群在zookeeper上的注册名--> <name>dfs.nameservices</name> <value>hacluster</value> </property> <property> <!--hacluster集群下有两个namenode分别是nn1,nn2--> <name>dfs.ha.namenodes.hacluster</name> <value>nn1,nn2</value> </property> <!--nn1的rpc、servicepc和http通讯地址 --> <property> <name>dfs.namenode.rpc-address.hacluster.nn1</name> <value>hd01:9000</value> </property> <property> <name>dfs.namenode.servicepc-address.hacluster.nn1</name> <value>hd01:53310</value> </property> <property> <name>dfs.namenode.http-address.hacluster.nn1</name> <value>hd01:50070</value> </property> <!--nn2的rpc、servicepc和http通讯地址 --> <property> <name>dfs.namenode.rpc-address.hacluster.nn2</name> <value>hd02:9000</value> </property> <property> <name>dfs.namenode.servicepc-address.hacluster.nn2</name> <value>hd02:53310</value> </property> <property> <name>dfs.namenode.http-address.hacluster.nn2</name> <value>hd02:50070</value> </property> <property> <!--指定Namenode的元数据在JournalNode上存放的位置--> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hd01:8485;hd02:8485;hd03:8485/hacluster</value> </property> <property> <!--指定JournalNode在本地磁盘的存储位置--> <name>dfs.journalnode.edits.dir</name> <value>/opt/soft/hadoop260/dfs/journalnode_data</value> </property> <property> <!--指定namenode操作日志存储位置--> <name>dfs.namenode.edits.dir</name> <value>/opt/soft/hadoop260/dfs/edits</value> </property> <property> <!--开启namenode故障转移自动切换--> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <!--配置失败自动切换实现方式--> <name>dfs.client.failover.proxy.provider.hacluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProx yProvider</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> <!--hdfs文件操作权限 false为不验证--> <name>dfs.premissions</name> <value>false</value> </property> 5.配置mapred-site.xml

cp mapred-site.xml.templeate mapred-site.xml

<property> <!--指定mapreduce在yarn上运行--> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <!--配置历史服务器地址--> <name>mapreduce.jobhistory.address</name> <value>hd01:10020</value> </property> <property> <!--配置历史服务器webUI地址--> <name>mapreduce.jobhistory.webapp.address</name> <value>hd01:19888</value> </property> <property> <!--开启uber模式--> <name>mapreduce.job.ubertask.enable</name> <value>true</value> </property> 6.配置yarn-site.xml <property> <!--开启yarn高可用--> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <!-- 指定Yarn集群在zookeeper上注册的节点名--> <name>yarn.resourcemanager.cluster-id</name> <value>hayarn</value> </property> <property> <!--指定两个resourcemanager的名称--> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <!--指定rm1的主机--> <name>yarn.resourcemanager.hostname.rm1</name> <value>hd02</value> </property> <property> <!--指定rm2的主机--> <name>yarn.resourcemanager.hostname.rm2</name> <value>hd03</value> </property> <property> <!--配置zookeeper的地址--> <name>yarn.resourcemanager.zk-address</name> <value>hd01:2181,hd02:2181,hd03:2181</value> </property> <property> <!--开启yarn恢复机制--> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <!--配置执行resourcemanager恢复机制实现类--> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <property> <!--指定主resourcemanager的地址--> <name>yarn.resourcemanager.hostname</name> <value>hd03</value> </property> <property> <!--nodemanager获取数据的方式--> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <!--开启日志聚集功能--> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <!--配置日志保留7天--> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property> 7.配置slaves

?8.使用scp 拷贝hadoop260 到另外一台服务器上

scp -r soft/hadoop260/ root@hd02:/opt/soft/

scp -r soft/hadoop260/ root@hd03:/opt/soft/

9.为三台服务器节点配置hadoop环境变量 (vi /etc/profile) #hadoop export HADOOP_HOME=/opt/soft/hadoop260 export HADOOP_MAPRED_HOME=$HADOOP_HOME export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin export HADOOP_INSTALL=$HADOOP_HOME

10.启动集群?

第一次启动

1.启动zookeeper(三个都要) zkServer.sh start

启动成功验证方法:

使用jps命令查看进程 -- > 出现QuorumPeerMain这个进程名就算成功,具体图片如下:

2.启动JournalNode(3个都要) hadoop-daemon.sh start journalnode

启动成功验证方法:

使用jps命令查看进程 -- > 出现JournalNode这个进程名就算成功,具体图片如下:

3.格式化namenode(只在hadoop01上) hadoop namenode -format 或者 hdfs namenode -format

启动成功验证方法:

使用以上命令的时候会弹出大量内容。且无明显Error等关于报错的关键字,应该莫得问题

或者还有个方法,不过可靠性不高,使用cd命令

查看/opt/soft/hadoop260/dfs/namenode_data文件夹下是否存在current文件,当然格式化的时候,除了这里还会在其他文件夹下生成文件,可自行摸索。

4.将hd01上的Namenode的元数据复制到hd02相同位置 scp -r /opt/soft/hadoop260/dfs/namenode_data/current/ root@hd02:/opt/soft/hadoop260/dfs/namenode_data

启动成功验证方法:

hd01的成功样图?

hd02的成功样图

?5.在hd01或hd02格式化故障转移控制器zkfc hdfs zkfc -formatZK

启动成功验证方法:

在后面可以浏览页面的时候,将你的Leader进程使用kill命令杀死进程后,查看另外一个节点会不会称为Leader。

6.在hd01上启动dfs服务 start-dfs.sh 7.在hd03上启动yarn服务 start-yarn.sh 8.在hd01上启动yarn服务 mr-jobhistory-daemon.sh start historyserver 9.在hd02上启动resourcemanager服务 yarn-deamon.sh start resourcemanager (12)检查集群情况 1.jps上面服务不能缺少 2.查看状态 # 在hd01上查看服务状态 hdfs haadmin -getServiceState nn1 #active hdfs haadmin -getServiceState nn2 #standby # 在hd03上查看resourcemanager状态 yarn rmadmin -getServiceState rm1 #standby yarn rmadmin -getServiceState rm2 #active 3.检查主备切换 # kill 掉Namenode主节点 查看Namenode standby节点状态 kill -9 namenode主节点进程 # 恢复后重新加入 hadoop-deamon.sh start namenode #启动后也只是standby节点 (13)集群二次启动 #在hd01上启动dfs start-dfs.sh #在hd03上启动yarn start-yarn.sh #在hd02上启动resourcemanager yarn-daemon.sh start resourcemanager


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #分布式应用协调服务 #2 #一旦数据的状态发生变化 #zook