之前有一個需求,營運需要能看到某某功能長連接配接線上人數是多少,比如發完 push 之後是多少,能夠實時得到營運的回報。
我比較懶,能用簡單的辦法搞定,就不喜歡習慣用開源的東西,因為覺得自己學習的也比較慢,但是不得不說這種快速上手一個陌生産品的能力很重要,我很缺乏這種能力。
我們提供一個長連接配接服務,占用端口<code>8080</code>,我最初的方式通過 shell 腳本做一個簡單的監控,資料都直接寫在了日志檔案裡。
<code>while</code> <code>:; </code><code>do</code> <code>sleep</code> <code>1;</code><code>netstat</code> <code>-lanp|</code><code>grep</code> <code>8080|</code><code>grep</code> <code>established|</code><code>awk</code> <code>'{print $5}'</code><code>|</code><code>awk</code> <code>-f </code><code>':'</code> <code>'{print $1}'</code><code>|</code><code>sort</code><code>|</code><code>uniq</code><code>|</code><code>wc</code> <code>-l|</code><code>awk</code> <code>'begin{a="'</code><code>$(</code><code>date</code> <code>+%h:%m:%s)</code><code>'";}{printf "%s,%d\n",a,$1}'</code> <code>>> access_num.log;</code><code>done</code>
上面的指令輸出兩列,第一列是時間,第二列是線上人數。
比較簡陋,不過用起來我覺得還是蠻輕便的。

同僚說,你這個太 low 了,現在比較流行<code>grafana</code>+<code>telegraf</code>+<code>influxdb</code>來搭建。
grafana 負責 ui 界面的展示 telegraf 做資料的收集,比如伺服器叢集的性能監控 influxdb 是現在流行的時間序列資料庫
我馬上搜這些關鍵字,全是英文呢,可視化效果真不錯,github star 也上千。怎麼安裝了就不說了,直接上官網就有。<code>influxdb</code>資料庫的定義比較新穎,下面就說說它了。
<code>influxdb</code>資料庫裡<code>series</code>對應的是我們正常認識的表,而表裡面的一行資料一般都來表示一個對象,而<code>series</code>裡面一行資料則是描述的一個<code>point</code>。(沒錯,就是坐标系裡的一個真實的點,是以這個資料庫的業務場景就是專門針對這種時間線的資料監控而創作的。)
那麼這個點有哪些屬性來描述它呢?
timestamp,point的時間戳, measurement,可以了解為表名, field,以1~n個<code>key-value</code>來表示,point的值, tags,以0~n個<code>key-value</code>來表示,point 的屬性。
以一個具體的例子來說,現在需要監控1伺服器的負載,那麼負載(<code>load</code>)就是<code>measurement</code>,此刻的負載值,就是<code>field</code>,該伺服器的 ip 就可以作為<code>tags</code>中的一個,也可以不記 ip,因為此時我們的需求隻是記錄一台伺服器而已。
那麼指令行如何插入一條資料呢?下面是其寫入協定。适用于<code>influxdb</code>的指令行和 api 接口
<code><measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]</code>
以你老司機多年的經驗,一看上面的表達式便知,[]裡面的内容表示可選,是以插入資料庫的時候,可以不用帶時間戳,預設為目前時間戳。
官方的例子送給大家
<code>cpu,host=servera,region=us_west value=0.64</code>
<code>payment,device=mobile,product=notepad,method=credit billed=33,licenses=3i 1434067467100293230</code>
<code>stock,symbol=aapl bid=127.46,ask=127.48</code>
<code>temperature,machine=unit42,</code><code>type</code><code>=assembly external=25,internal=37 1434067467000000000</code>
nice,看到了麼,還可以用在交易記錄喲。
說了這麼多,下面加快速度一條路,快上車,帶你迅速解決戰鬥。
假設 influxdb bin 檔案路徑是:<code>/usr/local/bin/influx</code> 綁定的 ip:101.241.254.176 授權賬号:mengkang 密碼:123456
<code># 進入指令行</code>
<code>/usr/local/bin/influx</code> <code>-host 101.241.254.176 -username mengkang -password 123456</code>
<code># 建立資料庫</code>
<code>create database mydb</code>
<code># 進入 mydb</code>
<code>use mydb</code>
<code># 插入一條 101.241.254.134 伺服器 websocket 線上人數的資料,不需要建立表,直接插入</code>
<code>insert websocket,ip=101.241.254.134 num=100</code>
那麼資料怎麼查詢呢?這才是它的強大之處,不然就是資料庫了。
比如官方的這個例子
<code>select mean(</code><code>"water_level"</code><code>) from </code><code>"h2o_feet"</code> <code>where </code><code>time</code> <code>> now() - 2w group by </code><code>"location"</code><code>,</code><code>time</code><code>(6h)</code>
查詢過去兩周各個地方的每6小時的水準平均值變化情況,是不是功能很強大呢?
在使用<code>telegraf</code>,感覺配置檔案太複雜啦,我同僚在用,我太笨了研究了半天玩不轉。
而<code>influxdb</code>提供了 api 接口,我就直接通過<code>shell</code>往<code>influxdb</code>寫資料了。
<code>curl -i -xpost -u username:password </code><code>"http://101.241.254.176:8086/write?db=my_monitor"</code> <code>--data-binary </code><code>'websocket,host=10.24.254.134 value=120'</code>
這樣就能進入資料庫了。