1. 程式人生 > >部署Mesos+zookeeper+Marathon+Docker實戰

部署Mesos+zookeeper+Marathon+Docker實戰

結果 executor disco client lower key 伸縮 python 開發

Mesos是什麽?

Mesos是Apache下的開源分布式資源管理框架,它被稱為是分布式系統的內核。Mesos能夠在同樣的集群機器上運行多種分布式系統類型,更加動態有效率低共享資源。提供失敗偵測,任務發布,任務跟蹤,任務監控,低層次資源管理和細粒度的資源共享,可以擴展伸縮到數千個節點。Mesos已經被Twitter用來管理它們的數據中心。
?
Mesos中的基本術語解釋:

1)Mesos-master:主要負責管理各個framework和slave,並將slave上的資源分配給各個framework
2)Mesos-slave:負責管理本節點上的各個mesos-task,比如:為各個executor分配資源

3)Framework:計算框架,如:Hadoop,Spark等,通過MesosSchedulerDiver接入Mesos
4)Executor:執行器,安裝到mesos-slave上,用於啟動計算框架中的task。

Zookeeper是什麽?

ZooKeeper是用來給集群服務維護配置信息,域名服務,提供分布式同步和提供組服務。所有這些類型的服務都使用某種形式的分布式應用程序。ZooKeeper是一個分布式的,開放源碼的協調服務,是的Chubby一個的實現,是Hadoop和Hbase的重要組件。

?
ZooKeeper角色:

領導者(leader):領導者負責投票發起和決議,更新系統狀態
跟隨者(follwoer):follower用於接收客戶請求並向客戶端返回結果,在選主過程中參與投票

觀察者:ObServer可以接受客戶端連接,將寫請求轉發給leader節點,但ObServer不參加投票過程,只同步leader的狀態,ObServer的目的是為了拓展系統,提高讀取速度。
客戶端:請求發起方

?
ZooKeeper同步流程:

選完leader以後,zookeeper就進入狀態同步過程。
1)leader等待server連接;
2)Follower連接leader,將最大的zxid發送給leader;
3)Leader根據follower的zxid確定同步點;
4)完成同步後通知follower 已經成為uptodate狀態;
5)Follower收到uptodate消息後,又可以重新接受client的請求進行服務了。

  • 配置JAVA環境

    # cat /etc/redhat-release   //查看Linux版本
    # uname -r   //查看內核版本(需要內核3.10以上)
    # tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
    # cd  /usr/local/
    # mv jdk1.8.0_91/ java
    # vim /etc/profile
    export JAVA_HOME=/usr/local/java
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
  • 添加apache-maven源

    # wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
  • 配置WANdiscoSVN網絡源

    # vim /etc/yum.repos.d/wandisco-svn.repo
    [WANdiscoSVN]
    name=WANdisco SVN Repo 1.9
    enabled=1
    baseurl=http://opensource.wandisco.com/centos/7/svn-1.9/RPMS/$basearch/
    gpgcheck=1
    gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
  • 配置Mesos環境變量

    # vim /etc/profile
    export MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/libmesos.so
    export MESOS_NATIVE_LIBRARY=/usr/local/lib/libmesos.so
    # source /etc/profile
  • 添加依賴包

    # yum install -y apache-maven python-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel apr-util-devel subversion-devel
  • 安裝開發工具

    # yum groupinstall -y "Development Tools"
  • 構建Mesos

    # wget http://archive.apache.org/dist/mesos/0.25.0/mesos-0.25.0.tar.gz 
    # tar zxvf mesos-0.25.0.tar.gz -C /opt/
    # mv mesos-0.25.0/ /root/
    # cd /root/mesos-0.25.0
    # mkdir build
    # cd build
    # ../configure
    
    # make              //等待時間長  且不能斷網 前面的環境包不能少
    # make check
    # make install    

    由於安裝時間太長 此處直接克隆四臺

技術分享圖片

?
?

部署Mesos+zookeeper+Marathon+Docker

技術分享圖片

Column 1 Column 2 Column 3
master1 192.168.200.128 jdk、mesos、zookeeper、marathon
master2 192.168.200.137 jdk、mesos、zookeeper、
master3 192.168.200.138 jdk、mesos、zookeeper、
slave1 192.168.200.139 jdk、mesos、zookeeper、docker
slave2 192.168.200.140 jdk、mesos、zookeeper、docker

?

  • 分別給主機命名

    # hostnamectl set-hostname master1 (其他四臺: maste2、 maste3、slave1、slave2)
    # bash
    
    # vim /etc/hosts    (所有主機同步)
    192.168.200.128 master1
    192.168.200.137 master2
    192.168.200.138 master3
    192.168.200.139 slave1
    192.168.200.140 slave2
  • 所有master

    # wget https://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
    # tar zxvf zookeeper-3.4.10.tar.gz -C /home/q/
    # cd /home/q/zookeeper-3.4.10/
    # mv conf/zoo_sample.cfg conf/zoo.cfg
  • 在master1中操作

    # cd /home/q/zookeeper-3.4.10/conf
    # vim zoo.cfg 
     dataDir=/home/q/zookeeper-3.4.10/data   //修改位置
     dataLogDir=/home/q/zookeeper-3.4.10/datalog
     server.1=192.168.200.128:2888:3888
     server.2=192.168.200.137:2888:3888
     server.3=192.168.200.138:2888:3888
    //把配置文件傳輸給其他maste
    # scp zoo.cfg 192.168.200.137:/home/q/zookeeper-3.4.10/conf/
    # scp zoo.cfg 192.168.200.138:/home/q/zookeeper-3.4.10/conf/
  • 在master1主機上操作(/home/q/zookeeper-3.4.10/中)

    # mkdir data datalog 
    # echo 1 > data/myid
    # ./bin/zkServer.sh start conf/zoo.cfg    //開啟zookeeper服務
    # mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.200.128:2181/mesos --quorum=2
    //啟動mesos
  • 在master2主機上操作(/home/q/zookeeper-3.4.10/中)

    # mkdir data datalog 
    # echo 2 > data/myid
    # ./bin/zkServer.sh start conf/zoo.cfg    //開啟服務
    # mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.200.137:2181/mesos --quorum=2
  • 在master3主機上操作(/home/q/zookeeper-3.4.10/中)

    # mkdir data datalog 
    # echo 3 > data/myid
    # ./bin/zkServer.sh start conf/zoo.cfg    //開啟服務
    # mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.200.138:2181/mesos --quorum=2

?

  • slave1、slave2 上操作
  • 安裝docker並且啟動

    # yum install docker -y
    # systemctl start docker.service
    # systemctl enable docker.service
    //開啟slave-mesos 
    # ln -sf /root/mesos-0.25.0/build/bin/mesos-slave.sh /usr/sbin/mesos-slave
    # mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.200.128:2181,192.168.200.137:2181,192.168.200.138:2181/mesos --no-hostname_lookup --ip=0.0.0.0
  • 在master上查看leader
  • 然後在瀏覽器輸入任意master的IP+端口5050
  • 會自動跳轉到被指定為leader的主機IP上去

    # cd /home/q/zookeeper-3.4.10/
    # ./bin/zkServer.sh status

?技術分享圖片技術分享圖片
?
?

  • 在master1上 部署運行marathon

Marathon是一個成熟的,輕量級的,擴展性很強的Apache Mesos的容器編排框架,它主要用來調度和運行常駐服務(long-running service),提供了友好的界面和Rest API來創建和管理應用。marathon是一個mesos框架,能夠支持運行長服務,比如web應用等,它是集群的分布式Init.d,能夠原樣運行任何Linux二進制發布版本,如Tomcat Play等等,可以集群的多進程管理。也是一種私有的Pass,實現服務的發現,為部署提供提供REST API服務,有授權和SSL、配置約束,通過HAProxy實現服務發現和負載平衡。

    # wget http://downloads.mesosphere.com/marathon/v0.15.2/marathon-0.15.2.tgz
    # tar zxvf marathon-0.15.2.tgz -C /home/q/
    # cd /home/q/marathon-0.15.2/
    # ./bin/start --hostname 192.168.200.128 --master zk://192.168.200.128:2181,192.168.200.137:2181,192.168.200.138:2181/mesos --http_address 0.0.0.0
  • 測試

    瀏覽器輸入:http://192.168.200.128:8080/
    創建一個test的任務
    然後去mesos網頁查看:http://192.168.200.128:5050/
    可以看到任務已經分配給slave1 和slave2

技術分享圖片技術分享圖片技術分享圖片

  • 查看執行事件相關信息

    # cd /home/q/mesos/data/slaves/7cc2e8e7-ad03-46a6-a38d-ae1b92c78319-S0/frameworks/d82f2603-f357-4025-9574-7c511c0f435e-0000/executors
    # cd test.f99a7592-a099-11e8-a6b5-52540011572d/runs/latest
    //標準錯誤和標準輸出信息
    stderr  stdout
    //查看輸出字符串
    cat stdout
    ---------------顯示以下內容---------------------------
    Registered executor on 192.168.200.138
    Starting task test.f99a7592-a099-11e8-a6b5-52540011572d
    sh -c ‘echo "hello world"‘
    hello world
    Forked command at 3493
    Command exited with status 0 (pid: 3493)

?
?

使用mesos與marathon創建docker集群

    # vim nginx.json
    {
    "id":"/nginx",                               //應用的唯一ID
    "container":{                              //marathon啟動docker格式
    "type":"DOCKER",
    "docker":{
    "image":"nginx",                       //nginx鏡像
    "network":"HOST",                  //網絡為HOST模式
    "parameters":[],
    "privileged":false,
    "forcePullImage":false          //是否強制更新鏡像
    }
    },
    "cpus":0.1,
    "mem":32.0,
    "instances":1
    }
    # curl -X POST -H "Content-type:application/json" http://192.168.200.128:8080/v2/apps [email protected]    //發送json文件給marathon

技術分享圖片

?
?

  • 在任務發布指定的slave上使用命令 ps aux | grep docker 查看到nginx正在下載

下載完成後
輸入鏡像下載完成的slave 地址: 192.168.200.139
?

技術分享圖片
技術分享圖片
技術分享圖片 技術分享圖片

部署Mesos+zookeeper+Marathon+Docker實戰