01 . 全鏈路監控CAT簡介及部署

men發表於2020-06-18

簡介

背景

CAT(Central Application Tracking)是由吳其敏(前大眾點評首席架構師,現攜程架構負責人)主導設計基於Java開發打造的實時應用監控平臺,為大眾點評網提供了全面的監控服務和決策支援。AT作為大眾點評網基礎監控元件,它已經在中介軟體框架(MVC框架,RPC框架,資料庫框架,快取框架等)中得到廣泛應用,為點評各業務線提供系統的效能指標、健康狀況、基礎告警等。

吳其敏採訪及一些備註

分散式系統已經誕生了很長時間,隨著計算能力和儲存價格的降低,我們見證了分散式系統大爆炸的時代,現代網際網路公司規模都變得異常龐大,系統也變得越來越複雜,給監控工作帶來了極大的難度:海量日誌資料如何處理,服務如何追蹤,如何高效定位故障縮短故障時常……

監控作為運維工作中最重要的環節,一直是運維工作者關注的話題。

吳其敏是平安銀行零售網路金融事業部首席架構師,曾在 eBay 工作多年,先後擔任過大眾點評和攜程的架構負責人,同時吳其敏也是開源的實時監控系統 CAT 的作者。

吳其敏老師擔任本屆 InfoQ 全球運維技術大會 CNUTCon 的聯席主席,聽說有幾個出品人也是吳其敏老師的學生.

吳其敏: 我理解的常用監控手段

按監控層次分:業務監控、應用監控和基礎監控等;

按監控日誌來源分:基於日誌檔案監控、基於資料庫監控和基於網路監控等;

按監控領域分:前端監控、後端監控、全鏈路監控、業務間監控等;

按監控目標分:系統故障監控、業務指標監控、應用效能監控、使用者行為監控、安全合規監控等。

監控領域非常複雜,像開源實施分散式監控系統 CAT,從監控分層看,它擅長應用監控,有一定的業務監控和基礎監控能力;它是基於網路來完成日誌資料的傳輸的,將來會支援日誌檔案和資料庫作為資料來源;它已經覆蓋前後端監控能力,通過良好的實施可以做到全鏈路監控和業務間監控,監控的目標更是非常多樣化。但 CAT 對監控團隊的技術開發和運維能力提出了很高的挑戰,一般在大型網際網路公司,都設有專門的監控研發團隊,基於 CAT 做二次開發,支援業務的多樣化需求。

分散式系統的監控難點在哪裡?如何解決?

吳其敏:

太多了!以 CAT 為例,CAT 在美團點評每天新增監控日誌量有 400TB 以上(部分系統日誌取樣),在攜程也早就超過 300TB,在這樣的資料量壓力下,通常情況下的一個小問題都會被放大千倍萬倍,成為一個大問題,要麼是系統穩定性受到影響,要麼系統吞吐量有問題,要麼系統出現熱點導致資源使用不平衡而浪費,要麼儲存系統頂不住等,最可拍的是監控出問題導致的業務問題。

CAT 在設計之初就充分認識到監控領域是一個深水區,對每一方面領域問題都非常重視,對每一個新報表都經過長時間多角度的推敲認證,在編碼實現時每一行核心程式碼都經過嚴格 Review,最極端的情況下一個類每一行程式碼 Review 後都需要修改。

CAT 具備單機開發條件,也就是說只要一臺機器,一下子就可以將 CAT 系統啟動起來,進行開發、測試和排障,開發效率極大提升,同時核心系統有大量單元測試覆蓋,輔以完善的建模和程式碼生成工具,研發效率保持很高。

CAT 可以做到監控 CAT(最底層監控除外),即構建起了一個最小的應用場景,同時可以完善 CAT 自身能力,這一點也是非常重要的;輕量而獨立的平臺,是 CAT 的一個重要特點,很多人經常會問:Spring 是現在最流行的框架,功能強大,CAT 為什麼不依賴它?我想說這裡面有一個依賴層次問題,一般都是高層依賴低層的,不會底層要反向依賴高層的,否則會出現什麼問題呢?其實這就是典型的耦合性問題,底層依賴於高層,底層的應用範圍就會收到嚴重的約束,就像 C# 是一門好語言(除了 PHP 哈),C# 要做.NET CLR 上執行,.NET 有需要跑在 windows 上,就很容易想象.NET 現在所面臨的窘境了。當然.NET core 經過改造應該也是可以跑在 Linux 上了,但是功能還是收到很大的限制。

像 CAT 客戶端 SDK,我們剛開始的目標就是可以跑在 JDK 1.6 以上,各種不同的平臺上,包括 Spring 和其他技術棧。有了這一個假設,就意味著 CAT 要儘可能少的依賴其他執行時元件,如果一定要依賴的話,最好也要避免與上層應用發生任何衝突,比如最基本的 log 和網路通訊元件 netty 等。但是在系統整合方面,CAT 是可以與各種流行的規範、系統和元件做更好的整合的,比如標準的 J2EE Web 專案,只要做 WAR 配置一個 filter 即可,針對 spring 也可以加一個自動註冊的 filter 等等,做這些外圍的整合,挑戰應該不會很大,大家也可以自己完成。

​ 再說說資料量方面的挑戰吧,如果每天有 300TB 的資料量,意味著正常情況下平均每秒要處理 6GB 的資料量(高峰時加倍,與網站業務型別有關),至少需要 60 塊千兆網路卡(1Gb)共同來完成,先不說監控資料怎麼採集,就傳輸這麼多資料到 CAT 系統做分析就是一個很大的挑戰。有人會說,能不能做客戶端先做一些預處理,比如聚合分析,或者灰度取樣,或者壓縮?可以,但是這可能會犧牲資料處理的多樣化(有些報表會沒有明細)和時效性,並且增加業務節點的計算和儲存負擔。傳輸問題最核心的是如何解決多節點間負載不均衡的問題,這個問題看似是小問題,實際上是一個涉及整個系統架構的機制問題,CAT 在這方面有很多考慮,細節將來有機會再分享。

傳輸問題之後是就是怎麼消費的問題,CAT 在日誌訊息的序列化 / 反序列化效率,日誌訊息非同步化分發和獨立執行緒內消費,分領域分時段統計等機制(小時報表、日報表、週報表、月報表等)。CAT 有一個很好的機制是可以做到在單一執行緒內,不強調執行緒安全,可以大大簡化程式碼編寫要求,降低同步問題發生的概率,保持程式碼良好的可讀性,和執行時高效率。但是從長遠發展來看,儲存問題是大資料量應用永遠要面對的挑戰。儲存不但要解決吞吐問題,不能有堆積,同時還要解決財務成本問題,關注價效比,小企業還好,大企業會特別關注這一塊。CAT 的儲存引擎已經發展到了第六版本(V6),每一個版本都是重新設計,從頭再來。V6 版本從構思到編碼、到整合驗證上生產,歷史半年之多,方方面面的挑戰都很大。結果不錯,它與 V5 引擎讀寫效率大幅提升,檔案數大大減少(具體數字尤勇在美團點評的 CAT 分享中有提及)。

如果上面說的都是技術實現方面的挑戰,那麼 CAT 監控實施落地將是另一個挑戰。不管是在程式碼中做侵入式埋點,還是通過位元組碼技術做無侵入埋點,監控首先要解決的是目標設定,到底要解決什麼問題,關注什麼指標,不管現存的還是潛在的,如果沒有問題就不需要監控。如果目標明確了,第二步就可以指定方案,怎麼樣通過已有的機制解決,或者使用新的創造性的方法,達到目標。接下來就是方案的落地實施了,資料在哪裡,需要通過什麼手段拿到,通過 CAT API 傳遞到後臺分析。最後一步,就是等系統上線有結果後,需要去做驗證,是不是真的達到了預期,還是目標設定需要調整。這四步可以不斷迭代,直到各種監控問題都可以被解決。

國內外有哪些比較好的分散式系統監控專案

吳其敏:

國內外分散式系統監控專案應該有很多,能開源並且願意開源的不多,最近比較常用的,國外有 ELK、ZipKin 和 Pinpoint,國內的有 CAT、SkyWalking、Open-falcon 等。真正經過大公司的多場景和大流量考驗的應該不多,CAT 算一個吧。目前 CAT 在國內數百家公司有自發部署,感興趣的開發者有上千人。最近美團點評對 CAT 的開源高度重視,大力投入,加上幾個大中型網際網路公司(如攜程,平安銀行、獵聘網、陸金所等)的大量應用,相信 CAT 將來會更加廣泛應用。ELK 是基於日誌檔案做監控的,ZipKin 和 Pinpoint 有些功能不錯,小公司用的多一點,相對比較簡單,功能不是很豐富,公司做大了以後會碰到很多可擴充套件性方面問題。

分散式監控系統包含哪些模組

吳其敏:

​ 一個監控系統往往包含日誌採集、日誌傳輸、日誌分析、日誌報表、日誌儲存和報表展示等關鍵模組,系統通過每一個模組等分工協作來共同完成。不同的產品應該有不同的側重點和優勢,CAT 架構設計力求簡單高效,開發簡單,運維簡單、高效執行。之前跟一個大廠做過一個對比,它的監控系統機器數與被監控的應用機器數比是 30 左右,而 CAT 是 300。

​ 意思也就是說,跟美團一樣的超一線網際網路公司,他們伺服器是一臺監控機對應三十臺,而cat監控能做到一臺監控三百臺.

為什麼想做Cat這個專案,cat的優勢在那些方面,還有那些地方不怎麼完善?

吳其敏:

說起來話長,應該說是 7 年前(2011 年末)我剛到大眾點評的時候(那時候美團與點評還沒有合併),本來是信心滿滿的,以為在 eBay 十多年學了一身的本領,可以大展身手的。沒想到當時大眾點評整個網站經常有各種各樣的故障,弄得大夥不得安寧,領導們也很著急,出問題總是導親自在現場指揮,甚至親自到電腦上排查問題,也不乏有湊熱鬧者將領導圍得裡三層外三層,場面非常壯觀(可惜當時沒有拍照)。一會懷疑網路問題,一會懷疑資料庫問題,一會有懷疑快取有問題,...(此處省略一萬字)。但問題終究是問題,不會因為你是領導就賣你個面子,放你一馬,所以最後故障解決時長總是很長,就是故障恢復了,根因也是不清不楚的。故障過程中經常會有比較沉重冷靜的工程師,突然大叫一聲,我在什麼機器什麼日誌中發現有什麼樣的報錯,可能與故障有關。大家一聽,不妨一試,做相應處理後,一會故障現象消失,故障結束。然而,怎麼縮短故障時長,故障是怎麼形成的,根因是怎麼定位的,還有大家應該從此次故障中吸取什麼樣的教訓,經常是不明不白的。

在這樣的一種情況下,我突然意識到,原來公司最缺的是應用監控,上面的一堆問題只是缺乏好監控而導致的現象。現在大家可能知道,eBay 內部有一套很好的應用監控叫 CAL,據說是 eBay 的一大法寶。我沒有參與 CAL 的研發,但是我是資深的使用者,時不時也會給兄弟團隊分享 CAL 的使用經驗。於是我主動請纓要做監控,寫下 CAT 第一行程式碼,剛開始的幾個月就是我一個人,從架構師到程式設計師,從後端到前端,從測試到運維,全部自己搞定。

CAT 的優勢應該有很多,分散式叢集、豐富的實時報表、全量日誌採集、高可靠 / 高可用系統等。監控領域這麼大,CAT 不完善的地方肯定也是很多了,比如學習門檻高、定製難、易用性不夠、與其他生態的整合度不夠、對語言的支援還是不夠多(雖然已經有了對 C/C++、Python、golang、Node.js 等語言對支援)、對非同步多執行緒的支援力度不夠、後臺配置管理有待加強、與 docker 等雲整合不夠等等。這些都是將來需要與社群一起不斷完善的,也歡迎大家加入到 CAT 的社群來。

研發CAT時有哪些印象深刻的事情

吳其敏: 還是講一講CAT剛開始研發時的事吧,

​ 當時大眾點評已經有一個監控系統 Hawk,它是基於資料庫儲存日誌的(那時候還沒有 ELK),已經開發了近一年時間,基本能用,正在全面推廣階段。我加入大眾點評後,聽完他們介紹以後,就覺得可擴充套件性很有問題。於是提出要研發一套新的監控系統,畫了一個好大的一個腦圖(可惜那臺電腦壞了,圖拿不出來),跟公司相關同事介紹需求的時候,大家聽得一愣一愣的,現場連一個問題也沒有,我當時的感覺是:他們肯定覺得老吳在吹牛,反正架構師嘛大家都懂得,說說都是容易的。當我要求 Hawk 系統停止推廣,一下子很多人來找我,表示各種擔憂或者不解。那是時候,我就下定決心,一定要做 CAT,玩意搞砸了就走人唄,反正 eBay 是隨時歡迎我回去的。然後我就一個人默默的做設計和開發,現在想想或許這就是我作為一個人程式設計師最好的時光,每天都很充實。還記得那時我的領導找我吃飯時,問我要什麼樣的支援,我就跟領導說,給我幾個月時間,甭管我做什麼,怎麼做,請不要打斷我,就是對我最大的支援。領導同意了我的要求,後來也做到了。經過 2 個月的奮戰,我做出了第一版 CAT 原型,越領導時間給領導做 demo,場景是事先設計好的,也就是在應用正常執行時中做後臺隨便搞幾個錯誤,看看 CAT 能不能精準抓到,準確告訴我錯誤在哪裡,作為架構師這點小技能還是有的。當時演示很成功,領導當場就高興地站起來,拍拍我的肩膀,表示支援我繼續研發。在得到領導的認可和信任後,後面的進展相對來說就比較順利了。當然也不是一帆風順的,出現過幾個小波折,也幫人背過黑鍋,但總體上還算順利。

在雲原生時代的監控有什麼特點

吳其敏:

​ 雲原生時代對應用架構提出了全面的挑戰,監控方面也不例外。但是本質核心的東西沒有變,只是形式有不同。以 docker 為例,雲上應用監控它的粒度比物理機和虛擬機器 VM 都要小,以前很多系統是以 IP 地址來區分叢集節點的,如果一個 docker 例項的 IP 地址不斷地變化,會對監控有挑戰;在 Kubernetes 的 Pod 中的 docker 例項,可能是內部 IP 地址,對外可見 IP 地址是 Pod 地址,這樣可能會導致一些場景串不起來;另一方面,docker 容器應用生命週期可能會比較短,VM 上的應用是重部署,docker 則是銷燬重建,對監控系統可能會有一些新的影響。

在監控領域還關注那些方面?

吳其敏:

​ 在監控領域我倒是比較關注 Visibility,我經常打跟人比方,系統是你開發的,就像你養的小孩,並不意味著你就瞭解它,隨時掌握它的情況。這其中有太多的可變因素可以影響系統的各種架構特性。比如環境配置問題、網路連通問題(這也是背鍋俠之一)、髒資料問題、服務依賴問題、應用負載問題、機器效能問題、甚至是 JVM 和 OS 問題,這些你都是不知道的,也很難事先預測準確。這就需要將這些問題指標通過一種方式展現出來,讓你很清楚它的狀態。沒有度量就沒有改進,沒有監控你就是瞎子,無的放矢。然而提升系統的 Visibility 是很難的,因為它是給人看的,人的要求是多變的,現在這個階段是這樣,等過了這個階段就有更高的需求了,所以伺候好人是很難的。CAT 在易用性方面是有待提高的,但現階段 CAT 主要還是在打造更多的問題場景,先解決基本的溫飽問題,體驗好不好可以留給社群解決。

為什麼要使用cat實時監控
# 1.線上釋出了服務,怎麼知道它一切正常,比如釋出5臺伺服器,如何直觀瞭解是否有請求進來,訪問一切正常。
# 2.當年有一次將線上的庫配置到了Beta,這麼低階的錯誤,排錯花了一個通宵,十幾個人。
# 3.某個核心服務掛了,導致大量報錯,如何確定到底是哪裡出了問題。
# 4.SOA帶來的問題,呼叫XX服務出問題,很慢,是否可以衡量?     
# 5.應用程式有效能瓶頸,如何提供一些有效工具發現?
# 6.如何實時檢視線上藉口的效能,包括壓測,藉口太慢如何定位?
# 7.如何統計線上流量以及介面呼叫量?
# 8.線上介面可用率不到100%,如何進行告警?
# 9.線上伺服器快取,jvm,GC如何進行實時監控?
# 10.程式程式碼執行情況監控,監控一段程式碼執行情況,執行時間統計,次數,錯誤次數等等.
# 11.異常/錯誤等問題監控.
# 12.SQL執行監控.SQL執行監控可以看到每個DAO方法執行解析的SQL語句,SQL語句執行時長,
# 以及連結到那個資料庫(URL)執行;如果SQL執行出現異常,還會記錄異常資訊,另外還可以過濾出慢SQL.

原始碼編譯部署Cat監控

環境清單:
* CentOS  7.3
* jdk-8u121-linux-x64.rpm
* apache-tomcat-8.5.45.tar.gz
* apache-maven-3.3.9-bin.tar.gz
* mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar
* cat-2.0.0.tar.gz
* git  1.8.3.1
IP hostname 軟體 記憶體要求
192.168.122.6 cat-6 Mysql,Tomcat,Maven,git,cat.tar.gz 3G及以上
注意事項
# 網路要穩定,必要時開手機熱點;
JDK,git安裝
curl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo 
curl  -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 
rpm -ivh jdk-8u121-linux-x64.rpm
yum -y install git
Tomcat安裝並啟動
# tomcat官方下載地址:    http://tomcat.apache.org/
# 解壓部署
tar xvf apache-tomcat-9.0.12.tar.gz -C /usr/local/
mv /usr/local/apache-tomcat-9.0.12/ /usr/local/tomcat
tail -1 /etc/profile
CATALINA_HOME=/usr/local/tomcat
source /etc/profile

# 增加熵池大小,解決Tomcat在CentOS7巨慢的問題,具體原因請看Tomcat章節
yum -y install rng-tools
systemctl start rngd && systemctl enable rngd
# 測試tomcat是否安裝成功
/usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
lsof -i:8080
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    14054 root   49u  IPv4  34484      0t0  TCP *:webcache (LISTEN)
Mvnen安裝
# Maven官方下載地址
# http://mirror.bit.edu.cn/apache/maven/
tar xf /root/apache-maven-3.3.9-bin.tar.gz -C /usr/local/
cd /usr/local/
mv apache-maven-3.3.9/ maven
cat >> /etc/bashrc <<EOF
export M2_HOME=/usr/local/maven
export M2=\$M2_HOME/bin
export PATH=\$M2:\$PATH:\$HOME/bin:/usr/bin/git
EOF
source  /etc/bashrc
mvn -version
配置資料庫
yum -y install net-tools
rpm -e mariadb-libs --nodeps
tar xvf /root/mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar -C /usr/local/
cd /usr/local/
rpm -ivh mysql-community-server-5.7.23-1.el7.x86_64.rpm  mysql-community-client-5.7.23-1.el7.x86_64.rpm mysql-community-common-5.7.23-1.el7.x86_64.rpm mysql-community-libs-5.7.23-1.el7.x86_64.rpm 


# 或者使用yum安裝mysql
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

rpm -ivh mysql57-community-release-el7-10.noarch.rpm 
yum install -y mysql-community-server
  
systemctl start  mysqld.service

# 修改Mysql密碼下面有三種辦法
# 1.剛安裝好的mysql,可以從/var/log/mysqld.log獲取臨時密碼
grep  "password"  /var/log/mysqld.log   
        [root@mysql ~]# mysql -uroot -p
    Enter password:
    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'ZHOUjian.22';

# 2.mysqladmin -uroot -p password "ZHOUjian.22"
    Enter password:

# 3.實驗環境不知道root密碼操作方法如下
sed -i '/\[mysqld]/ a skip-grant-tables' /etc/my.cnf
systemctl restart mysqld
mysql <<EOF
        update mysql.user set authentication_string='' where user='root' and Host='localhost';
        flush privileges;
EOF
sed -i '/skip-grant/d' /etc/my.cnf
systemctl restart mysqld
mysqladmin -uroot -p password "ZHOUjian.20"
Enter password:              # 此處回車一下即可

CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
 GRANT ALL ON sonar.* TO sonar@"%" IDENTIFIED BY "ZHOUjian.20";

flush privileges;
Cat原始碼包下載
yum -y install wget
wget -O /root/cat-2.0.0.tar.gz https://codeload.github.com/dianping/cat/tar.gz/v2.0.0
tar xvf /root/cat-2.0.0.tar.gz  -C /opt/
cd /opt/cat-2.0.0/
mkdir -p /data/appdatas/cat && mkdir -p /data/applogs/cat
mvn install -Dmaven.test.skip=true		# 我開熱點差不多下載了十分鐘,很多小jar包檔案



# 如果用這種方式maven報錯使用下面方法
git clone https://github.com/dianping/cat.git	
cd cat
mvn clean install -DskipTests
# 再用maven構建專案,提示100%
mvn cat:install							# 不到十秒鐘,會出現三串提示,輸入MysqlIP:Port
		格式:			jdbc:mysql://127.0.0.1:3306
		Mysql使用者名稱:	root
		Mysql密碼:	XUANji.19
	
cd /opt/cat-2.0.0/cat-home/
mvn jetty:run							# 稍等一分鐘,啟動要下載一點jar包;
ss -antp | grep 2281		# 出來埠就可以瀏覽器訪問了


# 如果需要tomcat部署將cat-home/target下有一個cat-alpha的war包,
# 放到tomcat的webapps目錄下,重新命名為cat.war包啟動服務即可

相關文章