綜上所屬,日志服務(wù)平臺(tái)作為五阿哥網(wǎng)站日志倉(cāng)庫(kù),將應(yīng)用運(yùn)行過(guò)程中產(chǎn)生的日志統(tǒng)一存儲(chǔ),并且支持多種方式的查詢操作。
圖10:日志服務(wù)平臺(tái)
通過(guò)在日志服務(wù)的管理界面配置日志采集路徑,在容器中部署agent把應(yīng)用日志統(tǒng)一投遞到logstore中,再在logstore中配置全文索引和分詞符,以便開發(fā)同學(xué)能夠通過(guò)關(guān)鍵字搜索、查詢想要的日志內(nèi)容。
經(jīng)驗(yàn)總結(jié):如何避免日志的重復(fù)采集問(wèn)題?
日志服務(wù)agent需要在配置文件“ilogtail_config.json”中增加配置參數(shù)“check_point_filename”,指定checkpoint文件生成的絕對(duì)路徑,并且將此路徑掛載至宿主機(jī)目錄下,確保容器在重啟時(shí)不會(huì)丟失checkpoint文件,不會(huì)出現(xiàn)重復(fù)采集問(wèn)題。
服務(wù)的注冊(cè)
etcd是一個(gè)具備高可用性和強(qiáng)一致性的鍵值存儲(chǔ)倉(cāng)庫(kù),它使用類似于文件系統(tǒng)的樹形結(jié)構(gòu),數(shù)據(jù)全部以“/”開頭。etcd的數(shù)據(jù)分為兩種類型:key和directories,其中key下存儲(chǔ)單獨(dú)的字符串值,directories下則存放key的集合或者其他子目錄。
圖11 應(yīng)用注冊(cè)
在五阿哥環(huán)境中,每個(gè)向etcd注冊(cè)的應(yīng)用服務(wù),它們的根目錄都以
”/ ${APP_NAME}_ ${ENVIRONMENT}”
命名。根目錄下存儲(chǔ)每個(gè)應(yīng)用實(shí)例的Key信息,它們都以“IP−{PORT}”的方式命名。
下圖是使用上述約定,存儲(chǔ)在etcd上某應(yīng)用實(shí)例的數(shù)據(jù)結(jié)構(gòu):
圖12: 存儲(chǔ)在etcd上某應(yīng)用實(shí)例的數(shù)據(jù)結(jié)構(gòu)
可以看到我是使用get方法向etcd發(fā)送請(qǐng)求的,請(qǐng)求的是部署在預(yù)發(fā)環(huán)境(PRE)的搜索服務(wù)(search);在它的根目錄“/search_PRE”下,僅存儲(chǔ)了一個(gè)應(yīng)用實(shí)例的信息,這個(gè)實(shí)例的key是“172.18.100.31-86”;對(duì)應(yīng)的value是“172.18.100.31:86‘’,整個(gè)注冊(cè)過(guò)程是這樣的:
① 通過(guò)代碼為容器應(yīng)用程序生成隨機(jī)端口,和宿主機(jī)正在使用的端口進(jìn)行比對(duì),確保端口沒(méi)有沖突后寫入程序配置文件;
② 把通過(guò)python和etcd模塊編寫的服務(wù)注冊(cè)工具集成在腳本中,將IP地址和上一步獲取的隨機(jī)端口以參數(shù)的方式傳遞給服務(wù)注冊(cè)工具;
③ 待應(yīng)用程序完全啟動(dòng)后,由服務(wù)注冊(cè)工具以約定好的數(shù)據(jù)結(jié)構(gòu)將應(yīng)用實(shí)例的寫入etcd集群,完成服務(wù)注冊(cè)工作;
④ 容器定時(shí)向etcd發(fā)送心跳,報(bào)告存活并刷新ttl時(shí)間;
⑤ 容器腳本捕獲rancher發(fā)送至應(yīng)用實(shí)例的singnal terminal信號(hào),在接收到信號(hào)后向etcd發(fā)送delete請(qǐng)求刪除實(shí)例的數(shù)據(jù)。
注:在ttl基礎(chǔ)上增加主動(dòng)清除功能,在服務(wù)正常釋放時(shí),可以立刻清除etcd上注冊(cè)信息,不必等待ttl時(shí)間。
經(jīng)驗(yàn)總結(jié):容器在重啟或者意外銷毀時(shí),讓我們一起看一下這個(gè)過(guò)程中容器和注冊(cè)中心都做了什么事情?
應(yīng)用在注冊(cè)是攜帶key 和value時(shí)攜帶了ttl超時(shí)屬性,就是考慮到當(dāng)服務(wù)集群中的實(shí)例宕機(jī)后,它在etcd中注冊(cè)的信息也隨之失效,若不予清除,失效的信息將會(huì)成為垃圾數(shù)據(jù)被一直保存,而且配置管理工具還會(huì)把它當(dāng)做正常數(shù)據(jù)讀取出來(lái),寫入web server的配置文件中。要保證存儲(chǔ)在etcd中的數(shù)據(jù)始終有效,就需要讓etcd主動(dòng)釋放無(wú)效的實(shí)例信息,來(lái)看一下注冊(cè)中心刷新的機(jī)制,代碼直接奉上:
#!/usr/bin/env pythonimportetcd importsys arg_l=sys.argv[ 1:] etcd_clt=etcd.Client(host= '172.18.0.7') defset_key(key,value,ttl=10):try: returnetcd_clt.write(key,value,ttl) exceptTypeError: print'key or vlaue is null'defrefresh_key(key,ttl=10):try: returnetcd_clt.refresh(key,ttl) exceptTypeError: print'key is null'defdel_key(key):try: returnetcd_clt.delete(key) exceptTypeError: print'key is null'ifarg_l: iflen(arg_l) == 3: key,value,ttl=arg_l set_key(key,value,ttl) eliflen(arg_l) == 2: key,ttl=arg_l refresh_key(key,ttl) eliflen(arg_l) == 1: key=arg_l[ 0] del_key(key) else: raiseTypeError, 'Only three parameters are needed here'else: raiseException( 'args is null')服務(wù)的發(fā)現(xiàn)