部署Mesos+zookeeper+Marathon+Docker實戰
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實戰