使用linux服务器的意义,RRDCached的意义
不知道從什么時候開始,rrdtool里帶了rrdcached這個程序,準備試用一下。官網已經有了比較詳細的介紹,但是都是英文,翻譯一個先。
當rrdcached接收到update的命令的時候,它并不會把這個命令寫入磁盤,它會在多個隊列中,尋找相應rrd文件的隊列,如果沒有的話,會創建一個隊列,并且把自己,和當前的時間戳插進去。注意:當前的時間戳并不是update命令中帶的那個時間戳哦,這個當前的時間戳,就有了特殊的含義,在判斷是否刷新磁盤的時候會用到,我們把它叫做First。此時,這條update命令的時間戳(Time)和值(Value),已經添加成為了隊列樹的節點。
當下一個節點要進入隊列的時候,它會先檢查,這個隊列是不是需要把隊列中的數據flush到rrd文件中了,當 現在的時間戳 - First >= Timeout 的時候,它就會觸發flush操作,注意,是觸發,而不是直接寫rrd,這個問題隨后解釋。這個Timeout,是在啟動rrdcached的時候,用-w參數指定的,默認為5分鐘。
所謂的觸發flush操作,并不是直接寫rrd文件,而是把這個隊列移動到一個update queue中,當下一次寫rrd的線程被觸發的時候,這些在update queue中的值,就會被真正的寫到磁盤中。
我們會起多個update的線程,來進行rrd的寫操作。每個線程都會取出update queue中的第一個值,并且將它寫入磁盤的rrd文件中,這種方式十分高效,當update queue非空的時候,rrd文件會在最短的時間內被寫入。
我們可能都發現了一個問題————只有隊列接到update命令的時候,進程才會檢測,這個隊列是不是需要被flush到rrd中了,有一種場景:如果一個rrd文件,有了一次update之后,很久很久都沒有更新了,那隊列中就一直有這么一個值,而無法被寫入到rrd中,這個現象,顯然不是我們希望看到的……所以,我們每隔一段時間,所有的緩存隊列中的值,都會一起被flush到update queue中,等待被更新到rrd文件中。這個操作,一般來講,是非常消耗資源的,所以,不應該經常的做這種事情,這個間隔應該調的大一點,是由-f參數指定的,默認是一個小時一次。
rrdtool給這種cache提供了一個flush的命令,我們可以針對特定的rrd文件進行flush,當rrdcached接到這個命令的時候,它會先找到這個rrd文件的隊列,并且將這個隊列添加到update queue的頂端,當這些數據全部被寫rrd的線程寫到磁盤中以后,這個命令才會返回。
1、文件的隊列以平衡樹的方式存儲
2、平衡樹中的節點,和update queue的節點是一個struct
3、First和update命令中帶的時間,可能會不一樣
4、觸發update的那個節點,被添加到隊列尾部
5、flush命令,會將值插到update queue的頭部
6、ascII編碼通訊
官方文檔還提到了以下的幾點:
1、用戶認證:暫時沒有
2、授權:對每個socket進行授權,就是,每個socket可以接受的命令是不同的
3、加密:沒有加密
4、檢查:沒有,你讓它寫哪個文件,它就寫哪個文件,如果你用root起了這個進程,而它給一個很敏感的文件寫了些東西,把你寫死了……你就掛了
協議:
它的協議很簡單,沒有經過任何認證和加密,很容易用腳本實現,也可以直接telnet上來敲命令。⊙﹏⊙b汗……
命令是基于行的,一個命令就是一行或者多行,行和行之間用'\n'分隔。
命令格式:
都很簡單,有個HELP命令,可以看到詳細的幫助。
有兩個命令需要注意下:
BATCH
在執行了BATCH以后,你可以插入多行,這個時候,rrdcached會執行update的操作,但是并不會有返回,只有client端輸入一個結束標志:'.'的時候,rrdcached才會返回,你執行了多少命令,錯了多少行,哪行錯了,是哪些錯……
STATS
輸出rrdcached運行到現在的狀態,監控用。
QueueLength:有多少節點在update queue中等待寫入rrd
UpdatesReceived:總共接受了多少update命令
FlushesReceived:總共接受了多少flush命令
UpdatesWritten:總共update的次數
DataSetsWritten:總共有多少Data set被寫入了磁盤
TreeNodesNumber:在平衡樹中有多少節點
TreeDepth:平衡樹的深度
JonunalBytes:總共寫了多少Byte到journal
JournalRotate:journal總共滾動了幾次
翻譯至此結束……如果覺得意猶未盡,請直接看官網的文檔,如果還覺得不爽,請直接看源碼……
rrdtool還是個不錯的東東,但是有兩個磁盤寫上的問題很麻煩:
1、當rrd文件非常多的時候,而且都是監控數據,5分鐘就需要全部更新,更新的時候,光尋道都尋死了,而且如果內存無法全部cache,每次更新,都會造成大量內存和硬盤之間的數據交換……非常耗資源
2、每次update,都先打開一個file handler,然后更新一條,然后關閉file handler,當更新下一條的時候,繼續這么搞……很耗資源
第一個問題,通過mysql來解決,數據庫中以時間戳做pk,監控數據先插數據庫,這樣,在數據庫中做insert delay,因為mysql中的數據按照pk進行聚合,所以,就成為了批量順序寫入,而且mysql自己會保持文件句柄。
當需要繪圖的時候,先向數據庫發送請求,取出要插入這個rrd的數據,然后update,然后繪圖,這樣雖然多了一個步驟,但是,在update的時候,這個繪圖的rrd文件可以保證都cache在內存中,也可以一次性被flush到硬盤,以此來提高寫入rrd的速度。當批量更新rrd的時候,內存和硬盤只需要交互一次,就更新了全部的數據,而原先,交互一次才更新一條……
但是,這個方法,還是無法解決update的時候頻繁打開file handler的問題,有了rrdcached以后,這個問題貌似被解決了,在批量更新一個rrd的時候,我可以先將數據都準備好,然后再一個BATCH命令中,一次性更新上去,然后對此文件進行FLUSH操作,如果只需要打開一次文件句柄,就完成了所有數據的更新,那就最好了,但是,這種批量更新,是否真的是只打開一個文件句柄,還需要看源碼了……
總結
以上是生活随笔為你收集整理的使用linux服务器的意义,RRDCached的意义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 隐蔽信道相关概念(持续更)
- 下一篇: 在线运行 Linux,真滴牛逼。