夜鶯官方文檔優化第一彈:手把手教你部署和架構講解,消滅所有部署失敗的 case!干!
前置說明
各種環境的選型建議
- Docker compose 方式:僅僅用于簡單測試,不推薦在生產環境使用 Docker compose,升級起來挺麻煩的,除非你對 Docker compose 真的很熟
- 二進制部署:最推薦的方式,穩,升級也方便
- Helm 方式:公司大規模使用了 Kubernetes,可以選擇 Helm 方式,前提是貴司對 Helm 這套真的很熟
- 存儲選型:如果之前沒有部署過,是個新環境,時序庫選型建議使用 VictoriaMetrics,單機版 VictoriaMetrics 就可以抗住每秒上百萬數據點,性能很好,CPU、內存的占用都比 Prometheus 少,而且,完全兼容 Prometheus 的查詢接口
- 時間校準:社區反饋的很多問題都是因為機器時間沒有校準,監控系統對時間很敏感,請各位先把機器時間校準一致,讓服務端的機器、時序庫的機器、要監控的目標機器、瀏覽器所在的 PC 時間,都保持一致
用戶名密碼
默認用戶是 root,密碼是 root.2020。
使用 Docker compose 快速體驗
具體可以參考這個文檔。不推薦使用,除非你對 Docker compose 真的很熟!
安裝前置依賴
我們更推薦二進制的方式來部署,后文都是以二進制的方式來說明部署方式以及架構。夜鶯依賴 mysql 存儲用戶配置類數據,依賴 redis 存儲 jwt token 和機器心跳上報的 metadata,所以,先準備 mysql 和 redis。這倆組件請大家自行安裝,這里也提供一個小腳本來安裝這兩個組件,大家可以參考:
# install mysql
yum -y install mariadb*
systemctl enable mariadb
systemctl restart mariadb
mysql -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('1234');"
# install redis
yum install -y redis
systemctl enable redis
systemctl restart redis
上例中 mysql 的 root 密碼設置為了 1234,建議維持這個不變,后續就省去了修改配置文件的麻煩。如果你想修改默認用戶名和密碼,就要對應的修改配置文件中的 mysql 連接信息,配置文件的哪個地方配置了 mysql 的密碼呢?通過下面的命令可以找到:
# 夜鶯的主配置文件是 etc/config.toml
grep "1234" etc/config.toml
安裝夜鶯
可以去 https://flashcat.cloud/download/nightingale/ 找最新版本的包,文檔里的包地址可能已經不是最新的了
# 創建個 n9e 的目錄,后面把 n9e 相關的文件解壓到這里
mkdir -p /opt/n9e && cd /opt/n9e
# 下載 n9e 發布包,amd64 是 x84 的包,下載站點也提供 arm64 的包,如果需要其他平臺的包則要自行編譯了
tarball=n9e-v6.0.0-ga.7.0.2-linux-amd64.tar.gz
urlpath=https://download.flashcat.cloud/${tarball}
wget -q $urlpath || exit 1
# 解壓縮發布包
tar zxvf ${tarball}
# 解壓縮之后,可以看到 n9e.sql 是建表語句,導入數據庫
mysql -uroot -p1234 < n9e.sql
# 啟動 n9e,先使用 nohup 簡單測試,如果需要 systemd 托管,請自行準備 service 文件
nohup ./n9e &> n9e.log &
# 檢查 n9e.log 是否有異常日志,檢查端口是否在監聽,正常應該監聽在 17000
ss -tlnp|grep 17000
如果日志和端口都沒啥問題,恭喜,你完成了夜鶯的安裝!通過瀏覽器訪問這個機器的 17000,理論上就可以看到登錄頁面了。
玩法1:僅使用夜鶯做告警管理
如果您之前已經部署了 Prometheus、Thanos、VictoriaMetrics、M3DB、Mimir 等某個時序庫,只是想使用夜鶯的告警管理功能,沒問題,架構如下:

假設你之前有個 Prometheus,只需要把 Prometheus 作為數據源配置進來就可以了,入口在:

具體配置樣例如下:

這里一些配置項的含義解釋如下:
- 名稱:隨意取名,就是個標識,使用英文命名
- URL:Prometheus 的訪問地址,如果是其他時序庫,這個地址就不同嘍,比如集群版本的 VictoriaMetrics,可能是類似這么個地址:
http://127.0.0.1:8481/select/0/prometheus - 超時時間:單位是毫秒,建議最小設置為10000,即10s,如果一些大的查詢,就會比較耗時
- 授權:如果時序庫啟用了 Basic auth,這里就配置對應的 Basic auth username 和 password 即可
- 跳過 SSL 驗證:如果證書不是正兒八經的證書想要跳過校驗,就勾選這個項
- 自定義 HTTP 頭:訪問時序庫的時候可以附加一些 HTTP Header
- write_addr:這個是時序庫的 remote write 地址,我的例子中是 Prometheus,所以 url path 是
/api/v1/write,如果是其他時序庫可能不同,比如集群版本的 VictoriaMetrics,remote write 地址可能是類似這個樣子:http://127.0.0.1:8480/insert/0/prometheus/api/v1/write。這個信息用在哪里呢?平時都用不到,除非你在夜鶯里使用了記錄規則(recording rule),記錄規則會生成新指標,新指標要回寫時序庫,所以要求時序庫提供 remote write 地址。如果你不知道啥是 recording rule,可以 google 一下,google 關鍵字:“Prometheus recording rule”,或者跳過以后再說 - 關聯告警引擎集群:這個說起來有點復雜了,選中默認的 default 即可,如果需要在邊緣機房單獨部署 n9e-alert 的時候,才需要詳細了解這個信息
以上配置完成之后,我們去即時查詢驗證一下,看看能否查詢到這個 Prometheus 的數據:

如上就表示正常的,如果有些數據確定時序庫里是有的,但是在即時查詢里查不到,有可能是時間沒有校準,請自行檢查時間。之后,就可以在夜鶯里配置告警規則了,具體可以參考后續告警相關的文檔。
玩法2:使用 categraf 采集數據,使用夜鶯接收數據
社區里經常有小伙伴咨詢,問夜鶯可以監控xx么?
其實,夜鶯啥都可以監控,又啥都監控不了。夜鶯是一個服務端組件,類似 Grafana,可以接入不同的數據源,比如 Prometheus、VictoriaMetrics、Thanos 等等,只要數據進到這些庫里了,夜鶯就可以對數據源的數據進行分析、告警、可視化,以及后續的事件處理、告警自愈。
當然,夜鶯也有端口接收監控數據,可以跟開源社區常見的各種監控采集器打通,比如 Telegraf、Categraf、Grafana-agent、Datadog-agent、Prometheus 生態的各類 Exporter 等等。這些 agent 采集了數據推給夜鶯,夜鶯適配了這些 agent 的數據傳輸協議,所以可以接收這些 agent 上報的監控數據,轉存到后端對接的數據源,之后就可以對這些數據做告警分析、可視化。
所以夜鶯本身不做監控數據采集,啥都不能監控,但是夜鶯可以對接數據源,又啥都可以監控。
這一小節,我們介紹使用 Categraf 作采集器,然后推數據給夜鶯,夜鶯轉存到時序庫,并且后續對這些數據做可視化、告警等,整個架構如下圖所示:

圖上畫了三個 agent:datadog-agent、telegraf、categraf,都可以和夜鶯對接,我們推薦的是 categraf,所以本節主要以 categraf 舉例。夜鶯默認監聽的端口是 17000,通過 api:/prometheus/v1/write 接收 remote write 協議的監控數據,categraf 恰好可以以 remote write 協議上報監控數據,所以二者可以對接,telegraf、grafana-agent 其實也可以以 remote write 協議上報監控數據,所以也可以和夜鶯對接。
夜鶯收到監控數據之后,夜鶯自身不存儲這些時序數據,直接轉存到后端時序庫,在這里,夜鶯的角色只是一個 Pushgateway 的角色。我們推薦的時序庫是單機版本的 VictoriaMetrics,后文就以此演示。當然了,夜鶯可以同時并行轉發數據給后端多個時序庫,就像上圖畫的,把一份數據同時存儲在 VictoriaMetrics 和 Prometheus,也是可以通過配置實現的。
安裝單機版本的 VictoriaMetrics
如果選用集群版本的 VictoriaMetrics,可以參考 這里。當然,單機版本對絕大部分公司,夠用了,配合云盤保障數據可靠性,穩。所以這里,我就演示單機版本的部署。
安裝 VictoriaMetrics
VictoriaMetrics 下載地址在 github releases 上,作為技術人員,我想,你應該可以下載的到。我的環境是 x86_64 的 linux,所以選擇下載:victoria-metrics-linux-amd64-v1.90.0.tar.gz (撰寫這個文檔的時候,最新版本是 v1.90.0)。
VictoriaMetrics 解壓縮之后,里邊就一個二進制:
[root@vm-159 tarball]# ll vic*
-rw-r--r--. 1 root root 10370599 5月 17 18:43 victoria-metrics-linux-amd64-v1.90.0.tar.gz
-rwxr-xr-x. 1 1000 1000 20191152 4月 7 09:00 victoria-metrics-prod
啟動它:
[root@vm-159 tarball]# nohup ./victoria-metrics-prod &> stdout.log &
[1] 12632
[root@vm-159 tarball]# ss -tlnp|grep 12632
LISTEN 0 128 *:8428 *:* users:(("victoria-metric",pid=12632,fd=10))
通過上面的命令可以看出,單機版本的 VictoriaMetrics 監聽在 8428 端口。通過瀏覽器訪問 VictoriaMetrics 的 8428,理論上可以看到下面的頁面:

如上,就表示 VictoriaMetrics 安裝成功,當然,我僅僅使用 nohup 簡單啟動的,如果生產環境,建議使用 systemd 托管并設置開機自啟動。
打通夜鶯和 VictoriaMetrics
分兩個步驟,首先就類似上面配置 Prometheus 數據源那種方式,在夜鶯里配置一個 VictoriaMetrics 的數據源,比如我的配置:

其次,就需要修改配置文件了。打開夜鶯的 etc/config.toml 配置,找到 HTTP.Pushgw 部分,默認配置如下:
[HTTP.Pushgw]
Enable = true
# [HTTP.Pushgw.BasicAuth]
# user001 = "ccc26da7b9aba533cbb263a36c07dcc5"
這個表示:開啟夜鶯的監控數據接收類的 API,默認就是開啟的,所以,默認配置就夠了,不用動。那個 HTTP.Pushgw.BasicAuth 表示 BasicAuth(不懂啥是 BasicAuth 請自行 Google 哈) 的配置,如果是內網環境就維持注釋就可以了,不用開啟 BasicAuth,如果要把夜鶯接收數據的接口暴露到公網,為了安全考慮,就需要 HTTPS + BasicAuth 雙重保障了,這里的 HTTP.Pushgw.BasicAuth 相關的配置在公網環境下就應該打開,而且,應該修改這個 password:ccc26da7b9aba533cbb263a36c07dcc5,不要使用默認的 password。
另一個要修改的配置是 Pushgw.Writers 部分,把 VictoriaMetrics 的 remote write 地址配置上,我的環境的例子如下:
[Pushgw]
LabelRewrite = true
[[Pushgw.Writers]]
Url = "http://127.0.0.1:8428/api/v1/write"
這里的 [[Pushgw.Writers]] 是雙中括號擴起來的,這在 toml 配置中表示數組,如果你想把數據轉發給后端多個時序庫,就可以配置多個 [[Pushgw.Writers]],比如:
[Pushgw]
LabelRewrite = true
[[Pushgw.Writers]]
Url = "http://127.0.0.1:8428/api/v1/write"
[[Pushgw.Writers]]
Url = "http://127.0.0.1:9090/api/v1/write"
OK,這樣一來,夜鶯接收到 categraf、telegraf、grafana-agent 等各類 agent 上報上來的監控數據,都會轉發給后端的 VictoriaMetrics,完活。
部署 categraf 上報監控數據
Categraf 的安裝請 參考文檔,這個文檔已經很詳細了就不再贅述了。重點關注配置文件 config.toml,一個是 heartbeat 的配置:
[heartbeat]
enable = true
url = "http://127.0.0.1:17000/v1/n9e/heartbeat"
這個配置是 Categraf 向夜鶯心跳的地址,夜鶯 v5 的話沒有這個機制,需要把 Categraf heartbeat 的 enable 關掉。我這里演示的夜鶯 v6,所以 heartbeat 的 enable 要設置為 true,建議大家用高版本的 Categraf,我這里用的是 v0.3.4。
另一個配置是 writers 部分:
[[writers]]
url = "http://127.0.0.1:17000/prometheus/v1/write"
這表示:把數據推給夜鶯的 17000 端口,url path 是 /prometheus/v1/write 這是夜鶯的 remote write 協議的數據接收地址。
上面我的例子中,夜鶯的地址都是:127.0.0.1:17000,因為我的 Categraf 和 夜鶯 在一臺機器上,如果你的 Categraf 和夜鶯在不同的機器,注意改成合適的 IP。
按照 文檔 中介紹的方法啟動 Categraf,我這只是臨時測試,所以,直接 nohup 啟動得了:
nohup ./categraf &> categraf.log &
驗證結果
如果一切正常,Categraf 就會推數據給夜鶯,夜鶯轉發給 VictoriaMetrics,而 VictoriaMetrics 又是夜鶯的數據源,所以在夜鶯的即時查詢頁面,理論上可以查詢到 VictoriaMetrics 的數據,驗證一下:

cpu_usage_active 這個指標就是 Categraf 采集上報的,看起來一切正常。歐耶!
夜鶯高可用方案
這里服務端總共涉及到4個組件:時序庫、mysql、redis、夜鶯,其中時序庫、mysql、redis 的高可用,大家 Google 一下網上大堆資料,這里不展開。關鍵是夜鶯如何做高可用?
其實,很簡單,多部署幾個 n9e 實例就可以了。多個 n9e 實例會自動組成集群,分擔壓力。n9e 前面可以架設負載均衡,四層、七層都可以,某個 n9e 實例掛掉,負載均衡會自動剔除,用戶通過瀏覽器訪問夜鶯的時候,訪問負載均衡的地址,Categraf 的 writer 和 heartbeat 也配置成負載均衡的地址,就可以了。
如果夜鶯里配置了3千條告警規則,部署了3個n9e實例,這三個n9e實例就會自動分配(通過一致性哈希算法)要處理的告警規則,確保每個n9e實例只處理大概1千條告警規則,分擔告警引擎處理壓力。如果某個n9e實例掛掉,其他實例會自動感知(利用mysql做了一些心跳機制)自動接管未被處理的告警規則,這也是把n9e集群化部署的好處。
高級玩法
如果,夜鶯部署在北京機房,某些機房和北京機房網絡鏈路較差,此時,應該把時序庫、告警引擎下沉部署,具體應該如何做呢?看這里
轉載自:https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v6/install/intro/

浙公網安備 33010602011771號