Mesos概述
Apache Mesos 是一款基於多資源(內存、CPU、磁盤、端口等)調度的開源集羣管理套件,能使容錯和分佈式系統更加容易使用。其採用了Master/Slave結構來簡化設計,將Master做的儘可能輕量級,僅保存了各種計算框架(Framwork)和Mesos Slave的狀態信息,這些狀態很容易在Mesos出現故障時被重構,所以使用zookeeper解決master單點故障問題。
Mesos工作原理
Mesos Master充當全局資源調度器角色,採用某種策略算法將某個Save
上的空閒資源分配給某個Famework,而各種Framework則是通過自己的調度器向master註冊進行接入,master slave則是收集任務狀態和啓動各個Framework的Executor。其架構圖如下:
基本術語:
- Mesos master: 負責管理各個Framework和Slave,並將Slave 上的資源分配給各個Framework。
- Mesos Slave:負責管理本節點上的各個Mesos Task,爲各個Executor分配資源。
- Framework:計算框架,如:Hadoop、Spark等,可以通過MesosSchedulerDiver接入Mesos。
- Executor:執行器,在Mesos Slave上安裝,用於啓動計算框架中的Task。
Zookeeper概述
ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。其中Master 選舉可以說是 ZooKeeper 最典型的應用場景了。生產環境中Zookeeper是以宕機個數過半來讓整個集羣宕機的,所以master至少三個節點。
Marathon
Marathon是一個Mesos框架,能夠支持運行長服務,比如web應用等。是集羣的分佈式Init.d,能夠原樣運行任何Linux二進制發佈版本,如Tomcat Play等等,可以集羣的多進程管理。也是一種私有的Pass,實現服務的發現,爲部署提供提供REST API服務,有授權和SSL、配置約束,通過HAProxy實現服務發現和負載平衡。
配置搭建docker集羣管理平臺
版本內核需要3.10以上
cat /etc/redhat-release //查看Linux版本
uname -r //查看內核版本(需要內核3.10以上)
環境如下所示:
主機 | IP地址 | 安裝軟件包 |
---|---|---|
master | 192.168.26.150 | jdk-8u91-linux-x64.tar.gz/mesos-0.25.0.tar.gz/zookeeper-3.4.10.tar.gz/ marathon-0.15.2.tgz |
master1 | 192.168.26.139 | jdk-8u91-linux-x64.tar.gz/ mesos-0.25.0.tar.gz /zookeeper-3.4.10.tar.gz |
master2 | 192.168.26.140 | jdk-8u91-linux-x64.tar.gz/mesos-0.25.0.tar.gz/zookeeper-3.4.10.tar.gz |
slave | 192.168.26.141 | jdk-8u91-linux-x64.tar.gz/mesos-0.25.0.tar.gz/docker |
slave1 | 192.168.26.142 | jdk-8u91-linux-x64.tar.gz/mesos-0.25.0.tar.gz/docker |
步驟如下所示:
一、安裝Mesos
關閉所有主機的防火牆和安全性策略
systemctl stop firewalld.service
systemctl disable firewalld.service
setenforce 0
1.配置JAVA環境
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
source /etc/profile
2.安裝相關環境
(1)安裝開發工具
yum groupinstall -y "Development Tools"
(2)添加apache-maven源
爲Mesos提供項目管理和構建自動化工具的支持
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
(3)安裝相關依賴包
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
(4)配置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
3.配置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
4.構建Mesos
tar zxvf mesos-0.25.0.tar.gz -C /opt/
mv /opt/mesos-0.25.0/ /root/
cd /root/mesos-0.25.0
mkdir build
cd build
../configure
make //等待時間長(在線狀態)
make check
make install
二、 配置Mesos-master(三臺配置一樣)
1.規劃master主機名
Mesos-master負責維護slave集羣的心跳,從salve提取資源信息,配置之前做好相應的解析工作。
hostnamectl set-hostname master #修改相應的主機名
vim /etc/hosts #修改hosts文件
192.168.26.131 master
192.168.26.139 master1
192.168.26.140 master2
192.168.26.141 slave
192.168.26.142 slave1
ln -sf /root/mesos-0.25.0/build/bin/mesos-master.sh /usr/sbin/mesos-master
2.啓動mesos-master
mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0
參數:
--work_dir:運行期數據存放路徑,包含sandbox、slavemeta等信息
--log_dir:Mesos日誌存放路徑
--[no-]hostname_lookup: 是否從DNS獲取主機名,本例中關閉了此配置,直接顯示IP。
--ip: Mesos進程綁定的IP。
3.配置完成後打開另一個終端使用瀏覽器訪問本地的5050端口
http://l92.168.26.150:5050
三、配置Mesos-slave(兩臺配置一樣)
1.規劃slave主機名
Mesos-slave負責接收並執行來自Mesos-master傳遞的任務以及監控任務狀態,收集任務使用系統的情況,配置之前做好解析工作。
hostnamectl set-hostname slave
vim /etc/hosts #修改hosts文件
192.168.26.150 master
192.168.26.139 master1
192.168.26.140 master2
192.168.26.141 slave
192.168.26.142 slave1
ln -sf /root/mesos-0.25.0/build/bin/mesos-slave.sh /usr/sbin/mesos-slave #創建鏈接文件
2.安裝並啓動docker
yum install docker -y
systemctl start docker.service
systemctl enable docker.service
注意docker服務啓動失敗,解決方案請參考博客http://blog.51cto.com/11134648/2162785。
3.啓動Mesos-slave服務
mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=192.168.26.148:5050 --no-hostname_lookup --ip=0.0.0.0
注意當啓動失敗時,有可能鏈接文件沒有生效,使用如下命令
cd /root/mesos-0.25.0/build/bin/
./mesos-slave.sh --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=192.168.26.150:5050 --no-hostname_lookup --ip=0.0.0.0
4.查看slave狀態
使用瀏覽器再次對master的5050端口進行訪問
http://:192.168.26.150:5050
四、安裝Zookeeper
1.分別在所有的master節點上安裝Zookeeper
wget http://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
2.修改Zookeeper的配置文件
以server.A=B:C:D 格式定義各個節點的相關信息,其中A是一個數字,表示第幾號服務器;B是這個服務器的IP地址;C爲與集羣中的Leader服務器交換信息的端口;D是在leader掛掉時專門進行Leader選舉時所用的端口。
cd /home/q/zookeeper-3.4.10/conf
vim zoo.cfg
dataDir=/home/q/zookeeper-3.4.10/data //重新定義Datadir的位置
dataLogDir=/home/q/zookeeper-3.4.10/datalog
server.1=192.168.26.150:2888:3888
server.2=192.168.26.139:2888:3888
server.3=192.168.26.140:2888:3888
3.修改完的配置文件拷貝給其他master主機
scp zoo.cfg 192.168.26.139:/home/q/zookeeper-3.4.10/conf/
scp zoo.cfg 192.168.26.140:/home/q/zookeeper-3.4.10/conf/
4.在dataDir路徑下創建一個myid文件
master主機上(/home/q/zookeeper-3.4.10/)
mkdir data datalog
echo 1 > data/myid
cat data/myid
master1主機上(/home/q/zookeeper-3.4.10/)
mkdir data datalog
echo 2 > data/myid
cat data/myid
master2主機上(/home/q/zookeeper-3.4.10/)
mkdir data datalog
echo 3 > data/myid
cat data/myid
5.分別在各master節點上啓動Zookeeper服務
master主機
./bin/zkServer.sh start conf/zoo.cfg
master1主機
./bin/zkServer.sh start conf/zoo.cfg
master2主機
./bin/zkServer.sh start conf/zoo.cfg
6.查看主機狀態
./bin/zkServer.sh status
7.分別啓動Mesos-master
注意先kill掉之前啓動的Mesos-master進程
master主機
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.26.150:2181/mesos --quorum=2
master1主機
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.26.139:2181/mesos --quorum=2
master2主機
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.26.140:2181/mesos --quorum=2
8.啓動Mesos-slave
注意先kill掉之前啓動的Mesos-master進程
mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.26.150:2181,192.168.26.139:2181,192.168.26.140:2181/mesos --no-hostname_lookup --ip=0.0.0.0
注意當啓動失敗時,,有可能鏈接文件沒有生效,使用如下命令
cd /root/mesos-0.25.0/build/bin/
./mesos-slave.sh --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.26.150:2181,192.168.26.139:2181,192.168.26.140:2181/mesos --no-hostname_lookup --ip=0.0.0.0
9.使用瀏覽器指定任意Mesos-master地址的5050端口驗證
http://192.168.26.140:5050
若指定的是非Leader狀態下的Mesos-master地址,頁面會自行跳轉至處於leader狀態的Mesos-master地址。
五、在master主機上部署運行Marathon
使用Marathon向Mesos發送任務。
1.安裝並啓動Marathon
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.26.150 --master zk://192.168.26.150:2181,192.168.26.139:2181,192.168.26.140:2181/mesos --http_address 0.0.0.0 //將Marathon安裝到多Mesos-master環境的master主機上
2.訪問Marathon(默認使用8080端口)
http://192.168.26.150:8080/
3.使用Marathon創建測試任務
(1)在首頁點擊Create按鈕,創建一個測試任務echo “hello world”
(2)創建成功以後在applications頁面可以看到該任務
Marathon會自動註冊到Mesos中,可以在Mesos web的Framework頁面中看到註冊信息。
可以在Mesos Web首頁看到測試任務在不停的執行中
(4)在節點slave主機查看任務的相關信息
(5)刪除測試任務
4.使用Marathon API的形式添加新任務
在節點slave中操作
cd /root
vim demo.json
{
"id":"basic-0",
"cmd":"while [true]; do echo 'hello Marathon'; sleep 5; done",
"cpus":0.1,
"mem":10.0,
"instances":1
}
//查看Marathon網站有新添加任務
curl -X POST -H "Content-type:application/json" http://192.168.26.150:8080/v2/apps [email protected]
5.使用Mesos與Marathon創建Docker集羣
(1)在節點slave創建docker的nginx請求任務
cd /root
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
}
//查看Marathon網站有新添加任務
curl -X POST -H "Content-type:application/json" http://192.168.26.150:8080/v2/apps [email protected]
(2)在Marathon頁面查看
可以在創建的Nginxd任務下看到該任務發送給主機
(3)用命令行方式查看主機下載的docker鏡像
docker images
docker ps -a
(4)訪問slave主機上運行着的Nginx服務
http://192.168.26.141