概述
一、 介紹
監控系統是整個運維環節,乃至整個產品生命周期中最重要的一環,事前及時預警發現故障,事后提供翔實的數據用於追查定位問題。監控系統作為一個成熟的運維產品,業界有很多開源的實現可供選擇。當公司剛剛起步,業務規模較小,運維團隊也剛剛建立的初期,選擇一款開源的監控系統,是一個省時省力,效率最高的方案。之后,隨着業務規模的持續快速增長,監控的對象也越來越多,越來越復雜,監控系統的使用對象也從最初少數的幾個SRE,擴大為更多的DEVS,SRE。這時候,監控系統的容量和用戶的“使用效率”成了最為突出的問題。
監控系統業界有很多傑出的開源監控系統。我們在早期,一直在用zabbix,不過隨着業務的快速發展,以及互聯網公司特有的一些需求,現有的開源的監控系統在性能、擴展性、和用戶的使用效率方面,已經無法支撐了。
因此,我們在過去的一年里,從互聯網公司的一些需求出發,從各位SRE、SA、DEVS的使用經驗和反饋出發,結合業界的一些大的互聯網公司做監控,用監控的一些思考出發,設計開發了小米的監控系統:Open-Falcon。
二、特點
- 數據采集免配置:agent自發現、支持Plugin、主動推送模式
- 容量水平擴展:生產環境每秒50萬次數據收集、告警、存儲、繪圖,可持續水平擴展。
- 告警策略自發現:Web界面、支持策略模板、模板繼承和覆蓋、多種告警方式、支持回調動作。
- 告警設置人性化:支持最大告警次數、告警級別設置、告警恢復通知、告警暫停、不同時段不同閾值、支持維護周期,支持告警合並。
- 歷史數據高效查詢:秒級返回上百個指標一年的歷史數據。
- Dashboard人性化:多維度的數據展示,用戶自定義Dashboard等功能。
- 架構設計高可用:整個系統無核心單點,易運維,易部署。
三、架構圖
備注:虛線所在的aggregator組件還在設計開發階段。
每台服務器,都有安裝falcon-agent,falcon-agent是一個golang開發的daemon程序,用於自發現的采集單機的各種數據和指標,這些指標包括不限於以下幾個方面,共計200多項指標。
- CPU相關
- 磁盤相關
- IO
- Load
- 內存相關
- 網絡相關
- 端口存活、進程存活
- ntp offset(插件)
- 某個進程資源消耗(插件)
- netstat、ss 等相關統計項采集
- 機器內核配置參數
只要安裝了falcon-agent的機器,就會自動開始采集各項指標,主動上報,不需要用戶在server做任何配置(這和zabbix有很大的不同),這樣做的好處,就是用戶維護方便,覆蓋率高。當然這樣做也會server端造成較大的壓力,不過open-falcon的服務端組件單機性能足夠高,同時都可以水平擴展,所以自動多采集足夠多的數據,反而是一件好事情,對於SRE和DEV來講,事后追查問題,不再是難題。
另外,falcon-agent提供了一個proxy-gateway,用戶可以方便的通過http接口,push數據到本機的gateway,gateway會幫忙高效率的轉發到server端。
falcon-agent,可以在我們的github上找到:https://github.com/open-falcon/agent
四、數據流程圖
部署Open-falcon
一、環境准備
系統環境:CentOS 7
1. 搭建阿里雲yum源
[root@Open-falcon ~]# hostname Open-falcon [root@Open-falcon ~]# cd /etc/yum.repos.d/ [root@Open-falcon yum.repos.d]# mkdir bak && mv * ./bak [root@Open-falcon yum.repos.d]# curl -O http://mirrors.aliyun.com/repo/Centos-7.repo [root@Open-falcon yum.repos.d]# yum clean all [root@Open-falcon yum.repos.d]# yum makecache [root@Open-falcon yum.repos.d]# yum -y update //更新所有包
2. 安裝Go語言環境
[root@Open-falcon ~]# yum -y install epel-release //因為官方yum和阿里yum都沒有go的安裝包,故只能通過fedora的epel倉庫來安裝 [root@Open-falcon ~]# yum -y install go
#安裝之后確認安裝后的版本是不是>=1.6版本(官方需求)
[root@Open-falcon ~]# go version go version go1.8.3 linux/amd64
3. 安裝Redis
由於部署go時已經安裝了epel,故直接執行下面的安裝命令。
[root@Open-falcon ~]# yum -y install redis [root@Open-falcon ~]# systemctl start redis [root@Open-falcon ~]# systemctl enable redis //開機啟動 [root@Open-falcon ~]# systemctl status redis //查看狀態 redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Sun 2018-04-29 09:30:00 EDT; 2h 24min ago Main PID: 35732 (redis-server) CGroup: /system.slice/redis.service └─35732 /usr/bin/redis-server 127.0.0.1:6379
4. 安裝Mysql
包名:mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz(331MB)
[root@Open-falcon ~]# tar xf mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz [root@Open-falcon ~]# cp -r mysql-5.6.40-linux-glibc2.12-x86_64 -C /usr/local/mysql [root@Open-falcon ~]# useradd -M -s /sbin/nologin mysql [root@Open-falcon ~]# chown mysql:mysql /usr/local/mysql/ -R [root@Open-falcon ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ [root@Open-falcon ~]# cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf [root@Open-falcon ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld [root@Open-falcon ~]# chmod +x /etc/init.d/mysqld [root@Open-falcon ~]# /etc/init.d/mysqld start [root@Open-falcon ~]# netstat -antup | grep :::3306 tcp6 0 0 :::3306 :::* LISTEN 60648/mysqld
5. 初始化Mysql數據庫
[root@Open-falcon ~]# mkdir falcon-plus [root@Open-falcon ~]# cd falcon-plus [root@Open-falcon falcon-plus]# unzip falcon-plus-master.zip [root@Open-falcon falcon-plus]# cd falcon-plus-master/scripts/mysql/db_schema/ [root@Open-falcon db_schema]# ll total 24 -rw-r--r--. 1 root root 1952 Apr 8 02:44 1_uic-db-schema.sql -rw-r--r--. 1 root root 7573 Apr 8 02:44 2_portal-db-schema.sql -rw-r--r--. 1 root root 3391 Apr 8 02:44 3_dashboard-db-schema.sql -rw-r--r--. 1 root root 1807 Apr 8 02:44 4_graph-db-schema.sql -rw-r--r--. 1 root root 2560 Apr 8 02:44 5_alarms-db-schema.sql [root@Open-falcon db_schema]# mysql -u root -p < 1_uic-db-schema.sql [root@Open-falcon db_schema]# mysql -u root -p < 2_portal-db-schema.sql [root@Open-falcon db_schema]# mysql -u root -p < 3_dashboard-db-schema.sql [root@Open-falcon db_schema]# mysql -u root -p < 4_graph-db-schema.sql [root@Open-falcon db_schema]# mysql -u root -p < 5_alarms-db-schema.sql [root@Open-falcon db_schema]# mysql -uroot -e 'show databases' +--------------------+ | Database | +--------------------+ | information_schema | | alarms | | dashboard | | falcon_portal | | graph | | mysql | | performance_schema | | test | | uic | +--------------------+ 6. 安裝Open-falcon(兩種安裝方式) a. 源碼安裝 參考: https://book.open-falcon.org/zh_0_2/quick_install/prepare.html b. 二進制版本安裝 [root@Open-falcon ~]# WORKSPACE=/opt/work/ [root@Open-falcon ~]# mkdir $WORKSPACE [root@Open-falcon ~]# cd /opt/work/ [root@Open-falcon work]# tar xf open-falcon-v0.2.1.tar.gz [root@Open-falcon work]# rm -f open-falcon-v0.2.1.tar.gz
二、部署后端
a. 檢查配置文件中數據庫賬號密碼是否正確
[root@Open-falcon work]# vim aggregator/config/cfg.json "addr": "root:@tcp(127.0.0.1:3306)/falcon_portal?loc=Local&parseTime=true",
檢查以上內容的 root:password(如果沒有密碼就去掉password),服務器IP地址及端口
檢查的模塊配置文件列表如下:
模塊 |
配置文件所在路徑 |
aggregator |
/opt/work/aggregator/config/cfg.json |
graph |
/opt/work/graph/config/cfg.json |
hbs |
/opt/work/hbs/config/cfg.json |
nodata |
/opt/work/nodata/config/cfg.json |
api |
/opt/work/api/config/cfg.json |
alarm |
/opt/work/alarm/config/cfg.json |
b. 啟動
[root@Open-falcon work]# ./open-falcon Usage: open-falcon [flags] open-falcon [command] Available Commands: check Check the status of Open-Falcon modules help Help about any command monitor Display an Open-Falcon module's log reload Reload an Open-Falcon module's configuration file restart Restart Open-Falcon modules start Start Open-Falcon modules stop Stop Open-Falcon modules
三、部署前端
1. 創建工作目錄
[root@Open-falcon ~]# export FRONTSPACE=/opt/front/open-falcon [root@Open-falcon ~]# mkdir -p $FRONTSPACE
2. 解壓dashboard
[root@Open-falcon open-falcon]# unzip dashboard-master.zip [root@Open-falcon open-falcon]# mv dashboard-master dashboard && rm -f dashboard-master.zip
3. 安裝依賴包
[root@Open-falcon open-falcon]# yum install -y python-virtualenv [root@Open-falcon open-falcon]# yum install -y python-devel [root@Open-falcon open-falcon]# yum install -y openldap-devel [root@Open-falcon open-falcon]# yum install -y mysql-devel [root@Open-falcon open-falcon]# yum -y groupinstall "Development tools" [root@Open-falcon open-falcon]# cd dashboard/ [root@Open-falcon dashboard]# virtualenv ./env [root@Open-falcon dashboard]# ./env/bin/pip install -r pip_requirements.txt
4. 修改配置
dashboard的配置文件在/opt/front/open-falcon/dashboard/rrd/config.py,需要根據實際情況對內部配置進行修改。
由於前端后台搭在一台服務器里,且暫時不接入LDAP,且數據庫root的密碼為空,故先不修改配置文件。
5. 啟動
a. 生產環境啟動
[root@Open-falcon dashboard]# bash control # 以下參數
start|stop|restart|status|tail|kill9|version|pack
b. 開發者模式啟動
[root@Open-falcon dashboard]# ./env/bin/python wsgi.py
6. dashbord用戶管理
dashbord沒有默認創建任何賬號包括管理賬號,需要你通過頁面進行注冊賬號。
想擁有管理全局的超級管理員賬號,需要手動注冊用戶名為root的賬號(第一個帳號名稱為root的用戶會被自動設置為超級管理員)。
超級管理員可以給普通用戶分配權限管理。
小提示:注冊賬號能夠被任何打開dashboard頁面的人注冊,所以當給相關的人注冊完賬號后,需要去關閉注冊賬號功能。只需要去修改api組件的配置文件cfg.json,將signup_disable配置項修改為true,重啟api即可。當需要給人開賬號的時候,再將配置選項改回去,用完再關掉即可。
Open-falcon使用
一、查看監控數據
二、如何配置報警策略
1. 配置報警接收人
falcon的報警接收人不是一個具體的手機號,也不是一個具體的郵箱,因為手機號、郵箱都是容易發生變化的,如果變化了去修改所有相關配置那就太麻煩了。我們把用戶的聯系信息維護在一個叫 帳戶/Profile 里,以后如果要修改手機號、郵箱,只要修改自己的帳戶信息即可。報警接收人也不是單個的人,而是一個組(Teams),比如falcon這個系統的任何組件出問題了,都應該發報警給falcon的運維和開發人員,發給falcon這個團隊,這樣一來,新員工入職只要加入falcon這個Team即可;員工離職,只要從falcon這個Team刪掉即可。
瀏覽器訪問UIC,如果啟用了LDAP,那就用LDAP賬號登陸,如果沒有啟用,那就注冊一個或者找管理員幫忙開通。創建一個Team,名稱姑且叫falcon,把自己加進去,待會用來做測試。
首先修改帳戶信息,保證郵箱和手機號正確 然后添加報警組,添加成員。
2. 創建HostGroup
比如我們要對falcon-judge這個組件做端口監控,那首先創建一個HostGroup,把所有部署了falcon-judge這個模塊的機器都塞進去,以后要擴容或下線機器的時候直接從這個HostGroup增刪機器即可,報警策略會自動生效、失效。咱們為這個HostGroup取名為:sa.dev.falcon.judge,這個名稱有講究,sa是我們部門,dev是我們組,falcon是項目名,judge是組件名,傳達出了很多信息,這樣命名比較容易管理,推薦大家這么做。
在往組里加機器的時候如果報錯,需要檢查portal的數據庫中host表,看里邊是否有相關機器。那host表中的機器從哪里來呢?agent有個heartbeat(hbs)的配置,agent每分鍾會發心跳給hbs,把自己的ip、hostname、agent version等信息告訴hbs,hbs負責寫入host表。如果host表中沒數據,需要檢查這條鏈路是否通暢。
3. 創建策略模板
portal最上面有個Templates鏈接,這就是策略模板管理的入口。我們進去之后創建一個模板,名稱姑且也叫:sa.dev.falcon.judge.tpl,與HostGroup名稱相同,在里邊配置一個端口監控,通常進程監控有兩種手段,一個是進程本身是否存活,一個是端口是否在監聽,此處我們使用端口監控。
右上角那個加號按鈕是用於增加策略的,一個模板中可以有多個策略,此處我們只添加了一個。下面可以配置報警接收人,此處填寫的是falcon,這是之前在UIC中創建的Team。
4. 將HostGroup與模板綁定
一個模板是可以綁定到多個HostGroup的,現在我們重新回到HostGroups頁面,找到sa.dev.falcon.judge這個HostGroup,右側有幾個超鏈接,點擊【templates】進入一個新頁面,輸入模板名稱,綁定一下就行了。
a. 補充
上面步驟做完了,也就配置完了。如果judge組件宕機,端口不再監聽了,就會報警。不過大家不要為了測試報警效果,直接把judge組件給干掉了,因為judge本身就是負責判斷報警的,把它干掉了,那就沒法判斷了……所以說falcon現在並不完善,沒法用來監控本身的組件。為了測試,大家可以修改一下端口監控的策略配置,改成一個沒有在監聽的端口,這樣就觸發報警了。
上面的策略只是對falcon-judge做了端口監控,那如果我們要對falcon這個項目的所有機器加一些負載監控,應該如何做呢?
- 創建一個HostGroup:sa.dev.falcon,把所有falcon的機器都塞進去
- 創建一個模板:sa.dev.falcon.common,添加一些像ping, df.bytes.free.percent, load.5min等策略
- 將sa.dev.falcon.common綁定到sa.dev.falcon這個HostGroup
附:sa.dev.falcon.common的配置樣例
大家可能不知道各個指標分別叫什么,自己push的數據肯定知道自己的metric了,agent push的數據可以參考:https://github.com/open-falcon/agent/tree/master/funcs
5. 如何配置策略表達式
策略表達式,即expression,具體可以參考 HostGroup與Tags設計理念,這里只是舉個例子:
上例中的配置傳達出的意思是:endpoint=aggregator 並且 metric=cpu.busy 的所有的監控指標,只要連續3次 >= 0.5 則報警給falcon-test1這個報警組。
expression無需綁定到HostGroup,enjoy it