蚂蚁啃大象之zookeeper学习过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蚂蚁啃大象之zookeeper学习过程相关的知识,希望对你有一定的参考价值。

蚂蚁01啃大象:


# 本文作者-刘晓涛

# 创建时间:2016-1-26:22:30

# 完成时间:2016-1-27-23:11

# 我不比别人聪明,学习东西也慢,记忆力也好像降低了(奔三了),但我不能放弃学习止步不前!

# 写此文章,一 督促自己还有任务没有完成 二:记录学习过程,方便后期查找,加深记忆 三 共同交流探讨


要啃的大象:

(文章:“使用 Docker,7 个命令部署一个 Mesos 集群”。文章来源于Linux公社网站(www.linuxidc.com) 链接为:http://www.linuxidc.com/Linux/2015-06/118589.htm )


蚂蚁01:下文-all


本编文章的目的:

1 通过zookeeper的Dockerfile复习复习docker

2 通过zookeeper的Dockerfile学习zookeeper

该zookeeper镜像信息的地址为:

     https://registry.hub.docker.com/u/garland/zookeeper/

     https://github.com/sekka1/mesosphere-docker/tree/master/zookeeper

Dockerfile

======================================
# DOCKER-VERSION 1.0.1
# VERSION        0.5
# SOURCE         https://github.com/jplock/docker-zookeeper
FROM debian:jessie
MAINTAINER Justin Plock <[email protected]>
RUN apt-get update && apt-get install -y openjdk-7-jre-headless wget
RUN wget -q -O - http://apache.mirrors.pair.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz | tar -xzf - -C /opt     && mv /opt/zookeeper-3.4.6 /opt/zookeeper     && cp /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg     && mkdir -p /tmp/zookeeper
ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
ADD ./run.sh /opt/run.sh
RUN chmod 777 /opt/run.sh
EXPOSE 2181 2888 3888
WORKDIR /opt/zookeeper
VOLUME ["/opt/zookeeper/conf", "/tmp/zookeeper"]
CMD ["/opt/run.sh"]
=======================================

看到此Dockerfile第一眼:我擦,大便系统,没玩过啊,第二眼:没关系,类unix系统,原理通用。


大体一看:

  两个RUN命令,得知zookeeper的安装环境需要java和如何安装zookeeper

  EXPOSE命令,对外提供三个端口(之前看了一下zookeeper,大概知道zookeeper要三个端口)

  ADD命令:擦,加了运行脚本进去,啥脚本啊这是,待我搭好docker环境进入容器拷贝出来之后研究

  VOLUME:该命令我只记得是挂载,忘了是挂载 A-B了还是两个都对外挂载,等会创建容器后看看


  通过上面的大体一看,可以知道zookeeper如何大概安装运行,配置文件路径,对外提供那个端口服务(软件的原理都差不多:安装运行、配置文件、端口)


开始啃大象:

  指定目标:

1 构建一个Centos7的zookeeper镜像(基本照抄吧)

2 制作基于Centos7系统(非镜像)zookeeper的安装部署文档

3 尽可能的深入了解zookeeper的原理(zookeeper是什么?可以用来干什么?怎么干的?)

 如何去做:

1 先准备个干净的Centos7环境把zookeeper安装运行一下

2 在Centos7安装运行没问题了,可以考虑构建Dockerfile了

3 参考百度 谷歌 官方文档 理解zookeeper原理。(之前2步要是遇到问题,我也得去搜去问去解决,我又不是大神)

  (刚刚又突然冒出个想法:使用saltstack来安装zookeeper,自己给自己吓一跳,先算了吧,以后再说)


目标1-1 下载镜像,并运行(安装docker 略)

systemctl start docker

导入centos镜像(提前下载好了,不然网络下载太慢,建议翻墙或是用国外主机pull下来后自己保存着)

[[email protected] opt]# docker load < centos.tar.gz

 

下载上面文章的zookeeper镜像

docker pull garland/zookeeper


查看镜像:

[[email protected] local]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/centos              latest              60e65a8e4030        4 weeks ago         196.6 MB
docker.io/garland/zookeeper   latest              0e07387e8ab2        12 months ago       378.5 MB

下载完成后,使用该镜像运行容器

docker run -d -p 2181:2181 -p 2888:2888 -p 3888:3888 garland/zookeeper


查看运行的容器

[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                                                    NAMES
f09f7d3f100b        garland/zookeeper   "/opt/run.sh"       22 minutes ago      Up 22 minutes       0.0.0.0:2181->2181/tcp, 0.0.0.0:2888->2888/tcp, 0.0.0.0:3888->3888/tcp   lonely_tesla

进入容器,exit后,容器继续运行的脚本(本脚本来自老男孩教育-讲师找班长)

[[email protected] ~]# vim enter_doker.sh
#!/bin/bash
PID=`docker inspect --format "{{.State.Pid}}" $1`
nsenter -t $PID -u -i -n -p

进入容器:

[[email protected] ~]# ./enter_doker.sh f09f7d3f100b
[[email protected] ~]#

run.sh的内容:

=============================================================
#!/bin/sh
ZOO_CFG="/opt/zookeeper/conf/zoo.cfg"
# Output server ID
echo "server id (myid): ${SERVER_ID}"
echo "${SERVER_ID}" > /tmp/zookeeper/myid
# Add additional ZooKeeper servers into the zoo.cfg file
echo "${ADDITIONAL_ZOOKEEPER_1}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_2}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_3}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_4}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_5}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_6}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_7}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_8}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_9}" >> ${ZOO_CFG}
echo "${ADDITIONAL_ZOOKEEPER_10}" >> ${ZOO_CFG}
# Start Zookeeper
/opt/zookeeper/bin/zkServer.sh start-foreground
============================================================

看到此 有点懵,echo一大堆东西,不知道什么意思啊。

唯一看明白的是要想做zookeeper镜像,那么要让zookeeper运行在前台,参数就是start-foreground


先自己在centos7上搭建吧

cd /opt
wget http://apache.mirrors.pair.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 
tar -xzf zookeeper-3.4.6.tar.gz
mv zookeeper-3.4.6 zookeeper 
cp zookeeper/conf/zoo_sample.cfg zookeeper/conf/zoo.cfg
mkdir -p /tmp/zookeeper


配置文件详解:

zookeeper/conf/zoo_sample.cfg

tickTime=2000
# zookeeper服务端之间或是服务端与客户端(follower)之间维持心跳的时间间隔(毫秒)
initLimit=10
# 这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,
而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。
当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,
那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
syncLimit=5
# 这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度最长不能超过多少个 tickTime 的时间长度,
总的时间长度就是 2*2000=4 秒
dataDir=/tmp/zookeeper
# Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里
clientPort=2181
#这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
# the maximum number of client connections. increase this if you need to handle more clients
#maxClientCnxns=60
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#配置集群
server.1=192.168.56.21:2888:3888 
server.2=192.168.56.22:2888:3888
  # server.A=B:C:D
  其中 
    A 是一个数字,表示这个是第几号服务器;
    B 是这个服务器的 ip 地址;
    C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;
    D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。


    如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。


    除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。


完整的配置文件:

[[email protected] conf]# cd /opt/zookeeper/conf/
[[email protected] conf]# vim zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
clientPort=2181
server.1=192.168.56.21:2888:3888
server.2=192.168.56.22:2888:3888


运行服务:

[[email protected] ~]# /opt/zookeeper/bin/zkServer.sh start
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

查看状态:

[[email protected] ~]# /opt/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[[email protected] ~]# /usr/local/zookeeper-3.4.6/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader


zookeeper搭建完成,配置文件详解完成,原理可以看http://blog.csdn.net/qinglu000/article/details/23844359,很详细


基于centos的zookeeper镜像的Dockerfile构建:

# auther: liuxiaotao
# date: 2016-1-27
# version: 1.0
FROM centos
MAINTAINER liuxiaotao [email protected]
RUN yum update -y     && yum install -y java-1.7.0-openjdk java-1.7.0-openjdk-devel java-1.7.0-openjdk-headless
ADD zookeeper-3.4.6.tar.gz /usr/local/src/
# docker can zuto untar zhe *.tar.gz files 
RUN mv /usr/local/src/zookeeper-3.4.6 /usr/local/zookeeper
ADD zoo.cfg /usr/local/zookeeper/conf/
EXPOSE 2181 2888 3888
VOLUME ["/usr/local/zookeeper/conf", "/usr/local/zookeeper/data"]
CMD ["/usr/local/zookeeper/bin/zkServer.sh start-foreground"]

构建

docker build -t lezyo/zookepeer:v2 .


查看镜像:

[[email protected] docker]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
lezyo/zookepeer               v2                  cb3c2eb639ec        10 minutes ago      561.8 MB
lezyo/zookeeper               v1                  b83857ea996f        41 minutes ago      561.8 MB
<none>                        <none>              2d8697315524        44 minutes ago      523 MB
<none>                        <none>              898c41613f2f        45 minutes ago      523 MB
<none>                        <none>              e6ef1aaeb302        48 minutes ago      523 MB
docker.io/centos              latest              60e65a8e4030        4 weeks ago         196.6 MB
docker.io/garland/zookeeper   latest              0e07387e8ab2        12 months ago       378.5 MB

运行:

docker run -d -P lezyo/zookepeer:v2 /usr/local/zookeeper/bin/zkServer.sh start-foreground


运行成功,但是简陋了点,好了zookeeper先到这。啃下一个。

本文出自 “linux飞龙在天” 博客,请务必保留此出处http://xiaotaoge.blog.51cto.com/1462401/1739399

以上是关于蚂蚁啃大象之zookeeper学习过程的主要内容,如果未能解决你的问题,请参考以下文章

Zookeeper集群搭建详细过程 | 附带详细过程截图

Zookeeper集群搭建详细过程 | 附带详细过程截图

Hadoop学习笔记—14.ZooKeeper环境搭建

大象无形_虚幻引擎程序设计浅析pdf

深入JAVA虚拟机之运行时数据区

分布式管中窥豹之zookeeper小白学习启动zookeeper仲裁模式