Chef的基本架构

Chef是一个C/S架构的分布式软件配置管理工具。

Chef在大数据集群部署中的应用_第1张图片

Chef架构(源自https://wiki.opscode.com/display/chef10/Architecture+Introduction

Chef Server存储配置各个节点所需的所有信息,以REST API接口提供服务,Chef Nodes是指那些安装了chef-client的节点,chef-client主要用于与Chef Server通信,获取各自的runlistrecipes,进行相应的软件安装、配置和启动工作。

Chef通过Cookbook的方式进行软件配置,每一个Chef Cookbook定义了如何去配置某一个特定serviceapp,整个配置过程可能被定义为多个step,每一个step称为一个recipeCookbook需要上传到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时可以按需求使用相应的resourcechef-client会由相应的provider来完成每一个resource的工作。关于Chefresource可进一步参考https://docs.opscode.com/resource.html

关于Chef的基本概念和教程可进一步参考https://learnchef.opscode.com



Chef的各个组件及其工作机制

Chef的架构中主要包括Chef Server, CouchDB, RabbitMQ, ChefExpander/Indexer, Solr, Chef Client, Knife等。

Chef在大数据集群部署中的应用_第2张图片

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先调用SolrRest API得到搜索结果,即所有符合请求条件的documentID,在根据该IDCouchDB中获取每一个document全文返回给客户端。

KnifeChef提供的一个命令行工具,用于与Chef Server进行通信,Chef的所有功能都可以通过knife来操作。


vSphere Big Data Extensions是如何使用Chef

vSphere Big Data Extensions(BDE)或Serengeti中,Chef ServerWorkStation被安装在Management Server中,chef-client被预装在Serengeti部署出的虚拟机中。

Serengeti安装好以后,在Management Server中已经配置好了Chef Server,并为其配置好了Serengeti所开发的各种roles和相应的cookbook,用户在创建cluster的时候需要为每个nodegroup指定相应的roles,当虚拟机创建完成以后,Serengeti Web Service收集虚拟机的硬件信息和用户定义好的cluster配置,通过thriftservice发送给IronfanIronfan负责与Chef Server交互,在ChefServer上创建各个NodeRole信息,最后启动每个node上的chef-client,通过ChefServer获取各自的rolesrunlist,并下载相应的Cookbook进行软件的安装配置。

关于SerengetiChefServer,以及各个Node之间的拓扑关系,可以参考我们的另外一篇博客《深入解析大数据虚拟化的架构(下)- 系统架构


实例讲解ChefSerengeti的工作机制

在本部分中我们通过实例讲解BDE/Serengeti是如何通过Chef来安装软件的,为了降低复杂度,我们选用Zookeeper作为例子,因为Zookeeper的配置比较简单且对其他Cookbook的依赖性较小。本篇我们并不会详细讲解如何开发Cookbook,相关的教程网上可以找到很多。


1)准备Cookbook并定义相应的role

Serengeti的所有CookbooksRoles位于目录/opt/serengeti/cookbooks中。

先看一下Zookeepercookbook代码结构:

$ 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) 安装Javamount disks, 这一步是通过调用其他recipe来实现的;

b) 创建必要的目录,用户,用户组等;

该步骤中我们使用如下code片段来创建用户:

user "zookeeper" do

group "zookeeper"

shell "/bin/bash"

password nil

supports :manage_home => false

action [:create, :manage]

end

code使用了Chefuser这个resourcecreate一个名为”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 ServiceNode


(2) 上传CookbookRole,配置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.1distro中支持zookeeper这个role,且指定了从哪里可以得到zookeepertarball


3)创建包含zookeepercluster

创建包含有zookeeper rolespecFile,可以参考/opt/serengeti/samples/default_hbase_cluster.json

{

"nodeGroups" : [

{

"name" : "zookeeper",

"roles" : [

"zookeeper"

],

...

},

...

]

"configuration" : {

}

}

使用SerengetiCLI创建cluster:

serengeti>clustercreate --name test01 --specFile/opt/serengeti/samples/default_hbase_cluster.json --distro apache

Web Service创建完所有虚拟机以后会通过Thrift Service调用IronfanAPI,并将必要的虚拟机信息传给Ironfan,这些信息包括每个noderolelistip地址,位于哪个physical host上,配置了哪几个disktarball的完整下载地址以及用户自定义的配置信息等等,Ironfan基于这些信息在Chef Server上创建各个node的信息,最后启动每个node上的chef-client

我们可以loginnode上查看一些chef-client的信息:

$ cat/etc/chef/client.rb

log_level :info

log_location STDOUT

chef_server_url "http://: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


作者介绍

Chef在大数据集群部署中的应用_第3张图片

卞小丁

VMware 研发工程师,清华大学自动化系本硕,数据挖掘方向,2012年毕业加入VMware。致力于Serengeti产品的设计开发工作,对分布式系统,大数据挖掘等有较深入理解。