韋建文, 王一超, 文敏華, 林新華, 周子豪
(上海交通大學(xué)網(wǎng)絡(luò)信息中心,上海200240)
高性能計(jì)算集群是為求解大型計(jì)算問題、由多個(gè)節(jié)點(diǎn)通過高速網(wǎng)絡(luò)連接而組成的集群,其能否有效工作很大程度上取決于集群中各節(jié)點(diǎn)是否處于協(xié)調(diào)一致的配置狀態(tài)。集群節(jié)點(diǎn)從上架通電到下線退役發(fā)生的軟件配置調(diào)整,都可歸入配置管理的范疇,包括為節(jié)點(diǎn)初始化做的離線配置和不中斷節(jié)點(diǎn)服務(wù)的在線配置。傳統(tǒng)配置方法關(guān)注配置的具體操作,譬如“使用useradd命令添加用戶”“用戶已存在該如何處理”等。受限于命令式配置的建模能力,傳統(tǒng)配置方法很難快速正確地將復(fù)雜系統(tǒng)配置到預(yù)期狀態(tài),而由此導(dǎo)致作業(yè)運(yùn)行效率低甚至集群下線,將嚴(yán)重影響高性能計(jì)算集群的正常使用。
“基礎(chǔ)設(shè)施即代碼”(Infrastructure as Code,IaC)[1]是為解決復(fù)雜系統(tǒng)配置問題而提出的方法,其核心理念是專注表達(dá)配置的需求——即構(gòu)建配置建模,具體煩瑣的配置操作則由程序在模型驅(qū)動(dòng)下完成。
以表1 所示的添加用戶為例,配置建模使用“聲明式”描述,相比配置過程使用的“命令式”描述,能更加簡潔準(zhǔn)確地表達(dá)配置意圖。盡管由模型驅(qū)動(dòng)的配置管理在云計(jì)算領(lǐng)域已獲得廣泛應(yīng)用,但這項(xiàng)技術(shù)是否適合于物理機(jī)占比高、異構(gòu)硬件數(shù)量多的高性能計(jì)算集群,仍需要進(jìn)一步探索。
表1 “聲明式”與“命令式”配置對(duì)比
上海交通大學(xué)高性能計(jì)算平臺(tái)是國內(nèi)規(guī)模最大的校級(jí)計(jì)算平臺(tái)之一[2],已建成π1.0(2013 年上線)、π2.0(2019 年上線)兩代集群,理論計(jì)算能力超過3PFlops,存儲(chǔ)容量超過10 PB,配備CPU計(jì)算節(jié)點(diǎn)、多路胖節(jié)點(diǎn)、GPU計(jì)算節(jié)點(diǎn)等總計(jì)超過1 000 個(gè)物理節(jié)點(diǎn),以及數(shù)十個(gè)虛擬管理節(jié)點(diǎn)。將這些節(jié)點(diǎn)配置成一個(gè)協(xié)同工作的集群,是一項(xiàng)很有挑戰(zhàn)性的工作。本文介紹一種以配置模型為核心的高性能計(jì)算集群配置管理方法,包括:配置管理工具選型、Puppet特性、模型驅(qū)動(dòng)的集群配置管理流程、配置時(shí)間對(duì)比和配置集群的流程展示。
在“基礎(chǔ)設(shè)施即代碼”實(shí)踐中,配置管理與編程解題有很多共同點(diǎn)。如圖1 所示。
程序員使用高級(jí)語言編寫程序代碼,經(jīng)編譯器編譯后得到可執(zhí)行程序,執(zhí)行后輸出計(jì)算結(jié)果。類似地,管理員使用建模語言描述配置模型,經(jīng)配置管理工具翻譯后得到可執(zhí)行腳本,執(zhí)行后將目標(biāo)節(jié)點(diǎn)配置到預(yù)期狀態(tài)。程序員在選擇編程工具鏈時(shí)會(huì)考察編程語言的表達(dá)能力、執(zhí)行效率、第3 方庫豐富程度以及對(duì)版本回溯等軟件工程特性的支持。同樣地,管理員選擇配置管理工具時(shí),也會(huì)重點(diǎn)考察建模能力、配置速度、模塊數(shù)量、對(duì)版本回溯的支持和部署難度。
圖1 配置管理執(zhí)行流程
現(xiàn)有主流開源配置管理工具特性對(duì)比見表2。表中,Puppet使用了語法類似Ruby 的定制語言,具有很強(qiáng)的建模能力,又因?yàn)槭褂昧霜?dú)立的客戶端所以配置速度快,龐大的社區(qū)提供了超過6 000 個(gè)模塊,且可與git版本控制系統(tǒng)[7]整合提供變更回溯功能。盡管Puppet部署難度要比其他配置管理工具高,但其提供的層次化建模、邏輯與數(shù)據(jù)分離特性對(duì)管理復(fù)雜集群配置提供了極大的便利。
表2 主流開源配置管理系統(tǒng)對(duì)比
Puppet配置管理工具的3 個(gè)主要組件如圖2 所示,包括建模組件、主控節(jié)點(diǎn)和客戶端。管理員使用建模組件構(gòu)建的配置模型由主控節(jié)點(diǎn)編譯后變成可執(zhí)行腳本,客戶端執(zhí)行腳本把目標(biāo)節(jié)點(diǎn)配置到預(yù)期狀態(tài)。
圖2 Puppet配置管理系統(tǒng)組件
Puppet的配置模型包含“邏輯”與“數(shù)據(jù)”兩個(gè)要素,分別描述“配置什么”和“配置參數(shù)”。
模型的邏輯使用名為Puppet DSL 的特定領(lǐng)域描述語言(Domain Specific Language,DSL)描述。這個(gè)語言專為配置管理設(shè)計(jì),不僅提供了完成基礎(chǔ)配置所需的函數(shù),如安裝特定RPM包、啟動(dòng)特定服務(wù)等,還包含了用于構(gòu)建復(fù)雜功能的語言特性,如變量、數(shù)據(jù)結(jié)構(gòu)、條件分支等。Puppet 推薦使用名為“角色-剖繪”(Roles-Profiles)編碼規(guī)范[8]把模型代碼分散到多個(gè)文件中。這個(gè)編碼規(guī)范使用角色和剖繪兩層抽象,分別描述節(jié)點(diǎn)的功能(如compute、nameserver等)以及實(shí)現(xiàn)這些功能所需的軟件棧(如slurm、bind 等)。部分具有共性功能的模型代碼(如配置MySQL、SLURM)可發(fā)布在Puppet Forge 社區(qū)[9]或GitHub[10]供其他用戶使用。Puppet社區(qū)提供的模塊數(shù)量和質(zhì)量一直在不斷提高,已經(jīng)積累了超過6 000 個(gè)模塊,涵蓋了高性能計(jì)算集群所需絕大部分軟件棧。
Puppet使用名為Hiera 的程序組織模型中的數(shù)據(jù)。Hiera提供了從最細(xì)粒度的“節(jié)點(diǎn)”到最粗粒度“全局默認(rèn)”之間多粒度層次化的參數(shù)匹配方法。Hiera可從節(jié)點(diǎn)角色、操作系統(tǒng)或其他特征搜索參數(shù),并按照用戶指定的優(yōu)先級(jí)替換或合并參數(shù),若搜索失敗將使用默認(rèn)的全局參數(shù)。Hiera 很好地處理了配置數(shù)據(jù)中“一般”與“特殊”的關(guān)系,通過多粒度參數(shù)匯聚避免重復(fù)配置在多處出現(xiàn)。Hiera 使用“邏輯”與“數(shù)據(jù)”分離的編程理念,使得敏感配置信息得以從配置邏輯中分離出來得到保護(hù)。
Puppet提供了“文件”和“模型”兩個(gè)級(jí)別的配置變更跟蹤機(jī)制。在文件一級(jí),Puppet 主控節(jié)點(diǎn)會(huì)備份file函數(shù)每一次對(duì)配置文件所做的修改,管理員可以查看、對(duì)比和恢復(fù)配置文件的歷史記錄。在模型一級(jí),Puppet與git 集成,跟蹤整個(gè)配置模型,即“邏輯+數(shù)據(jù)”的代碼變更歷史。管理員可使用“git 簽出”抽取任意時(shí)刻的模型應(yīng)用到目標(biāo)節(jié)點(diǎn),或使用“git分支”創(chuàng)造多個(gè)獨(dú)立于生產(chǎn)環(huán)境的配置模型。Puppet配置變更跟蹤機(jī)制是實(shí)現(xiàn)配置回溯和獨(dú)立測試環(huán)境的基礎(chǔ)。
使用Puppet建模組件構(gòu)建了上海交大高性能計(jì)算集群的配置模型,并借助Puppet配置變更跟蹤特性搭建了可回溯可測試的在線配置流程,結(jié)合Cobbler操作系統(tǒng)部署工具,搭建了無須人工干預(yù)的節(jié)點(diǎn)離線配置流程。
按照Roles-Profiles 編碼規(guī)范,集群節(jié)點(diǎn)的角色和所需軟件棧見表3。
表3 節(jié)點(diǎn)角色分配表
具體地,lib/facter/role.rb配置文件通過正則表達(dá)式為其指定角色變量puppet_role 和計(jì)算節(jié)點(diǎn)子類型變量puppet_subtype,接著在角色文件中引入所需軟件棧剖繪。從Puppet Forge和GitHub站點(diǎn)選取軟件棧對(duì)應(yīng)的模塊加剖繪文件,并針對(duì)高性能計(jì)算領(lǐng)域特有的軟硬件系統(tǒng),如Omni-Path 網(wǎng)絡(luò)[11]、SLURM 調(diào)度系統(tǒng)[12]編寫了Puppet 擴(kuò)展模塊。Hiera 使用“角色(role)-子類(subtype)-節(jié)點(diǎn)(node)”的優(yōu)先級(jí)順序合并參數(shù)。git代碼倉庫的多個(gè)分支分別對(duì)應(yīng)不同的測試環(huán)境,每個(gè)環(huán)境都可獨(dú)立地分配“角色-剖繪”配置、使用其他外部模塊、指派配置數(shù)據(jù)。
在線配置用于完成那些無須重啟節(jié)點(diǎn)的維護(hù)操作,包括SLURM 隊(duì)列設(shè)置、增加軟件包、調(diào)整告警檢查閾值等。
如圖3 所示,基于生產(chǎn)環(huán)境的模型新建git測試環(huán)境分支,在這個(gè)分支上修改模型選擇個(gè)別節(jié)點(diǎn)應(yīng)用新模型,確認(rèn)新配置模型工作正常后再將git分支的修改合并到生產(chǎn)環(huán)境分支。在所有節(jié)點(diǎn)上應(yīng)用更新后的配置模型。在新的git 分支調(diào)試新模型時(shí),可以使用git revert撤回某一個(gè)錯(cuò)誤修改,或者用git checkout 回滾到某個(gè)歷史狀態(tài),還可以使用puppet agent -t --environment production把測試分支的集群配置復(fù)位到生產(chǎn)環(huán)境狀態(tài),然后開啟新的git 分支繼續(xù)“開發(fā)-測試-合并”的流程。
Cobbler[13]節(jié)點(diǎn)部署工具和Puppet 配置工具用于無人值守離線配置,可以一鍵完成節(jié)點(diǎn)上線的流程。離線配置適合重大更新,如操作系統(tǒng)大版本升級(jí)、更換節(jié)點(diǎn)角色等。
如圖4 所示,首先,管理員通過IPMI設(shè)置目標(biāo)節(jié)點(diǎn)通過PXE網(wǎng)絡(luò)啟動(dòng)并重啟節(jié)點(diǎn),節(jié)點(diǎn)從Cobbler 服務(wù)器獲得啟動(dòng)鏡像和Kickstart文件[14],重新部署操作系統(tǒng)。然后,安裝程序調(diào)用puppet 客戶端在這個(gè)新部署的操作系統(tǒng)上配置其他服務(wù)組件。最后,安裝程序退出,節(jié)點(diǎn)自動(dòng)上線提供服務(wù)。經(jīng)測試,這個(gè)流程可并發(fā)部署超過1 000 個(gè)物理機(jī)或虛擬機(jī)。通過調(diào)整Cobbler和Kickstart的設(shè)置,還可以定制每個(gè)節(jié)點(diǎn)使用的操作系統(tǒng)和分區(qū)方案。
圖3 在分支環(huán)境測試配置變更
圖4 無人值守部署流程圖
以“配置SLURM作業(yè)調(diào)度系統(tǒng)”和“配置一個(gè)新的節(jié)點(diǎn)”這兩個(gè)任務(wù)為例,傳統(tǒng)配置方法和模型驅(qū)動(dòng)的Puppet方法的工作效率對(duì)比見表4。
模型驅(qū)動(dòng)方法在準(zhǔn)備階段時(shí)間、執(zhí)行階段時(shí)間和需要撰寫代碼行數(shù)均優(yōu)于傳統(tǒng)配置方法。傳統(tǒng)配置方法在“配置SLURM 調(diào)度系統(tǒng)”時(shí),需要單獨(dú)為slurmctld、slurmdbd、slurmd 這幾個(gè)服務(wù)維護(hù)內(nèi)容相似的配置文件,并配置相應(yīng)的MUNGE、SSSD等服務(wù);Puppet配置方法則可以共享SLURM 主要配置信息,并直接使用現(xiàn)成的SLURM、MUGNE、SSSD 配置模塊。傳統(tǒng)配置方法在“配置一個(gè)新的節(jié)點(diǎn)”時(shí),需要額外編寫配置流程,或在操作系統(tǒng)部署后人工運(yùn)行配置程序;Puppet配置方法則可完全復(fù)用已有的配置流程,只需在Kickstart 文件末尾加入一行調(diào)用puppet 客戶端的代碼。除此以外,模型驅(qū)動(dòng)的配置方法引入了模塊化設(shè)計(jì)、變更追溯等軟件工程方法,使管理員能夠像發(fā)布軟件一樣,保障質(zhì)量地進(jìn)行配置變更,這是傳統(tǒng)配置方法做不到的。
表4 模型驅(qū)動(dòng)配置和傳統(tǒng)配置方法對(duì)比
圖5 展示了使用模型驅(qū)動(dòng)的配置方法部署一個(gè)高性能計(jì)算集群的主要過程和耗時(shí)。
圖5 集群配置主要流程圖
在管理節(jié)點(diǎn)物理機(jī)上安裝Cobbler 部署服務(wù)和Puppet主控節(jié)點(diǎn)服務(wù);在管理節(jié)點(diǎn)安裝Ovirt虛擬機(jī)管理器服務(wù)[15],另選一臺(tái)服務(wù)器安裝Ovirt宿主機(jī)服務(wù);新建Ovirt虛擬機(jī)承載集群內(nèi)的Bind 域名解析、Squid代理、MariaDB數(shù)據(jù)庫、SLURM 主控節(jié)點(diǎn)服務(wù);批量為計(jì)算節(jié)點(diǎn)部署和配置系統(tǒng),與此同時(shí)使用Spack 軟件包管理器為集群安裝編譯器、MPI 庫、數(shù)學(xué)庫等工具。傳統(tǒng)部署方法最耗時(shí)的操作系統(tǒng)安裝和系統(tǒng)配置部分,被Puppet +Cobbler 無人值守部署流程替代,使得部署一個(gè)包含幾十甚至上千計(jì)算節(jié)點(diǎn)集群的時(shí)間,從1 周縮短到了一天。
傳統(tǒng)“命令式”配置方法建模能力受限,不能勝任日益復(fù)雜的高性能計(jì)算集群配置任務(wù)。借鑒“基礎(chǔ)設(shè)施即代碼”的思想,將配置問題轉(zhuǎn)換為建模問題。在以模型為核心的配置管理中,管理員專注編寫配置模型,具體的配置操作交由模型驅(qū)動(dòng)的程序執(zhí)行。這套方法在開源Puppet配置管理工具基礎(chǔ)上實(shí)現(xiàn),并加入了模塊劃分、邏輯-數(shù)據(jù)分離、變更追溯等特性提高配置的執(zhí)行效率、通用性和正確性。這套方法支撐了上海交大校級(jí)高性能計(jì)算平臺(tái)超過1 000 個(gè)節(jié)點(diǎn)的配置,極大縮短在線配置、離線部署的時(shí)間,為開發(fā)新的服務(wù)內(nèi)容提供了便利的測試流程。后續(xù)將整合“連續(xù)集成”技術(shù)用于自動(dòng)驗(yàn)證和應(yīng)用配置,進(jìn)一步將管理員從煩瑣重復(fù)的運(yùn)維工作中解放出來。