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產品的設計開發工作,對分佈式系統,大數據挖掘等有較深入理解。