目录
hadoop HA参照:https://blog.csdn.net/qq_36632174/article/details/79794754
简述
zookeeper是Google的Chubby一个开源的实现。它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
zookeeper重在协调,是分布式服务的一个基础;要构建hadoop离线分析,首先要安装zookeeper。
zookeeper安装
安装包:zookeeper-3.4.11.tar.gz
选择版本:zookeeper--release 3.4.11,修复了53个问题,支持Java9,2017-11月9日发布
1)zookeeper安装包放到:/usr/software/zookeeper-3.4.11.tar.gz目录下,解压:
tar -zxvf zookeeper-3.4.11.tar.gz
cd zookeeper-3.4.11/conf
拷贝 cp zoo_sample.cfg 改名成 zoo.cfg
cp -r zoo_sample.cfg zoo.cfg
2)创建data目录:the directory where the snapshot is stored。快照存储地点。
mkdir /usr/software/zookeeper-3.4.11/data
创建log路径:mkdir /usr/software/zookeeper-3.4.11/logs
3)修改zoo.cfg文件:vim zoo.cfg
tickTime=2000
initLimit=10
ZooKeeper集群模式下包含多个zk进程,其中一个进程为leader,余下的进程为follower。
当follower最初与leader建立连接时,它们之间会传输相当多的数据,尤其是follower的数据落后leader很多。
initLimit配置follower与leader之间建立连接后进行同步的最长时间。
syncLimit=5 #配置follower和leader之间发送消息,请求和应答的最大时间长度。
dataDir=/usr/software/zookeeper-3.4.11/data
dataLogDir=/usr/software/zookeeper-3.4.11/logs
clientPort=2181
#server.id=host:port1:port2
server.1=hadoop01:2888:3888 #其中id为一个数字,表示zk进程的id,这个id也是dataDir目录下myid文件的内容。
server.2=hadoop02:2888:3888 #host是该zk进程所在的IP地址,
server.3=hadoop03:2888:3888 #port1表示follower和leader交换消息所使用的端口,
server.4=hadoop04:2888:3888 #port2表示选举leader所使用的端口。
server.5=hadoop05:2888:3888
4)在data目录下创建myid文件并添加内容为1
cd /usr/software/zookeeper-3.4.11/data
echo 1 > myid
根据以上步骤在hadoop02~hadoop05节点安装好zookeeper
注:hadoop02节点上的myid内容为2,hadoop03节点上的myid内容为3。
echo 2 > myid
5)启动zookeeper集群
/usr/software/zookeeper-3.4.11/bin/./zkServer.sh start
/usr/software/zookeeper-3.4.11/bin/./zkServer.sh stop
/usr/software/zookeeper-3.4.11/bin/./zkServer.sh restart
/usr/software/zookeeper-3.4.11/bin/./zkServer.sh status
启动之后查看
hadoop01
hadoop02
hadoop03
hadoop04
hadoop05
6)设置开机自启
第一种方法:直接修改/etc/rc.local文件
在/etc/rc.local文件中需要输入两行,其中export JAVA_HOME=/usr/java/jdk1.8.0_112是必须要有的,
否则开机启动不成功,大家根据自己JDK安装的位置自行更改。另一行/usr/software/zookeeper-3.4.11/bin/zkServer.sh start
则是我们zookeeper的启动命令。配置好之后,重启虚拟机,会发现已经可以开机自启了。
第二种方法:把zookeeper做成服务
1、进入到/etc/init.d目录下,新建一个zookeeper脚本
touch zookeeper
2、添加执行权限:chmod +x zookeeper
3、使用命令vim zookeeper进行编辑
在脚本中输入如下内容,其中同上面注意事项一样要添加export JAVA_HOME=//usr/java/jdk1.8.0_112这一行,否则无法正常启动。
#!/bin/bash
#chkconfig:2345 20 90
#description:zookeeper
#processname:zookeeper
export JAVA_HOME=//usr/java/jdk1.8.0_112
case $1 in
start) su root /usr/local/zookeeper-3.4.5/bin/zkServer.sh start;;
stop) su root /usr/local/zookeeper-3.4.5/bin/zkServer.sh stop;;
status) su root /usr/local/zookeeper-3.4.5/bin/zkServer.sh status;;
restart) su /usr/local/zookeeper-3.4.5/bin/zkServer.sh restart;;
*) echo "require start|stop|status|restart" ;;
esac
4、使用service zookeeper start/stop命令来尝试启动关闭zookeeper,使用service zookeeper status查看zookeeper状态。
5、添加到开机自启
chkconfig --add zookeeper
zookeeper 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
chkconfig --list 查看所有服务
本次实验采取第一种方法
如果zookeeper,服务器重启需要按照一定次序重启,否则容易出现连接不上错误·
zookeeper启动原理
QuorumPeerMain是zookeeper集群的启动入口类,是用来加载配置启动QuorumPeer线程的。
QuorumPeer,谷歌翻译quorum是法定人数,定额的意思,peer是对等的意思,那么QuorumPeer中quorum代表的意思就是每个zookeeper集群启动的时候集群中zookeeper服务数量就已经确定了,zookeeper是基于paxos算法实现的,那是一个唯一的分布式集群一致性算法,在zookeeper中将这一算法演绎为集群分布式协调可持续服务。在每个zookeeper的配置文件中配置集群中的所有机器配置中每个server.X记录代表集群中的一个服务,QuorumPeerConfig会构建一个QuorumServer对象,其中的server.X中的X代表zookpeer的sid,每个zookeeper都会编辑自己的sid在dataDir目下的myid文件中,sid标记每个服务,在快速选举中起作用。所以对这个进程不应该陌生,如果你要关闭,就直接zkServer.sh stop 就可以了。
1.通过zkServer.sh启动zookeeper时,正常指定的QuorumPeerMain作为启动主类。
2.QuorumPeerMain执行main方法,里面主要逻辑是执行initializeAndRun方法。
public static void main(String[] args) {
QuorumPeerMain main = new QuorumPeerMain();
try {
main.initializeAndRun(args);
....
}
3.initializeAndRun方法
(1)通过QuorumPeerConfig.parse方法,解析配置文件
(2)通过DatadirCleanupManager.start方法,启动清除调度任务
(3)runFromConfig或ZooKeeperServerMain.main来启动zookkeeper
protected void initializeAndRun(String[] args)
throws ConfigException, IOException, AdminServerException
{
QuorumPeerConfig config = new QuorumPeerConfig();
if (args.length == 1) {//如果指定的配置文件
config.parse(args[0]);//解析配置文件
}
// Start and schedule the the purge task
//启动安排清除任务
DatadirCleanupManager purgeMgr = new DatadirCleanupManager(config
.getDataDir(), config.getDataLogDir(), config
.getSnapRetainCount(), config.getPurgeInterval());
purgeMgr.start();
if (args.length == 1 && config.isDistributed()) {
runFromConfig(config);//启动zookeepeer集群
} else {
LOG.warn("Either no config or no quorum defined in config, running "
+ " in standalone mode");
// there is only server in the quorum -- run as standalone
ZooKeeperServerMain.main(args);
}
}
来源:CSDN
作者:戰士
链接:https://blog.csdn.net/qq_36632174/article/details/103323393