阅读了一些 Mesos 相关的文档后,尝试使用 Mesos,进行了一些测试。

本文所使用的架构是 Mesos 单节点的架构,没有 HA 功能,测试在虚拟机中进行。

测试架构

  • mesos-master * 1
  • mesos-slave * 2

测试过程主要遵循 http://mesos.apache.org/gettingstarted/,使用 CentOS 6.6 进行测试。

首先保证安装了 wget、tar。

Mesos 安装

  1. 下载 mesos:

    有两种下载方式:

    • Apache 上下载稳定版本,官方推荐这个方式,笔者也使用了这个方式:

        $ wget http://www.apache.org/dist/mesos/0.24.0/mesos-0.24.0.tar.gz
        $ tar -zxf mesos-0.24.0.tar.gz
      
    • git 仓库 下载,官方仅建议高级用户使用这个方法:

        $ git clone https://git-wip-us.apache.org/repos/asf/mesos.git
      
  2. 获取几个需要用的仓库:

     $ sudo wget -O /etc/yum.repos.d/slc6-devtoolset.repo http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo
     $ sudo wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
      
     # 添加 WANdisco SVN 仓库文件:
     $ sudo vi /etc/yum.repo.d/wandisco-svn.repo
      
     # 在文件中添加如下内容:
     [WANdiscoSVN]
     name=WANdisco SVN Repo 1.8
     enabled=1
     baseurl=http://opensource.wandisco.com/centos/6/svn-1.8/RPMS/$basearch/
     gpgcheck=1
     gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
    
  3. 安装所需要的开发工具套件 Development Tools

     $ sudo yum groupinstall -y "Development Tools"
    
  4. 安装 devtoolset-2-toolchain,它包括了 Mesos 所需要的 GCC 4.8.2 和其他相关的包:

     $ sudo yum install -y devtoolset-2-toolchain
    
  5. 安装 Mesos 的其他依赖:

     $ sudo yum install -y apache-maven python-devel java-1.7.0-openjdk-devel \
     zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel \
     cyrus-sasl-md5 apr-devel subversion-devel apr-util-devel
    
  6. 启用 devtoolset-2:

     $ scl enable devtoolset-2 bash
      
     # 确认 gcc++ 的版本大于 4.8,否则 configure 会失败
     $ g++ --version
     gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
     Copyright (C) 2013 Free Software Foundation, Inc.
     This is free software; see the source for copying conditions.  There is NO
     warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
  7. 切换到 mesos 目录下,使用 make 来安装 mesos:

     # 切换目录
     $ cd mesos-0.23.0
        
     # 执行 bootstrap:只有在从 git 仓库安装的情况下需要执行
     $ ./bootstrap
        
     # 创建 build 目录:
     $ mkdir build
     # 切换到 build/ 目录后,执行 configure:
     # cd build/
     # ../configure
        
     # 执行 make install 进行安装:
     # make install
     等待 ......
    

Master & Slave 的启动

启动 Master

  1. 进入 mesos 目录后,切换到 build/bin/ 目录:

     $ cd build/bin/
     $ ls
     gdb-mesos-local.sh   gdb-mesos-tests.sh    lldb-mesos-slave.sh   mesos-local.sh         mesos.sh              mesos-tests-flags.sh     valgrind-mesos-master.sh
     gdb-mesos-master.sh  lldb-mesos-local.sh   lldb-mesos-tests.sh   mesos-master-flags.sh  mesos-slave-flags.sh  mesos-tests.sh           valgrind-mesos-slave.sh
     gdb-mesos-slave.sh   lldb-mesos-master.sh  mesos-local-flags.sh  mesos-master.sh        mesos-slave.sh        valgrind-mesos-local.sh  valgrind-mesos-tests.sh
    
  2. 看到有很多可运行的 bash 脚本,其中,mesos-master.sh 就是启动 Master 的脚本,启动方式如下:

     $ ./mesos-master.sh --ip=192.168.5.51 --work_dir=/var/lib/mesos
     I1203 11:44:50.265260  1718 main.cpp:181] Build: 2015-08-31 16:41:23 by root
     I1203 11:44:50.265368  1718 main.cpp:183] Version: 0.23.0
     I1203 11:44:50.265743  1718 main.cpp:204] Using 'HierarchicalDRF' allocator
     I1203 11:44:50.887171  1718 leveldb.cpp:176] Opened db in 621.103576ms
     I1203 11:44:51.318090  1718 leveldb.cpp:183] Compacted db in 430.852714ms
     I1203 11:44:51.318253  1718 leveldb.cpp:198] Created db iterator in 63501ns
     I1203 11:44:51.318302  1718 leveldb.cpp:204] Seeked to beginning of db in 25666ns
     I1203 11:44:51.318949  1718 leveldb.cpp:273] Iterated through 3 keys in the db in 625003ns
     I1203 11:44:51.319116  1718 replica.cpp:744] Replica recovered with log positions 282609 -> 282610 with 0 holes and 0 unlearned
     I1203 11:44:51.347681  1762 recover.cpp:449] Starting replica recovery
     I1203 11:44:51.349642  1718 main.cpp:383] Starting Mesos master
     I1203 11:44:51.364735  1762 recover.cpp:475] Replica is in VOTING status
     I1203 11:44:51.364995  1761 recover.cpp:464] Recover process terminated
     I1203 11:44:51.476372  1718 master.cpp:368] Master 20151203-114451-856008896-5050-1718 (192.168.5.51) started on 192.168.5.51:5050
     ... ...(内容过多,不予显示)
    
  3. 在浏览器中可以打开 Mesos 的查看界面:

    Mesos 界面

    注:

    • 查看界面需要输入 5050 端口;
    • 该界面仅用于查看 Mesos Master, Framwork, Slave 的一些情况,是一个不可操作的界面。

这样,Master 就启动成功了。

启动 Slave

  1. 与启动 Master 相同,进入 mesos 目录后,切换至 build/bin/ 目录;
  2. 目录下有 mesos-slave.sh 脚本即启动 Slave 的脚本,启动方式如下:

     $ ./mesos-slave.sh --master=192.168.5.51:5050
     I1203 11:47:28.953408  1605 main.cpp:162] Build: 2015-08-31 16:41:23 by root
     I1203 11:47:28.953712  1605 main.cpp:164] Version: 0.23.0
     I1203 11:47:28.974297  1605 containerizer.cpp:111] Using isolation: posix/cpu,posix/mem
     I1203 11:47:38.992503  1605 main.cpp:249] Starting Mesos slave
     I1203 11:47:38.994990  1605 slave.cpp:190] Slave started on 1)@192.168.5.54:5051
     I1203 11:47:38.995136  1605 slave.cpp:191] Flags at startup: --authenticatee="crammd5" --cgroups_cpu_enable_pids_and_tids_count="false" --cgroups_enable_cfs="false" --cgroups_hierarchy="/sys/
     fs/cgroup" --cgroups_limit_swap="false" --cgroups_root="mesos" --container_disk_watch_interval="15secs" --containerizers="mesos" --default_role="*" --disk_watch_interval="1mins" --docker="doc
     ker" --docker_kill_orphans="true" --docker_remove_delay="6hrs" --docker_sandbox_directory="/mnt/mesos/sandbox" --docker_socket="/var/run/docker.sock" --docker_stop_timeout="0ns" --enforce_con
     tainer_disk_quota="false" --executor_registration_timeout="1mins" --executor_shutdown_grace_period="5secs" --fetcher_cache_dir="/tmp/mesos/fetch" --fetcher_cache_size="2GB" --frameworks_home=
     "" --gc_delay="1weeks" --gc_disk_headroom="0.1" --hadoop_home="" --help="false" --initialize_driver_logging="true" --isolation="posix/cpu,posix/mem" --launcher_dir="/home/mesos-0.23.0/build/s
     rc" --logbufsecs="0" --logging_level="INFO" --master="192.168.5.51:5050" --oversubscribed_resources_interval="15secs" --perf_duration="10secs" --perf_interval="1mins" --port="5051" --qos_corr
     ection_interval_min="0ns" --quiet="false" --recover="reconnect" --recovery_timeout="15mins" --registration_backoff_factor="1secs" --resource_monitoring_interval="1secs" --revocable_cpu_low_pr
     iority="true" --strict="true" --switch_user="true" --version="false" --work_dir="/tmp/mesos"
     I1203 11:47:38.998738  1605 slave.cpp:354] Slave resources: cpus(*):2; mem(*):2808; disk(*):45148; ports(*):[31000-32000]
     I1203 11:47:38.998942  1605 slave.cpp:384] Slave hostname: slave1
     I1203 11:47:38.998960  1605 slave.cpp:389] Slave checkpoint: true
     I1203 11:47:39.019840  1624 state.cpp:36] Recovering state from '/tmp/mesos/meta'
     I1203 11:47:39.020339  1621 status_update_manager.cpp:202] Recovering status update manager
     I1203 11:47:39.020711  1624 containerizer.cpp:316] Recovering containerizer
     I1203 11:47:39.023622  1627 slave.cpp:4026] Finished recovery
     I1203 11:47:39.025363  1627 slave.cpp:4179] Querying resource estimator for oversubscribable resources
     I1203 11:47:39.025823  1627 slave.cpp:684] New master detected at master@192.168.5.51:5050
     ... ...(内容过多,不予显示)
    
  3. 查看界面,看到 Slave 标签下,多了一台机器的信息:

    Mesos -- 添加一台 Slave

    注意:
    • 在启动 slave 时可能遇到如下错误: Failed to obtain the IP address for 'slave1'; the DNS service may not be able to resolve it: Temporary failure in name resolution
    • 其中 “slave1” 即该机器的主机名。此时,在 /etc/hosts 下写好对应的主机名和 IP 即可。
  4. 以相同的方式启动另一台 Slave,界面上看到添加一台新的 Slave:

    Mesos -- 添加第二台 Slave

到这里,Master 和 Slave 都启动好了,但是它们还什么都没做。