螞蟻啃大象之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下來後自己保存着)

[root@linux-node1 opt]# docker load < centos.tar.gz

 

下載上面文章的zookeeper鏡像

docker pull garland/zookeeper


查看鏡像:

[root@linux-node1 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


查看運行的容器

[root@linux-node1 ~]# 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後,容器繼續運行的腳本(本腳本來自老男孩教育-講師找班長)

[root@linux-node1 ~]# vim enter_doker.sh
#!/bin/bash
PID=`docker inspect --format "``.`State`.`Pid`" $1`
nsenter -t $PID -u -i -n -p

進入容器:

[root@linux-node1 ~]# ./enter_doker.sh f09f7d3f100b
[root@f09f7d3f100b ~]#

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。


完整的配置文件:

[root@linux-node1 conf]# cd /opt/zookeeper/conf/
[root@linux-node1 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


運行服務:

[root@linux-node1 ~]# /opt/zookeeper/bin/zkServer.sh start
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

查看狀態:

[root@linux-node1 ~]# /opt/zookeeper/bin/zkServer.sh status
JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@linux-node2 ~]# /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 .


查看鏡像:

[root@linux-node1 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先到這。啃下一個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章