鵝廠開源框架tars之運營監控服務

   tars開源框架地址:https://github.com/Tencent/Tars

系列文章:

鵝廠開源框架tars之日誌服務

鵝廠開源框架tars之運營監控服務

鵝廠開源框架tars之基礎組件

鵝廠開源框架tars之網絡層實現

簡介:Tars是騰訊從2008年到今天一直在使用的後臺邏輯層的統一應用框架TAF(Total Application Framework),目前支持C++,Java,PHP,Nodejs語言。該框架爲用戶提供了涉及到開發、運維、以及測試的一整套解決方案,幫助一個產品或者服務快速開發、部署、測試、上線。 它集可擴展協議編解碼、高性能RPC通信框架、名字路由與發現、發佈監控、日誌統計、配置管理等於一體,通過它可以快速用微服務的方式構建自己的穩定可靠的分佈式應用,並實現完整有效的服務治理。目前該框架在騰訊內部,各大核心業務都在使用,頗受歡迎,基於該框架部署運行的服務節點規模達到上萬個。

一、運維工具

 如上圖:可以清楚看到tar框架的運維服務和工具:包括主控Resistry、配置文件中心Config、異常信息Nofify、指標統計Stat、遠程log、發佈平臺Patch、業務信息Property等主要服務,再結合web平臺來對這些服務進行可視化操作和運用,對開發和運維人員算是非常方便和人性化了

二、配置中心 config 服務

config服務用於提供整套框架的配置文件保存和讀取等操作;後臺使用mysql存儲

使用例子:

addAppConfig("DBConnection.conf"); //添加應用級別的配置文件

調用TafRemoteConfig::getInstance()->addConfig(filename, result, true)函數:

addConfig函數調用getRemoteFile函數遠程從config server獲取配置文件信息:

rpc調用:_configPrx->loadConfig(_sApp, (bAppConfigOnly ? "" : _sServerName), sFileName, stream);

跳轉到:Config server 的接口函數ConfigImp::loadConfig 函數,如果是應用級別的配置文件:則執行“”select id,config from t_config_files...“” 並且把結果使用string的方式回傳給調用者

調用者獲取到文件內容,根據文件的名字生成在本地以供後續程序使用文件:std::ofstream out(newFile.c_str());

addConfig(ServerConfig::ServerName + ".conf"); //添加當前進程所在的本地文件

調用:TafRemoteConfig::getInstance()->addConfig(filename, result, false) 注意:最後一個參數bAppConfigOnly設置爲false,

調用int ret = _configPrx->loadConfig(_sApp, (bAppConfigOnly ? "" : _sServerName), sFileName, stream); 可見和加載應用級別的配置文件有所不同,這裏調用_configPrx服務器的參數,增加了_sServerName。則rpc調用loadConfig接口的時候服務器參數不爲空,改掉用loadConfigByHost:同樣通過mysql查詢t_config_files表格但增加了where查詢條件"where server_name = '" + _mysqlConfig.escapeString(appServerName)。至此,實現了從指定服務器拉取配置文件的功能 (這裏還關係到引用配置等功能,多個同名文件還涉及到文件合併等,這裏先不做詳細說明)

三、Nofify服務,官方文檔定義爲異常信息。輸出的信息可以在tars運營平臺裏面看到 

TafRemoteNotify::getInstance()->report("[info]: white list open for ["+ _sUinList + "]");

源碼實現:

        if(_notifyPrx)
        {
            if(!bSync)
            {
                _notifyPrx->async_reportServer(NULL, _sApp + "." + _sServerName, TC_Common::tostr(pthread_self()), sResult);
            }
            else
            {
                _notifyPrx->reportServer(_sApp + "." + _sServerName, TC_Common::tostr(pthread_self()), sResult);
            }
        }

Nofify 服務實現,主要就是把數據插入t_server_notifys_數據庫。這裏默認都是使用異步的接口,否則估計效率容易有問題,畢竟是直接操作db

    string sql;
    TC_Mysql::RECORD_DATA rd;
    rd["server_name"]   = make_pair(TC_Mysql::DB_STR, sServerName);
    rd["server_id"]     = make_pair(TC_Mysql::DB_STR, sServerName + "_" + current->getIp());
    rd["thread_id"]     = make_pair(TC_Mysql::DB_STR, sThreadId);
    rd["result"]        = make_pair(TC_Mysql::DB_STR, sResult);
    rd["notifytime"]    = make_pair(TC_Mysql::DB_INT, "now()");
    string sTable = "t_server_notifys_" + TC_Common::tm2str(TNOW,"%Y%m%d");
    try
    {
        _mysqlConfig.insertRecord(sTable, rd);

四、Stat服務——性能指標統計

     服務性能數據採集:調用時間、成功次數、超時次數、異常次數、耗時分佈等信息。服務間調用關係鏈採樣。

Stat服務接口:reportProxyMicMsg:udp上報模塊間調用採樣信息

 

五、Property —業務指標統計

  1. 服務業務特性數據採集;支持平均、計數、求和、分佈等統計方式
  2. 服務調用關係鏈採樣

/**
    * 上報屬性信息
    * @param statmsg, 上報信息
    * @return int, 返回0表示成功
    */
    virtual int reportPropMsg(const map<StatPropMsgHead,StatPropMsgBody>& propMsg, taf::JceCurrentPtr current );

六、Registry ——主控服務:  

  1. 提供對象名稱尋址服務,返回IP:Port列表;爲客戶端提供可用服務列表信息

提供TAF框架核心管理功能 :服務部署、服務起停、服務狀態信息查詢、發佈、配置管理、命令通知

     Registry 提供registerNode(node節點註冊)、keepAlive(node上報心跳負載)、getServers(獲取在該node部署的server列表)、updateServer(更新server狀態)、

同時主控提供了AdminRegImp(關聯控制接口類),提供如下接口:

getAllApplicationNames(獲取application列表)、getAllNodeNames(獲取node列表)、shutdownNode(停止 node)、getServerState(獲取特定server狀態)、startServer(啓動特定server)、restartServer( 重啓特定server)、notifyServer(通知服務)、patchServer(發佈特定server)

例子:startServer接口實現

 //更新數據庫server的設置狀態
        _db.updateServerState(application, serverName, nodeName, "setting_state", taf::Active);

判斷是否爲dns:

DNS: 通過db修改

iRet = _db.updateServerState(application, serverName, nodeName, "present_state", taf::Active);

非DNS:通過node節點啓動(下面介紹node節點的作用)

 NodePrx nodePrx = _db.getNodePrx(nodeName);

iRet = nodePrx->startServer(application, serverName, result);

 

七、Node ——服務節點:  

  1. 同一服務器上的服務起停、服務狀態信息採集、發佈、配置管理、自定義消息通知。

同一服務器上的服務監控,異常退出、僵死等監控重啓

        node提供的接口:

patch(patch指定服務)、stopAllServers(關閉nodes上所有服務)、

startServer(啓動指定服務):

使用sFullExeFileName      //默認使用啓動腳本路徑 stopServer接口也是同理

getState獲取指定服務狀態:

   ServerObjectPtr pServerObjectPtr = ServerFactory::getInstance()->getServer( application, serverName );
    if ( pServerObjectPtr )
    {
        result += "succ";
        return pServerObjectPtr->getState();
    }

八、patch服務

——統一發布

  1. 通過web管理所有需要發佈的服務和文件的目錄
  2. 提供客戶端(patchclient)可以從Patch服務同步文件和目錄到遠程
  3. 可以單獨使用也可以和node配合使用完成發佈動作

listFileInfo(獲取路徑下所有文件列表信息)、download(下載文件)

九、Taf-Log  ——日誌中心

日誌服務器,用於接收遠程日誌。業務服務以框架層的api異步發送日誌到日誌服務器

例子:

#define LOG_STAT(type)              FDLOG(type)

其中FDLOG的定義在庫文件的taf_logger.h定義如下:

#define FDLOG(x)        (TafTimeLogger::getInstance()->logger(x)->any())

TafTimeLogger::getInstance()->logger(x)函數生成並返回:TimeLogger

typedef TC_Logger<TimeWriteT, TC_RollByTime> TimeLogger; TimeLogger的定義如下:

typedef TC_Logger<TimeWriteT, TC_RollByTime> TimeLogger;其中TC_Logger爲日誌基類模板:模板第一個參數TimeWriteT負責 寫Logger.在applicantion服務啓動的時候會調用設置遠程日誌服務器對象的服務:例如log=LogServer.taflog4nmrqsh2.LogObj

TafTimeLogger::getInstance()->setLogInfo(_communicator, ServerConfig::Log, ServerConfig::Application, ServerConfig::ServerName, ServerConfig::LogPath);

這裏底層實現函數如下:會獲取遠程日誌服務器的地址

具體寫日誌的時候,TimeWriteT類重載了operator() ,會調用遠程日誌服務的logger接口寫遠程日誌,從而實現了日誌從本地到遠程日誌服務器的功能

_logPrx->logger(DYEING_DIR, DYEING_FILE, "day", "%Y%m%d", vDyeingLog);

 

十、WEB  — 管理平臺

  1. 提供服務狀態信息查詢和起停服務、設置服務日誌級別、發送自定義命令等操作頁面
  2. 提供部署服務、自動編譯發佈、配置管理等運維操作頁面
  3. 提供自動測試操作界面
  4. 展示服務性能指標數據
  5. 展示業務特性指標數據

 

 

 

 

 

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