Chef的基本架构
Chef是一个C/S架构的分布式软件配置管理工具。
Chef架构(源自https://wiki.opscode.com/display/chef10/Architecture+Introduction)
Chef Server存储配置各个节点所需的所有信息,以REST API接口提供服务,Chef Nodes是指那些安装了chef-client的节点,chef-client主要用于与Chef Server通信,获取各自的runlist和recipes,进行相应的软件安装、配置和启动工作。
Chef通过Cookbook的方式进行软件配置,每一个Chef Cookbook定义了如何去配置某一个特定service或app,整个配置过程可能被定义为多个step,每一个step称为一个recipe,Cookbook需要上传到Chef Server由其进行统一管理。
Chef还需要为Cookbook定义相应的role,一个role有一个定义recipe执行顺序的runlist。每一个Chef Client可能需要安装若干个role,运行时由chef-client进程与ChefServer通信,获得每一个role对应的runlist,并根据runlist下载相应的Cookbooks,依次执行各个recipe以实现某个service/app的安装配置。
在recipe中有一个关键部分叫做resource,每一种resource定义一种特定的软件配置,譬如rpm的安装,用户/组的创建管理,目录的创建管理,service的启动/停止等等,每一个resource对应一个provider。开发recipe时可以按需求使用相应的resource,chef-client会由相应的provider来完成每一个resource的工作。关于Chef的resource可进一步参考https://docs.opscode.com/resource.html。
关于Chef的基本概念和教程可进一步参考https://learnchef.opscode.com。
Chef的各个组件及其工作机制
Chef的架构中主要包括Chef Server, CouchDB, RabbitMQ, ChefExpander/Indexer, Solr, Chef Client, Knife等。
Chef组件(源自https://wiki.opscode.com/display/chef10/Architecture)
Chef Server使用CouchDB存储其所有信息,使用Solr提供Search功能,当有数据更新时,Chef Server会更新CouchDB中对应的document,并将数据通过RabbitMQ传递给chef-expander,由其调度更新到Solr中。
当Chef Server接收到一个搜索请求时,Chef Server先调用Solr的Rest API得到搜索结果,即所有符合请求条件的document的ID,在根据该ID到CouchDB中获取每一个document全文返回给客户端。
Knife是Chef提供的一个命令行工具,用于与Chef Server进行通信,Chef的所有功能都可以通过knife来操作。
vSphere Big Data Extensions是如何使用Chef的
在vSphere Big Data Extensions(BDE)或Serengeti中,Chef Server和WorkStation被安装在Management Server中,chef-client被预装在Serengeti部署出的虚拟机中。
Serengeti安装好以后,在Management Server中已经配置好了Chef Server,并为其配置好了Serengeti所开发的各种roles和相应的cookbook,用户在创建cluster的时候需要为每个nodegroup指定相应的roles,当虚拟机创建完成以后,Serengeti Web Service收集虚拟机的硬件信息和用户定义好的cluster配置,通过thriftservice发送给Ironfan,Ironfan负责与Chef Server交互,在ChefServer上创建各个Node和Role信息,***启动每个node上的chef-client,通过ChefServer获取各自的roles和runlist,并下载相应的Cookbook进行软件的安装配置。
关于Serengeti,ChefServer,以及各个Node之间的拓扑关系,可以参考我们的另外一篇博客《深入解析大数据虚拟化的架构(下)- 系统架构》
实例讲解Chef和Serengeti的工作机制
在本部分中我们通过实例讲解BDE/Serengeti是如何通过Chef来安装软件的,为了降低复杂度,我们选用Zookeeper作为例子,因为Zookeeper的配置比较简单且对其他Cookbook的依赖性较小。本篇我们并不会详细讲解如何开发Cookbook,相关的教程网上可以找到很多。
(1)准备Cookbook并定义相应的role
Serengeti的所有Cookbooks和Roles位于目录/opt/serengeti/cookbooks中。
先看一下Zookeeper的cookbook代码结构:
$ treecookbooks/zookeeper/
cookbooks/zookeeper/
├──attributes
│ └── default.rb
├──metadata.rb
├──README.rdoc
├──recipes
│ ├── default.rb
│ ├── install_from_package.rb
│ └── install_from_tarball.rb
└──templates
└── default
├── java.env.erb
├── log4j.properties.erb
├── myid.erb
├── zkEnv.sh.erb
├── zoo.cfg.erb
└── zookeeper-server.erb
对于zookeeper这个role的定义:
$ catroles/zookeeper.rb
name 'zookeeper'
description'A role for running Apache zookeeper server'
run_list*%w[
zookeeper
]
该run_list只有一项,意思是说如果某一个node中含有zookeeper这个role,那么这个node在安装zookeeper的时候需要运行cookbooks/zookeeper/recipes/default.rb这个recipe。
default.rb这个recipe主要做以下工作:
a) 安装Java,mount disks, 这一步是通过调用其他recipe来实现的;
b) 创建必要的目录,用户,用户组等;
该步骤中我们使用如下code片段来创建用户:
user "zookeeper" do
group "zookeeper"
shell "/bin/bash"
password nil
supports :manage_home => false
action [:create, :manage]
end
该code使用了Chef的user这个resource来create一个名为”zookeeper”的用户名,参考http://docs.opscode.com/chef/resources.html#user,该用户名属于”zookeeper”组,使用/bin/bash作为其login shell,不指定home目录。
c) 安装软件包,根据distro的不同可能通过tarball或者RPM的方式来安装;
d) 将templates目录的配置文件拷贝到指定位置并做进一步的配置,启动Zookeeper Service;
e) 更新状态信息,以通知其他依赖于Zookeeper Service的Node。
(2) 上传Cookbook和Role,配置manifest文件.
$ knifecookbook upload -a /opt/serengeti/cookbooks/cookbooks
$ kniferole from file /opt/serengeti/cookbooks/roles/*
查看manifest文件
$ cat/opt/serengeti/www/distros/manifest
[
{
"name" : "apache",
"vendor" : "Apache",
"version" : "1.2.1",
"hveSupported" : "true",
"packages" : [
...
{
"roles" :["zookeeper"],
"tarball" :"apache/1.2.1/zookeeper-3.4.5.tar.gz"
}
]
},
...
]
该manifest文件中定义了apache1.2.1的distro中支持zookeeper这个role,且指定了从哪里可以得到zookeeper的tarball。
(3)创建包含zookeeper的cluster
创建包含有zookeeper role的specFile,可以参考/opt/serengeti/samples/default_hbase_cluster.json
{
"nodeGroups" : [
{
"name" : "zookeeper",
"roles" : [
"zookeeper"
],
...
},
...
]
"configuration" : {
}
}
使用Serengeti的CLI创建cluster:
serengeti>clustercreate --name test01 --specFile/opt/serengeti/samples/default_hbase_cluster.json --distro apache
Web Service创建完所有虚拟机以后会通过Thrift Service调用Ironfan的API,并将必要的虚拟机信息传给Ironfan,这些信息包括每个node的rolelist,ip地址,位于哪个physical host上,配置了哪几个disk,tarball的完整下载地址以及用户自定义的配置信息等等,Ironfan基于这些信息在Chef Server上创建各个node的信息,***启动每个node上的chef-client。
我们可以login到node上查看一些chef-client的信息:
$ cat/etc/chef/client.rb
log_level :info
log_location STDOUT
chef_server_url "http://<chef_server_ip>:4000"
validation_client_name"chef-validator"
node_name"test01-zookeeper-0"
手动启动chef-client,从log信息中了解chef-client的运行状况
$ sudo chef-client -c/etc/chef/client.rb
关于vSphere Big Data Extensions:
VMware vSphere Big Data Extensions(简称BDE)基于vSphere平台支持大数据和Apache Hadoop作业。BDE以开源Serengeti项目为基础,为企业级用户提供一系列整合的管理工具,通过在vSphere上虚拟化Apache Hadoop,帮助用户在基础设施上实现灵活、弹性、安全和快捷的大数据部署、运行和管理工作。了解更多关于VMware vSphere Big Data Extensions的信息,请参见http://www.vmware.com/hadoop。
作者介绍
卞小丁
VMware 研发工程师,清华大学自动化系本硕,数据挖掘方向,2012年毕业加入VMware。致力于Serengeti产品的设计开发工作,对分布式系统,大数据挖掘等有较深入理解。