? ? ? ?介紹部署方式的文檔很多涨椒,這里就不多做介紹了器钟,更多的本次部署的經(jīng)驗(yàn)教訓(xùn)津坑,框架的模式等的總結(jié)。
? ? ? ?公司需要發(fā)布一套云環(huán)境產(chǎn)品傲霸,因此需要選擇一套框架完成服務(wù)發(fā)現(xiàn)疆瑰、服務(wù)監(jiān)控、服務(wù)預(yù)警的全過程昙啄。
? ? ? 經(jīng)過比對(duì)穆役,決定選擇Prometheus和Consul作為核心組件,Grafana梳凛、AlertManager和其他組件耿币,完成全部過程。其完成結(jié)構(gòu)圖如下:
先說一下Prometheus監(jiān)控體系的問題:
1伶跷、結(jié)構(gòu)比較復(fù)雜
? ? ? 組件非常多掰读,從圖中可以看到秘狞,整個(gè)結(jié)構(gòu)組件幾十上百個(gè)叭莫。
? ? ? 結(jié)構(gòu)上的復(fù)雜,也帶來了部署上的困難烁试。這個(gè)后面講部署的時(shí)候再詳細(xì)說雇初。
? ? ? 另外就是結(jié)構(gòu)的復(fù)雜還帶來了維護(hù)的困難,因?yàn)榻M件分散在各處(集中存放的話减响,同服務(wù)端口配置會(huì)很麻煩)靖诗,需要時(shí)刻維護(hù)一個(gè)結(jié)構(gòu)圖郭怪,以保證整個(gè)結(jié)構(gòu)的可維護(hù)性。
2刊橘、prometheus的集群穩(wěn)定性
? ? ? 包括prometheus和alertmanager組件在內(nèi)鄙才,都存在集群可用性的問題。
? ? ? prometheus官方給出的解決方案促绵,要么是不集群攒庵,即各服務(wù)均單獨(dú)維護(hù),或者使用統(tǒng)一的數(shù)據(jù)庫败晴,以保證整體的集群數(shù)據(jù)一致性浓冒。前者顯然不能保證數(shù)據(jù)一致性,后者帶來的配置復(fù)雜性又會(huì)成倍提高(配置內(nèi)置數(shù)據(jù)庫還是外置數(shù)據(jù)庫也同樣是個(gè)問題)尖坤,給運(yùn)維(架構(gòu))同學(xué)會(huì)帶來持續(xù)的壓力稳懒。
? ? ? ? alertmanger在官方文檔中,其提法是在某個(gè)版本后慢味,只需要如下配置即可:
? ? ? 但是然并卵场梆,經(jīng)過多次測試,這種配置纯路,同一個(gè)信息一定會(huì)被多個(gè)接收端同時(shí)接收到辙谜,并不是同一個(gè)告警信息所有alertmanager實(shí)例只發(fā)送一次。必須使用原有的參數(shù)配置感昼,即:
? ? ? 才能完成alertmanager的同步装哆,但是又然并卵,某些情況下仍然存在問題定嗓,后面再說蜕琴。
另外就是prometheus的默認(rèn)數(shù)據(jù)庫,官方的說法是:
? ? ? ? ? Note that a limitation of the local storage is that it is not clustered or replicated. Thus, it is not arbitrarily scalable or durable in the face of disk or node outages and should thus be treated as more of an ephemeral sliding window of recent data. However, if your durability requirements are not strict, you may still succeed in storing up to years of data in the local storage.
? ? ? ? ? 簡單說宵溅,就是官方自己也不推薦你強(qiáng)依賴這套數(shù)據(jù)庫凌简,除非你的持久化需求不太強(qiáng)烈。也就是說如果你的環(huán)境壓力比較大恃逻,數(shù)據(jù)量很大雏搂,持久性和一致性要求比較高,那么抱歉寇损,你換一個(gè)數(shù)據(jù)庫吧凸郑,比如influxDB。
3矛市、exporter組件來源不統(tǒng)一
? ? ? 因?yàn)閜rometheus只是給出了數(shù)據(jù)聚集的解決方案以及存儲(chǔ)和查詢的解決方案芙沥,其本身并不負(fù)責(zé)從各終端拉取狀態(tài)服務(wù)信息,服務(wù)信息的拉取是依靠不同的exporter完成的。而其官方又沒有提供全部的exporter(嚴(yán)格說而昨,基本就沒幾個(gè)exporter是官方提供的)救氯,這就帶來了幾個(gè)問題。
? ? ? 首先是exporter需要從不同的渠道進(jìn)行收集歌憨,最大的來源是prometheus文檔和github着憨,也存在其他的渠道,所以第一是需要你自己去找exporter务嫡,其次是你得選擇一個(gè)合適的來用(可能找到多個(gè)享扔,當(dāng)然也有可能找不到)。
? ? ? 其次是標(biāo)準(zhǔn)不同植袍,因?yàn)檫@些都是社區(qū)貢獻(xiàn)惧眠,而始作俑者只是給出了答案的格式而沒有約定部署方式,所以各個(gè)exporter的部署方式都不一樣于个,需要逐個(gè)摸索熟悉和了解氛魁,甚至有些連文檔都沒有。所以工作的最后一步一定是把啟動(dòng)命令用腳本記錄下來厅篓,并且歸檔保存以備后用秀存。
? ? ? 最后是不同的使用方式導(dǎo)致集成的方式也不同,大部分exporter是獨(dú)立運(yùn)行的羽氮,但也有部分exporter是跟其他服務(wù)嵌套在一起使用的或链,其使用復(fù)雜度就更高了,這就導(dǎo)致其維護(hù)難度更高档押,典型的例如jmx插件以及nginx的vts插件澳盐,都是典型的嵌套組件,一旦運(yùn)行環(huán)境發(fā)生變化令宿,又需要持續(xù)進(jìn)行維護(hù)叼耙。
? ? ? 簡而言之,整個(gè)exporter組件就是難查詢粒没、難部署筛婉、難維護(hù),是維護(hù)是非常耗時(shí)耗力的過程癞松。
4爽撒、監(jiān)控信息需要定制
? ? ? 標(biāo)準(zhǔn)輸出的監(jiān)控信息更多的普遍化的信息,如果需要更個(gè)性化的內(nèi)容响蓉,就需要自己定制開發(fā)了硕勿,所以這部分工作是無法省去的。例如java后臺(tái)程序的監(jiān)控是由插件完成的厕妖,但如果你希望收集更詳細(xì)的首尼,例如500接口的時(shí)間和次數(shù)等信息,就必須自己開發(fā)監(jiān)控內(nèi)容以及圖標(biāo)信息了言秸。
5软能、集成的匹配度不高
? ? ? 這點(diǎn)主要表現(xiàn)在consul和prometheus之間的集成,本來是希望自動(dòng)完美集成举畸,但是實(shí)際用到才發(fā)現(xiàn)查排,很多地方是需要二次配置的,最典型的就是如何保證consul自己不進(jìn)入到prometheus的集成監(jiān)控列表中抄沮,如何調(diào)整對(duì)應(yīng)的標(biāo)簽信息等跋核,這種幾乎做匹配就需要做處理的地方,官方卻沒有給出任何的最佳實(shí)踐的文檔叛买,不得不說是一種缺陷砂代。
? ? ? 上面基本聊完了這套架構(gòu)的缺點(diǎn),再說說優(yōu)點(diǎn)吧率挣。
1刻伊、全部開源
? ? ? 這點(diǎn)當(dāng)然是最重要的,我們幾乎可以在社區(qū)找到我們一般需求的全部組件椒功,不需要自己再次開發(fā)捶箱,對(duì)于成本壓力比較大的公司而言,這當(dāng)然是非常好的選擇动漾。
2丁屎、開箱即用
? ? ? 目前的組件除了極個(gè)別需要你下載自己編譯之外,所有的組件都是開箱即用的(不管這個(gè)過程是不是那么舒服)旱眯。
3晨川、功能基本滿足基本需求
? ? ? 如果你對(duì)監(jiān)控內(nèi)容的要求不是特別高的話,那么一般的監(jiān)控信息已經(jīng)可以滿足你絕大部分的需求了删豺,二次開發(fā)的工作量可以降到最低础爬。
4、支持集群
? ? ? 無論官方給出的集群方案是否完美吼鳞,但至少是存在開源的免費(fèi)集群方案的看蚜,這比收費(fèi)和自己建設(shè)簡單多了。
一句話總結(jié)一下赔桌,prometheus監(jiān)控體系的優(yōu)點(diǎn)就是入門簡單供炎,缺點(diǎn)就是后續(xù)成本比較高。
? ? ? 再聊一下consul這套架構(gòu)疾党,照例還是先說說里面的坑音诫。
? ? ? 1、配置沖突
因?yàn)楹蠖硕际鞘褂胹pringboot為主的微服務(wù)雪位,因此consul的集成依賴了springcloud中關(guān)于consul服務(wù)發(fā)現(xiàn)的部分竭钝。這里提示大家一下,如果你使用的springcloud中的其他服務(wù)發(fā)現(xiàn)模式,例如你很不巧的用了zk作為配置中心香罐,并使用了springcloud的相關(guān)組件來注入屬性卧波,那么你很快會(huì)發(fā)現(xiàn)你的服務(wù)在引入了consul和zookeeper之后,無法啟動(dòng)了庇茫。因?yàn)樗麄兌甲?cè)了org.springframework.boot.autoconfigure.EnableAutoConfiguration這個(gè)bean港粱,同一個(gè)bean顯然是不能同時(shí)存在于spring的context中的,這里推薦一個(gè)github上貢獻(xiàn)的開源解決策略:
https://github.com/cloud-ready/spring-cloud-service-discovery
? ? ? 但里面的代碼可能并不是都用得上旦签,大家可以自行調(diào)整筷频,抓住關(guān)鍵即可油航。
? ? ? 2、管理復(fù)雜
? ? ? 為了簡化各項(xiàng)目配置,consul的服務(wù)地址均使用了默認(rèn)的localhost:8500這個(gè)地址惩猫,這就意味著每臺(tái)宿主機(jī)都必須有一個(gè)consul的client端在工作们豌『芬郑可以想見的是易桃,隨著宿主機(jī)的增多,consul-client的數(shù)量也會(huì)持續(xù)增加朵纷,對(duì)它們的管理勢必會(huì)持續(xù)增大管理成本炭臭。
? ? ? 這個(gè)問題還容易出現(xiàn)端口沖突,因?yàn)閏onsul占用的端口比較多(5個(gè)端口)袍辞,且位于8000-9000號(hào)段(8500,8300,8301,8302,8600)鞋仍,是比較容易跟其他應(yīng)用的端口發(fā)生沖突的,實(shí)際操作中搅吁,如果對(duì)該機(jī)制不熟悉威创,則很容易在配置時(shí)提前占用相關(guān)接口。
? ? ? 3谎懦、注銷機(jī)制
? ? ? consul的注銷機(jī)制是存在問題的肚豺,但是最近的測試發(fā)現(xiàn)似乎最新的server端已經(jīng)增加了一段時(shí)間不在線即注銷對(duì)應(yīng)的服務(wù)實(shí)例的操作,不過并沒有專門進(jìn)行測試界拦。但無論如何吸申,某一個(gè)服務(wù)實(shí)例宕機(jī),如果想通過consul-server端進(jìn)行api調(diào)用注銷仍然是不可行的享甸,你只能通過該實(shí)例注冊(cè)的consul-client進(jìn)行注銷截碴。
? ? ? 4、pull機(jī)制
? ? ? 這個(gè)問題在prometheus也存在蛉威,默認(rèn)情況下日丹,數(shù)據(jù)都是由server端從client端拉數(shù)據(jù)的,因此client端向server端注冊(cè)時(shí)蚯嫌,必須保證逆向可達(dá)哲虾,這一點(diǎn)在ip和網(wǎng)絡(luò)配置上是存在一定環(huán)境要求的丙躏,這種模式雖然解決server端可能會(huì)被client同時(shí)請(qǐng)求而壓垮的場景,但是也帶來了逆向必須可達(dá)的環(huán)境要求束凑,給開發(fā)和調(diào)試會(huì)帶來一定困難晒旅。
? ? ? 再說說consul架構(gòu)的優(yōu)勢
? ? ? 1、與終端解耦
? ? ? consul不是spring開發(fā)湘今,開發(fā)之處就是可以接入各種終端的敢朱,這方面能力不需要擔(dān)心剪菱。
? ? ? 2摩瞎、接入便捷
? ? ? 默認(rèn)環(huán)境下,java后端接入成本極低孝常,開發(fā)人員無需感知旗们。
? ? ? 3、服務(wù)穩(wěn)定
? ? ? 在集群模式和拉數(shù)據(jù)模式下构灸,server壓力可控上渴,不用太過于擔(dān)心其穩(wěn)定性問題。
? ? ? 4喜颁、和prometheus接入簡單
? ? ? prometheus官方支持consul接入稠氮,因此在初步接入層面比較容易,不需要額外開發(fā)和配置半开。(這也是選擇這兩套搭伴使用的很重要原因)
? ? ? 5隔披、開源和開箱即用
? ? ? 與prometheus相同。
? ? ? 再說一下其他組件的優(yōu)缺點(diǎn):
? ? ? 1寂拆、Grafana
? ? ? ? Grafana的可用性很高奢米,圖表插件非常多,完全可以根據(jù)自己的需求進(jìn)行選用纠永,并且社區(qū)上傳了大量的Dashboard可供使用鬓长,因此其優(yōu)勢與其他組件類似,開源尝江、開箱即用等涉波。但其社區(qū)貢獻(xiàn)也帶來了如exporter一般的問題,首先是Dashboard和exporter的匹配度普遍不高炭序,下載之后需要大量的二次調(diào)整(花費(fèi)了相當(dāng)?shù)臅r(shí)間)怠蹂,其次就是接入的api不友好,例如接入prometheus少态,其接入api即為prometheus的時(shí)序數(shù)據(jù)庫的查詢語句城侧,由于不熟悉,也導(dǎo)致需要大量時(shí)間進(jìn)行熟悉的理解彼妻。最后就是缺少列表信息的內(nèi)容嫌佑,社區(qū)的Dashboard主要由各種圖表構(gòu)成豆茫,做整體分析是ok的,但是問題定位的時(shí)候就顯得力不從心了屋摇。
? ? ? 2揩魂、alertmanager
? ? ? 剛才已經(jīng)提到了alertmanager的集群問題,alertmanager集群即便使用了官方的cluster配置炮温,仍然會(huì)在某些情況下出現(xiàn)重復(fù)發(fā)送消息的問題火脉。實(shí)測是在某服務(wù)down后,啟動(dòng)該服務(wù)柒啤。觀察日志發(fā)現(xiàn)倦挂,down的時(shí)候確實(shí)只收到了一條消息,但是很奇怪的是啟動(dòng)的時(shí)候也會(huì)收到信息担巩,并且此時(shí)是兩條信息方援。因?yàn)椴]有配置服務(wù)上線的告警信息,所以只可能是服務(wù)down的提示信息涛癌,暫時(shí)還沒有去深入了解相關(guān)文檔(也不確定有沒有相關(guān)文檔)犯戏。
? ? ? 其次就是alertmanager的匹配規(guī)則配置很復(fù)雜,是在prometheus的時(shí)序數(shù)據(jù)庫的基礎(chǔ)上做二次定制拳话,也意味著如果你中間更換數(shù)據(jù)庫先匪,那么之前的配置需要重新調(diào)整。這個(gè)對(duì)于后期配置開發(fā)是非常不利的弃衍,尤其其鍵值還依賴exporter的metrics信息呀非,從編碼的角度而言,這里缺少接口的封裝笨鸡,對(duì)于程序的可維護(hù)性是非常不利的姜钳。
? ? ? 大致就是這些了,下面再列一下目前使用到的組件以及相關(guān)信息形耗。
? ? ? 以下是用到的exporter的組件列表哥桥。
組件名來源啟動(dòng)命令備注
jmx_exporter
https://github.com/prometheus/jmx_exporter
需要內(nèi)嵌至容器啟動(dòng)命令中 JAVA_OPTS="$JAVA_OPTS -javaagent:/*/prometheus_exporter/jmx/jmx_prometheus_javaagent-0.11.0.jar=9151:/*/prometheus_exporter/jmx/tomcat.yaml"不同的jmx監(jiān)控對(duì)象需要配置不同的yaml文件以約定其輸出內(nèi)容,配置文檔見最后的附件
node_exporter
https://github.com/prometheus/node_exporter
nohup ./node_exporter --web.listen-address=":8909" >nohup.out 2>&1 &
nginx_vts_exporter
https://github.com/hnlq715/nginx-vts-exporter
這個(gè)插件需要依賴nginx支持相關(guān)功能激涤,當(dāng)nginx支持后拟糕,啟動(dòng)該exporter即可
php-fpm-exporter
https://github.com/bakins/php-fpm-exporter
nohup ./php-fpm-exporter.linux.amd64 --addr x.x.x.x:xxxx --endpoint http://x.x.x.x:xxxx/php_fpm_status >nohup.out 2>&1 &
依賴php-fpm的功能,一般需要在nginx進(jìn)行配置后方可使用
mysql_exporter
https://github.com/prometheus/mysqld_exporter
./mysqld_exporter --log.level=debug --web.listen-address=:8908 --config.my-cnf=mysql.cfg --collect.auto_increment.columns --collect.global_status
1倦踢、需要一個(gè)有權(quán)限的賬號(hào)
2送滞、需要配置一個(gè)配置文件,輸入mysql的信息
我的配置信息如下:
[client]
host=
port=
user=
password=
redis_exporter
https://github.com/oliver006/redis_exporter
nohup ./redis_exporter -web.listen-address=":8912" -redis.file=redisconfig.cfg >nohup.out 2>&1 &?
配置文檔信息:redis://xx.xx.2.xx:xxxx,password
zookeeper_exporter
https://github.com/carlpett/zookeeper_exporter
./zookeeper_exporter -bind-addr=:8902 -zookeeper=localhost:8182
貌似不支持單機(jī)集群采集辱挥,待驗(yàn)證
mongodb_exporter
https://github.com/dcu/mongodb_exporter
./mongodb_exporter --web.listen-address=:8919 --mongodb.uri=mongodb://user:password@uri:port
需要構(gòu)建用戶到mongo數(shù)據(jù)庫中
下面是grafana的內(nèi)容模板:
http://note.youdao.com/noteshare?id=996753825eac4fd3e7c6dafcf498bb64
A9QZ
沒有貼編號(hào)的原因是里面大多數(shù)都有過修改犁嗅,如果直接使用前面的exporter,應(yīng)該是可以直接對(duì)接的晤碘。