簡介
背景
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包啟動服務即可