Apache Mesos 概述
Apache Mesos 是一款基于多资源调度的开源集群管理套件, 使容错和分布式系统更加容易使用实现, 采用 Master/Slave 结构简化设计, 将 Master 尽可能轻量级, 进保存了 Mesos Slave 的状态信息
常见集群管理工具
工具 | 特点 | 优势 |
---|---|---|
Apache Mesos | 需要独立部署 mesos-slave 进程;依赖 framework 的功能;可管理 docker 容器;成本较高 | 应为经过许多互联网公司的大规模实践,稳定性具有保障 |
Docker Swarm | Docker 官方群集工具,需要 Docker deamon 启用 tcp 端口学习;Swarm 的命令兼容 Docker;学习成本非常低 | 公有云环境 Machine 和 Swarm 搭配使用效率更高 |
Google Kubernetes | 完全 DOcker 化的管理工具,功能迭代非常快;群集管理能力比 mesos 稍差 | 功能模块集成度高 |
Apache Mesos 工作原理
请看下图:
Apache Mesos 配置实战
实验环境:
实验环境 | IP 地址 | 内核版本 3.10 以上 |
---|---|---|
master | 192.168.179.151 | 3.10.0-693.el7.x86_64 |
master1 | 192.168.179.158 | 3.10.0-693.el7.x86_64 |
master2 | 192.168.179.159 | 3.10.0-693.el7.x86_64 |
slave | 192.168.179.155 | 3.10.0-693.el7.x86_64 |
slave1 | 192.168.179.157 | 3.10.0-693.el7.x86_64 |
安装 Apache Mesos
1: 配置 Java 环境
- tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
- mv jdk1.8.0_91/ java
- # 在 / etc/profile 配置环境变量
- 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
2: 安装相关环境
(1) 安装开发开发工具
- // 安装开发工具
- yum groupinstall -y "Development Tools"
- # 有时候安装开发工具的时候会出现没有相关的软件包这时候要根据报错提示先安装相关依赖包
(2) 添加 Apache-maven 源
- // 添加 apache-maven 源
- 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 网络源
- // 配置 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
这里使用源代码方式编译安装 Mesos
- wget http://www.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
- ../configure
- make // 等待时间长 (在线状态)
- make check
- make install
配置多台 mesos-master
- # 修改主机名
- hostnamectl set-hostname master
- # 在 hosts 文件里面写入三台 master 两台 slave 的主机 IP 地址
- vim /etc/hosts
- 192.168.179.151 master
- 192.168.179.158 master1
- 192.168.179.159 master2
- 192.168.179.155 slave
- 192.168.179.157 slave1
- # 可以直接用 scp 远程复制其他四台服务器, 另外两台可以在 master 上复制虚拟机
- # 建立软连接
- ln -sf /root/mesos-0.25.0/build/bin/mesos-slave.sh /usr/sbin/mesos-slave
- # 安装 docker
- yum install docker -y
- systemctl start docker.servicev #运行
- systemctl enable docker.service #开机自启动
(1) 安装 Zookeeper
在三个 Mesos-master 节点上安装 Zookeeper
- tar zxvf zookeeper-3.4.6.tar.gz -C /home/q/
- cd zookeeper-3.4.6/
- mv conf/zoo_sample.cfg conf/zoo.cfg
- cd /home/q/zookeeper-3.4.6/conf
- vim zoo.cfg #修改 zoo.cfg 配置文件
- dataDir=/home/q/zookeeper-3.4.6/data // 修改位置
- dataLogDir=/home/q/zookeeper-3.4.6/datalog
- server.1=192.168.179.151:2888:3888
- server.2=192.168.179.158:2888:3888
- server.3=192.168.179.159:2888:3888
- // 在 master 主机上操作 (/opt/home/zookeeper-3.4.6 / 中)
- mkdir data datalog
- echo 1> data/myid
- cat data/myid
- # 按照 zoo.cfg 配置文件的 swerver1,2,3 修改每台 master 的 myid
- // 在 master1 主机上操作 (/opt/home/zookeeper-3.4.6 / 中)
- mkdir data datalog
- echo 2> data/myid
- cat data/myid
- // 在 master2 主机上操作 (/opt/home/zookeeper-3.4.6 / 中)
- mkdir data datalog
- echo 3> data/myid
- cat data/myid
- # 启动
- // 在 master 主机上启动服务
- ./bin/zkServer.sh start conf/zoo.cfg
- // 在 master1 主机上启动服务
- ./bin/zkServer.sh start conf/zoo.cfg
- // 在 master2 主机上启动服务
- ./bin/zkServer.sh start conf/zoo.cfg
- // 查看 leader
- ./bin/zkServer.sh status
查看 zookeeper 状态
在 zookeeper-3.4.6 低下用./bin/zkServer.sh status
启动 master 服务
先启动 leader 服务器上的 zookeeper, 这是采用双选举机制先 zookeeper 选举出个 leader 然后 mesos 第一台启动默认就是 leader
- //master2
- mesos-master --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.179.151:2181/mesos --quorum=2 &>/dev/null &
- //master
- mesos-master --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.179.158:2181/mesos --quorum=2 &>/dev/null &
- //master1
- mesos-master --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.179.159:2181/mesos --quorum=2 &>/dev/null &
启动 mesos-slave
- slave
- mesos-slave --containerizers="mesos,docker" --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --master=zk://192.168.179.151:2181,192.168.179.158:2181,192.168.179.159:2181/mesos --no-hostname_lookup --ip=0.0.0.0 &>/dev/null &
- slave1
- mesos-slave --containerizers="mesos,docker" --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --master=zk://192.168.179.151:2181,192.168.179.158:2181,192.168.179.159:2181/mesos --no-hostname_lookup --ip=0.0.0.0 &>/dev/null &
- slave2
- mesos-slave --containerizers="mesos,docker" --work_dir=/opt/home/mesos/data --log_dir=/opt/home/mesos/logs --master=zk://192.168.179.151:2181,192.168.179.158:2181,192.168.179.159:2181/mesos --no-hostname_lookup --ip=0.0.0.0 &>/dev/null &
部署 Marathon
- # 用 wget 下载 Marathon 安装包
- wget http://downloads.mesosphere.com/marathon/v0.15.2/marathon-0.15.2.tgz
- # 解压到 / opt/hone 目录底下
- tar zxvf marathon-0.15.2.tgz -C /opt/home
- # 开启服务指定 zk 地址池
- # 在 / opt/home/marathon-0.15.2 / 解压目录下开启
- master
- ./bin/start --hostname 192.168.179.158 --master zk://192.168.175.132:2181,192.168.179.159:2181,192.168.179.151:2181/mesos --http_address 0.0.0.0 &>/dev/null &
- master1
- ./bin/start --hostname 192.168.179.15 --master zk://192.168.175.132:2181,192.168.179.158:2181,192.168.179.151:2181/mesos --http_address 0.0.0.0 &>/dev/null &
- master2
- ./bin/start --hostname 192.168.179.151 --master zk://192.168.175.132:2181,192.168.179.159:2181,192.168.179.158:2181/mesos --http_address 0.0.0.0 &>/dev/null &
打开网页测试 Marathon 的端口号是 8080
建立 test 任务
查看 master 分配任务
执行过后在下面这个目录下
- /opt/home/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.175.152
- 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)
以下是 slave 操作
- // 在 slave1 中操作
- 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.175.132:8080/v2/apps -d@demo.json
------------ 再启动一台 slave2-------------------------
- hostnamectl set-hostname slave2
- vim /etc/hosts (所有主机同步)
- 192.168.175.132 master
- 192.168.175.150 master1
- 192.168.175.151 master2
- 192.168.175.152 slave
- 192.168.175.153 slave2
- ln -sf /root/mesos-0.25.0/build/bin/mesos-slave.sh /usr/sbin/mesos-slave
- yum install docker -y
- systemctl start docker.service
- systemctl enable docker.service
- // 启动完成会看到两台 slave 上线, 任务在两台 slave 中随机发布
- mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.175.132:2181,192.168.175.150:2181,192.168.175.151:2181/mesos --no-hostname_lookup --ip=0.0.0.0
----------------------- 使用 mesos 与 marathon 创建 docker 集群 -----------------------
- vim nginx.json
- {
- "id":"/nginx",
- "container":{
- "type":"DOCKER",
- "docker":{
- "image":"nginx",
- "network":"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.175.132:8080/v2/apps -d@nginx.json
- // 在任务发布指定的 slave 上使用命令 ps aux | grep docker 查看到 nginx 正在下载
- root 3668 0.0 0.6 121912 12872 pts/0 Sl+ 10:20 0:00 /usr/bin/docker-current -H unix:///var/run/docker.sock pull nginx:latest
- docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- docker.io/nginx latest c82521676580 3 weeks ago 109 MB
- docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 9940ac858a3b nginx "nginx -g'daemon ..." 3 minutes ago Up 3 minutes mesos-0d21cffd-8a12-450d-b6ff-4d4befcdaad0-S1.89e29728-37cb-4ea3-9518-2d9741ba7618
测试
http://192.168.175.153/
来源: http://blog.51cto.com/13645280/2162202