2013年,我加入了聚美優(yōu)品,當(dāng)時(shí)成都團(tuán)隊(duì)僅有四五個(gè)人,負(fù)責(zé)一些輔助系統(tǒng)的日常運(yùn)維,比如查查日志等。隨著公司規(guī)模逐漸的擴(kuò)大,一些重要的業(yè)務(wù)往成都遷移,這對(duì)成都團(tuán)隊(duì)是一個(gè)非常大的挑戰(zhàn)。業(yè)務(wù)部署最開(kāi)始是手工的,我們逐漸覺(jué)得應(yīng)該有一個(gè)平臺(tái)來(lái)滿足我們的工作,所以我們打造了一個(gè)運(yùn)維平臺(tái)。
本文將圍繞平臺(tái)里有關(guān)自動(dòng)化的東西做一個(gè)介紹,當(dāng)然我們是一個(gè)小團(tuán)隊(duì),不足的地方請(qǐng)大家指正。
傳統(tǒng)運(yùn)維帶來(lái)的坑
說(shuō)到運(yùn)維自動(dòng)化,前兩年還是比較炙手可熱的話題。先說(shuō)一下傳統(tǒng)運(yùn)維的痛點(diǎn)和運(yùn)維自動(dòng)化的意義。我們?nèi)粘_\(yùn)維工作是比較繁瑣的,一些研發(fā)同學(xué)會(huì)經(jīng)常讓我們幫他們到服務(wù)器上查一下日志、或者是說(shuō)今天上線一個(gè)東西陪他們加一下班部署下環(huán)境。這些瑣事的事情充斥在我們的大部分工作,導(dǎo)致整個(gè)運(yùn)維的部門產(chǎn)出不高。
還有一個(gè)關(guān)于標(biāo)準(zhǔn)的問(wèn)題,這個(gè)問(wèn)題讓我們吃了很大的虧,早期聚美內(nèi)部因?yàn)椴渴鹆?xí)慣千差萬(wàn)別,導(dǎo)致一些項(xiàng)目不可維護(hù),誰(shuí)去動(dòng),誰(shuí)就死。2014年北京那邊負(fù)責(zé)訂單的同事離職,把訂單系統(tǒng)的運(yùn)維工作交接到成都這邊來(lái),我們當(dāng)時(shí)面臨“雙十一”的上線,我們經(jīng)常兩三個(gè)通宵的搞,相當(dāng)痛苦的。傳統(tǒng)運(yùn)維模式還有會(huì)帶來(lái)效率的問(wèn)題。到服務(wù)器上執(zhí)行命令和部署程序的效率很低,并且非常容易出錯(cuò),出錯(cuò)之后也不太好排查問(wèn)題,浪費(fèi)很多的時(shí)間。效率問(wèn)題就引申出成本的問(wèn)題,我們?cè)品⻊?wù)器是從提供商那里購(gòu)買的,需要花很多的時(shí)間準(zhǔn)備運(yùn)行環(huán)境、上下線,這對(duì)公司來(lái)說(shuō)是不小的開(kāi)支。
我們希望按點(diǎn)下班,陪陪家人什么的。我們運(yùn)維工程師有一個(gè)習(xí)慣,電腦喜歡用多個(gè)顯示器,窗口管理器也喜歡使用平鋪的,這樣子看上來(lái)好象挺牛,但是做的是很雜的一些工作,沒(méi)什么效益。我們做自動(dòng)化運(yùn)維平臺(tái)的話,就能夠把日常遇到的這些個(gè)問(wèn)題給解決掉。
運(yùn)維自動(dòng)化的演進(jìn)
現(xiàn)在說(shuō)一下運(yùn)維自動(dòng)化的演進(jìn)過(guò)程:一開(kāi)始并沒(méi)有專門的工具為我們做這些事情;后來(lái)逐漸有了運(yùn)維自動(dòng)化的一些工具,比如說(shuō)Bcfg2、Puppet、SaltStack等;最后打造出一個(gè)運(yùn)維自動(dòng)化的平臺(tái)。
圖1 運(yùn)維自動(dòng)化的演進(jìn)過(guò)程
說(shuō)到工具,確實(shí)為我們提供一些提高效率的方法,但還給我們帶來(lái)了一些其他的問(wèn)題,比如聚美早期時(shí)候采用Bcfg2+Fabric作為服務(wù)器部署的工具,由一兩個(gè)核心的運(yùn)維負(fù)責(zé)到主控的機(jī)器上采用命令行的方式執(zhí)行操作,這時(shí)效率同樣是很低的,而且隨著運(yùn)維工作量的增多,所有的工作都要丟到一兩個(gè)人的身上,就很不方便。但如果把權(quán)限開(kāi)放出來(lái),對(duì)運(yùn)維操作的權(quán)限沒(méi)有任何限制也不利于審計(jì)。
還有一個(gè)問(wèn)題,F(xiàn)abric執(zhí)行時(shí)執(zhí)行輸出刷屏不好定位問(wèn)題,比如說(shuō)執(zhí)行20臺(tái),可能有19臺(tái)在真正執(zhí)行,有1臺(tái)沒(méi)有執(zhí)行,輸出內(nèi)容就一閃而過(guò),沒(méi)有很好的反饋,這時(shí)我們將機(jī)器上線就會(huì)出錯(cuò)。我們需要用平臺(tái)把這個(gè)問(wèn)題給規(guī)避掉。
資產(chǎn)系統(tǒng)是運(yùn)維自動(dòng)化的基石
說(shuō)到運(yùn)維自動(dòng)化的話,有一個(gè)東西是必須要說(shuō)的,就是咱們的資產(chǎn)系統(tǒng),這是運(yùn)維自動(dòng)化的基石。
資產(chǎn)系統(tǒng)為運(yùn)維提供一些基礎(chǔ)的信息,比如說(shuō)機(jī)器是屬于哪一個(gè)項(xiàng)目的、這個(gè)機(jī)器是運(yùn)行在什么樣的環(huán)境。還有一些描述機(jī)器的屬性,包括IP地址、IPMI管理地址、機(jī)器的類型,運(yùn)維人員信息、所在的機(jī)柜、所連接交換端口。有了這些信息在機(jī)器出問(wèn)題的的情況,可以讓機(jī)房協(xié)調(diào)我們快速找到機(jī)器的位置。我們也可以通過(guò)這些信息做資產(chǎn)的盤(pán)點(diǎn)。
資產(chǎn)系統(tǒng)的信息包括物理信息和邏輯信息。物理信息包括硬件信息和網(wǎng)絡(luò)連接的信息,是實(shí)實(shí)在在存在的信息;邏輯信息需要人工填進(jìn)去,自動(dòng)化運(yùn)維的時(shí)候用得到。
圖2 資產(chǎn)系統(tǒng)包括的信息
SaltStack,自動(dòng)化運(yùn)維工具
講完資產(chǎn)系統(tǒng),還要講一個(gè)運(yùn)維自動(dòng)化的工具——SaltStack。不管使用手工的方式還是使用自動(dòng)化工具都要熟練的去配置服務(wù)器的操作系統(tǒng)、配置各項(xiàng)基礎(chǔ)服務(wù)。比如說(shuō)一些系統(tǒng)優(yōu)化:包括sysctl.conf、ulimit.conf、網(wǎng)卡軟中斷的綁定。還有機(jī)器標(biāo)準(zhǔn)化的修改,包括機(jī)器locale、服務(wù)器時(shí)區(qū)、yum(apt)的配置。這些內(nèi)容的標(biāo)準(zhǔn)化可以統(tǒng)一我們服務(wù)器的運(yùn)行環(huán)境,避免出現(xiàn)因?yàn)榄h(huán)境差異導(dǎo)致各種奇葩的問(wèn)題。除此之外還需要對(duì)服務(wù)器做一些基礎(chǔ)服務(wù)的配置,每個(gè)公司都有些自己編寫(xiě)或者定義的程序需要在每一臺(tái)服務(wù)器上面運(yùn)行。比如聚美內(nèi)部有統(tǒng)一登錄認(rèn)證服務(wù)、系統(tǒng)監(jiān)控程序需要在服務(wù)器上面安裝部署好。
除了系統(tǒng)配置和一些基礎(chǔ)服務(wù)之外,還需要對(duì)各個(gè)業(yè)務(wù)服務(wù)熟悉配置。比如說(shuō)包括負(fù)載均衡器:比如LVS、Nginx。還有就是JAVA和PHP等相關(guān)的業(yè)務(wù):比如Tomcat、FPM、PHPServer。PHPServer是我們內(nèi)部的一個(gè)RPC服務(wù),所有業(yè)務(wù)主線都用這個(gè)。
我們使用SaltStack作為自動(dòng)化運(yùn)維可以簡(jiǎn)化以上一堆服務(wù)的配置工作。
自動(dòng)化運(yùn)維平臺(tái)的運(yùn)行邏輯
有了資產(chǎn)系統(tǒng)、運(yùn)維自動(dòng)化工具這兩個(gè)基礎(chǔ)之后,我們就要開(kāi)始構(gòu)建自動(dòng)化運(yùn)維平臺(tái),這個(gè)平臺(tái)就是把資產(chǎn)系統(tǒng)和運(yùn)維自動(dòng)化工具結(jié)合起來(lái)。
圖3 自動(dòng)化運(yùn)維平臺(tái)的運(yùn)行邏輯
資產(chǎn)系統(tǒng)里面會(huì)為平臺(tái)提供一些基礎(chǔ)的信息,資產(chǎn)系統(tǒng)與SaltStack有一個(gè)信息交互的過(guò)程。比方說(shuō)剛才說(shuō)到的一些邏輯信息導(dǎo)入到SaltStack的grains里面去,一些物理信息需要使用SaltStack提交到資產(chǎn)平臺(tái)。自動(dòng)化的平臺(tái)通過(guò)SaltStack的API去執(zhí)行SLS文件,執(zhí)行完了之后,通過(guò)SaltStack的returners調(diào)用運(yùn)維平臺(tái)的API將執(zhí)行結(jié)果返回回來(lái)。
SaltStack是通過(guò)grains獲取資產(chǎn)系統(tǒng)的信息的,在SaltStack的客戶端salt-minion啟動(dòng)之后,SaltStack的master會(huì)收到一個(gè)“minion_start”的事件,可以在事件上面綁定一個(gè)sync_grains的動(dòng)作,這個(gè)動(dòng)作使得salt-minion資產(chǎn)平臺(tái)拉所要的信息,把這些信息存到grains里面去。通過(guò)SaltStack初始化系統(tǒng)的時(shí)候我們會(huì)引用一個(gè)SLS文件,這個(gè)文件的內(nèi)容是將SaltStack的grains里面保存的信息提交到資產(chǎn)平臺(tái)。
現(xiàn)在來(lái)說(shuō)說(shuō)平臺(tái)調(diào)用SaltStack執(zhí)行的邏輯。一種場(chǎng)景是SaltStack代碼要管理多個(gè)項(xiàng)目,常規(guī)的做法是每個(gè)項(xiàng)目定一個(gè)SLS文件,定義需要初始化的內(nèi)容,這種做法也是可以的,但是對(duì)平臺(tái)的開(kāi)發(fā)沒(méi)那么方便。我們的設(shè)計(jì)是的是無(wú)論多少個(gè)項(xiàng)目,根據(jù)配置文件來(lái)表述這些項(xiàng)目需要初始化的服務(wù),這樣子平臺(tái)的話邏輯會(huì)變得相對(duì)簡(jiǎn)單。比如說(shuō)有一個(gè)項(xiàng)目,我們把這個(gè)項(xiàng)目要定義的一些東西放到配置文件里面去,比如說(shuō)它的項(xiàng)目屬性、發(fā)布目錄,還有就是要初始化什么樣的服務(wù),把這些東西通過(guò)配置文件組裝起來(lái)。初始化的時(shí)候不用關(guān)心具體是什么項(xiàng)目,都調(diào)用統(tǒng)一的入口文件deploy。在deploy.sls做一些邏輯,按照配置文件初始化好各個(gè)服務(wù)整個(gè)項(xiàng)目就初始化好了。
SaltStack反饋執(zhí)行效果的邏輯
剛才講了去平臺(tái)調(diào)用saltstack的邏輯,現(xiàn)在講一下saltstack把結(jié)果反饋到平臺(tái)的邏輯。
圖4 自動(dòng)化運(yùn)維平臺(tái)的反饋邏輯
這個(gè)很簡(jiǎn)單的,剛才提到行的時(shí)候可能會(huì)有一大堆信息輸出到屏幕上,沒(méi)辦法跟蹤、定位具體哪一個(gè)地方出錯(cuò)了。我們就把執(zhí)行的結(jié)果,通過(guò)調(diào)用平臺(tái)的API返回到平臺(tái)里面,平臺(tái)把返回的結(jié)果存儲(chǔ)到數(shù)據(jù)庫(kù)里面去,后續(xù)可以在界面上可以看到每一步執(zhí)行的詳細(xì)結(jié)果,并且可以根據(jù)執(zhí)行的一些信息做一些審計(jì)的工作。
SaltStack部署方法
運(yùn)維自動(dòng)化平臺(tái)以穩(wěn)定性為第一原則。我們之前老的系統(tǒng)為每一個(gè)項(xiàng)目新建一個(gè)用戶,通過(guò)這個(gè)用戶來(lái)運(yùn)行FPM進(jìn)程,而咱們新的平臺(tái)一上線的時(shí)候,每個(gè)跑FPM的機(jī)器用戶名都是一樣的,執(zhí)行用戶的改變就導(dǎo)致之前寫(xiě)的日志沒(méi)法寫(xiě)入了,出現(xiàn)了業(yè)務(wù)的故障。所以之后我們將老的系統(tǒng)遷移到新的自動(dòng)化平臺(tái)的時(shí)候都需要非常小心。
簡(jiǎn)單介紹一下SaltStack用戶部署的方法。部署SaltStack的客戶端salt-minion時(shí)候會(huì)有一個(gè)KEY接收的過(guò)程。傳統(tǒng)的做法是是用“salt-key -L”命令看一下哪些機(jī)器已經(jīng)注冊(cè)到平臺(tái)中,然后再使用“salt-key -a”把key接收進(jìn)來(lái)。在咱們的平臺(tái)中這個(gè)過(guò)程是自動(dòng)的,我們通過(guò)reactor的機(jī)制來(lái)實(shí)現(xiàn)的。具體為:機(jī)器注冊(cè)進(jìn)來(lái)之后有一個(gè)“salt/auth”的事件,我們把給個(gè)事件綁定一個(gè)動(dòng)作,然后在這個(gè)動(dòng)作里面檢查key是預(yù)定義的來(lái)決定是否讓這個(gè)機(jī)器來(lái)注冊(cè)到salt-master上面。如果salt-minion的機(jī)器配置目錄被刪除了,salt-minion重啟之后不會(huì)注冊(cè)到salt-master 上面。這時(shí)我們只需要在salt-minion的機(jī)器上重新跑下配置salt-minion的配置腳本,將統(tǒng)一的KEY下發(fā)給它就可以保證salt-minion能夠重新被salt-master接受。
打造運(yùn)維自動(dòng)化平臺(tái)遇到的問(wèn)題
說(shuō)一下初始化業(yè)務(wù)環(huán)境的時(shí)候,遇到的一些問(wèn)題。
圖5 打造運(yùn)維自動(dòng)化平臺(tái)過(guò)程中遇到的坑
先說(shuō)資產(chǎn)信息的頻繁變更,比如說(shuō)這個(gè)機(jī)器可能覺(jué)得數(shù)量比較多之后,將機(jī)器挪到其他項(xiàng)目上去,此時(shí)salt-minion 里面記錄的grains還是之前項(xiàng)目的信息。出現(xiàn)這種情況需要我們?cè)诿看螌?duì)機(jī)器執(zhí)行初始化等操作的時(shí)候先給他綁定同步資產(chǎn)信息的動(dòng)作。
還有一個(gè)是大量添加機(jī)器的刪除的問(wèn)題,比方說(shuō)大促的時(shí)候兩千臺(tái)機(jī)子,大促完了之后會(huì)把機(jī)器給下掉,此時(shí)salt-master 接收的機(jī)器不會(huì)被刪除,會(huì)有很多冗余的信息。我們目前想到的辦法是通過(guò)cron把salt-master上面的機(jī)器列表拿出來(lái)ping一下,如果能ping通的就保留在salt-master上面,不能ping通的機(jī)器則使用“salt-key -d ”命令給刪除掉。還有是一個(gè)“max open file”的問(wèn)題,通過(guò)saltstack重啟的服務(wù),重啟之后進(jìn)程的“max open file”變成了默認(rèn)的1024,此時(shí)我們需要定制下這些服務(wù)的啟動(dòng)腳本,在里面加入“ulimit -n 65535”等內(nèi)容。
展望
最后,自動(dòng)化運(yùn)維平臺(tái)后面會(huì)往容器或者是微服務(wù)的方向過(guò)渡,而傳統(tǒng)的自動(dòng)化方式對(duì)我們來(lái)說(shuō)就沒(méi)那么重要,我們現(xiàn)在也在做這方面的工作,因?yàn)槲覀児緝?nèi)部有一些使用FPM的項(xiàng)目,對(duì)單個(gè)節(jié)點(diǎn)效率要求也不太高,放在容器里面運(yùn)行比較合適,我們也在使用Kubernetes加上Docker做我們下一步的部署方案,但現(xiàn)在只是一個(gè)初期階段。
核心關(guān)注:拓步ERP系統(tǒng)平臺(tái)是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊(yùn)涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請(qǐng)注明出處:拓步ERP資訊網(wǎng)http://www.oesoe.com/
本文標(biāo)題:詳解自動(dòng)化運(yùn)維平臺(tái)的構(gòu)建過(guò)程
本文網(wǎng)址:http://www.oesoe.com/html/consultation/10839320287.html