Chef在大數據集羣部署中的應用

Chef的基本架構

Chef是一個C/S架構的分佈式軟件配置管理工具。

115637592.png

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等。

115804520.png

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://<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


作者介紹

120340565.jpg

卞小丁

VMware 研發工程師,清華大學自動化系本碩,數據挖掘方向,2012年畢業加入VMware。致力於Serengeti產品的設計開發工作,對分佈式系統,大數據挖掘等有較深入理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章