久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何將RRD數(shù)據(jù)庫(kù)中數(shù)據(jù)導(dǎo)入MYSQL中

共計(jì) 4438 個(gè)字符,預(yù)計(jì)需要花費(fèi) 12 分鐘才能閱讀完成。

本篇文章為大家展示了如何將 RRD 數(shù)據(jù)庫(kù)中數(shù)據(jù)導(dǎo)入 MYSQL 中,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

將 RRD 數(shù)據(jù)庫(kù)中數(shù)據(jù)導(dǎo)入 MYSQL 中
一、RRD 數(shù)據(jù)庫(kù)及 RRDTOOL 簡(jiǎn)介
意為 Round Robin Database。設(shè)計(jì)理念為按照 round-robin 的方式進(jìn)行存儲(chǔ),在一個(gè)周期之后(可自己定義),新的
數(shù)據(jù)會(huì)覆蓋掉原來(lái)的數(shù)據(jù)。所以 RRD 數(shù)據(jù)庫(kù)適合用來(lái)存儲(chǔ)動(dòng)態(tài)數(shù)據(jù),并且不需長(zhǎng)期存儲(chǔ)。因?yàn)槭侵芷谛缘母采w舊的數(shù)據(jù)
所以數(shù)據(jù)庫(kù)的大小基本上就會(huì)固定下來(lái),并不會(huì)隨著時(shí)間而增大。
 
RRDTOOL 是由 Tobias Oetiker 開(kāi)發(fā)的自由軟件,使用 RRD 作為存儲(chǔ)格式。RRDTOOL 提供了很多工具用來(lái)對(duì) RRD 數(shù)據(jù)庫(kù)  www.2cto.com  
進(jìn)行操作,包括創(chuàng)建,更新,查詢,以及生成顯示圖等。RRDTOOL 同時(shí)也提供了很多語(yǔ)言的 API 以方便操作。
 
Ganglia 是一個(gè)分布式的監(jiān)控系統(tǒng),采用 RRD 數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)存儲(chǔ)和可視化。Hadoop 包里即有一個(gè)與 ganglia 相關(guān)
的配置文件,修改一些參數(shù)和對(duì) ganglia 進(jìn)行一些設(shè)置即可對(duì) hadoop 集群進(jìn)行監(jiān)控。每個(gè)不同的屬性的數(shù)據(jù)都存在一個(gè)
RRD 數(shù)據(jù)庫(kù)里。
 
二、將數(shù)據(jù)導(dǎo)入 MYSQL 中
也會(huì)存在這樣的情況,可能想對(duì) rrdtool 采集到的數(shù)據(jù)進(jìn)行長(zhǎng)期存儲(chǔ),從而進(jìn)行一些分析。而 RRD 數(shù)據(jù)庫(kù)的數(shù)據(jù)是不斷
更新的,雖然也可以保留長(zhǎng)期的數(shù)據(jù),但精度不夠。比如說(shuō)一個(gè) RRD 數(shù)據(jù)庫(kù)的步長(zhǎng)為 15 秒,也就是說(shuō),每隔 15 秒,
就會(huì)有一個(gè)新的值存入(比如內(nèi)存使用率),同時(shí)覆蓋一個(gè)舊的值。一個(gè) RRD 數(shù)據(jù)庫(kù)存儲(chǔ) 5761 個(gè)這樣的數(shù)據(jù)(一天 +15  www.2cto.com  
秒). 而且隨著時(shí)間的推移總是存儲(chǔ)最近一天的數(shù)據(jù)。然后在通過(guò)這些值不斷地計(jì)算步長(zhǎng)更高的值,比如我們可以通過(guò)
這些 15 秒的數(shù)據(jù)算出 360s 的數(shù)據(jù)(平均值),然后以 360s 為步長(zhǎng)將這些值再存進(jìn)去,不過(guò)這時(shí)候可以存儲(chǔ)的時(shí)間區(qū)間就
更長(zhǎng)了,同樣的行數(shù)可以存儲(chǔ) 24 天的數(shù)據(jù)。以此類(lèi)推,也可以以一天為單位存儲(chǔ)一年的數(shù)據(jù),不過(guò)這時(shí)候的精度就只有
一天了,那些舊的 15s 的數(shù)據(jù)都已經(jīng)被覆蓋掉了。如果想要把這些數(shù)據(jù)都存儲(chǔ)起來(lái),就需要通過(guò)腳本定時(shí)進(jìn)行數(shù)據(jù)導(dǎo)入。
LINUX 上做這些是很方便的,perl,python,lua,ruby 都是不錯(cuò)的選擇,shell 也可以。然后用 crond 設(shè)置在一定時(shí)間
定時(shí)執(zhí)行即可。以下是 python 的示例代碼:
(注:python 學(xué)的一般,基本上是邊看書(shū),邊寫(xiě)的代碼,問(wèn)題不少,請(qǐng)各位指正。)
 
首先是初始化,創(chuàng)建數(shù)據(jù)庫(kù)及相應(yīng)的表:
import os
import MySQLdb
import string
 
root= /var/lib/ganglia/rrds/hap-clu
dirs=os.listdir(root)
 
map1=string.maketrans(. , _)
map2=string.maketrans(– , _)
 
conn=MySQLdb.connect(host= localhost , user= root ,passwd= 123456)
cursor=conn.cursor()  www.2cto.com  
 
for onedir in dirs:
    dbname=onedir.translate(map1).translate(map2)
    cursor.execute(create database if not exists +dbname)
    conn.commit()
    conn.select_db(dbname)
    # print onedirname
    print DB: +dbname+ .
    files=os.listdir(root+ / +onedir)
    for onefile in files:
        tablename=onefile[:-4].translate(map1)
        if(dbname== __SummaryInfo__):
            cursor.execute(create table if not exists +tablename+ (time_id int not null primary key,value varchar(30),num varchar(30)) )
        else:
            cursor.execute(create table if not exists +tablename+ (time_id int not null primary key,value varchar(30)) )
        conn.commit()
       # print CREATE TABLE +tablename
    print CREATE DATABASE +dbname+
 
cursor.close();
 
這里面有不少說(shuō)明的地方:
1. 存儲(chǔ)的目錄:ganglia 里面默認(rèn)是這個(gè)目錄,不過(guò)可以修改。其他不同應(yīng)用也應(yīng)該不同。最后的那個(gè) hap-clu 是集群  www.2cto.com  
的名字。在這個(gè)目錄下,每個(gè)節(jié)點(diǎn)占一個(gè)目錄,目錄名一般為 IP 地址,最后還有一個(gè) summary 的目錄。對(duì)應(yīng)著,為每個(gè)
目錄(節(jié)點(diǎn))創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),每個(gè)屬性一個(gè)表。
2.MYSQL 數(shù)據(jù)庫(kù)和表的命名規(guī)則中不允許有 . 和 –,所以對(duì)應(yīng)的數(shù)據(jù)庫(kù)名和表名要做相應(yīng)的轉(zhuǎn)換。這里使用的是
translate 函數(shù)。
 
3. 原本以為這個(gè)腳本只需執(zhí)行一次,不過(guò)在實(shí)際應(yīng)用過(guò)程中,發(fā)現(xiàn)表的數(shù)量和數(shù)據(jù)庫(kù)的數(shù)量可能會(huì)增加。比如有新添加的
節(jié)點(diǎn),就需要及時(shí)為它創(chuàng)建數(shù)據(jù)庫(kù)。對(duì)于一些已存在的節(jié)點(diǎn),有可能有些屬性的數(shù)據(jù)是后來(lái)才檢測(cè)到的。比如我碰到的情況
就是運(yùn)行了一段時(shí)間之后關(guān)于 swap 的統(tǒng)計(jì)信息才出來(lái),RRD 數(shù)據(jù)庫(kù)也才創(chuàng)建。我不知道這是配置的問(wèn)題還是常態(tài)。但為了
順利運(yùn)行,這個(gè)腳本也要每天和插入數(shù)據(jù)的腳本一樣定時(shí)運(yùn)行,并且在后者之前。
 
插入數(shù)據(jù)的腳本:
import os
import commands
import MySQLdb
import string
import rrdtool
#from xml.etree.ElementTree import ElementTree
  www.2cto.com  
 
#working directory
root= /var/lib/ganglia/rrds/hap-clu
dirs=os.listdir(root)
 
#mysql table name limit
map1=string.maketrans(. , _)
map2=string.maketrans(– , _)
 
conn=MySQLdb.connect(host= localhost , user= root ,passwd= 123456)
cursor=conn.cursor()
 
for onedir in dirs:
    dbname=onedir.translate(map1).translate(map2)
    conn.select_db(dbname)
 
    print DB: +dbname+ .
    files=os.listdir(root+ / +onedir)
    os.chdir(root+ / +onedir)
    for onefile in files:
        # it seems that all is AVERAGE
        tablename=onefile[:-4].translate(map1) 
        data=rrdtool.fetch(onefile, AVERAGE)
        firsttime=data[0][0]  www.2cto.com  
        count=0
        while count 5761:
            time=firsttime+15*count
            value=data[2][count][0]
            if value==None:
                count+=1
                continue
            if dbname== __SummaryInfo__ :
                num=data[2][count][1]
                fvalue=[time,str(value),str(num)]
                try:
                    cursor.execute(insert into +tablename+ values(%s,%s,%s) ,fvalue)
                except MySQLdb.IntegrityError:
                    pass
            else:  www.2cto.com  
                fvalue=[time,str(value)]
                try:
                    cursor.execute(insert into +tablename+ values(%s,%s) ,fvalue)
                   # print OK +str(count)
                except MySQLdb.IntegrityError:
                    pass  www.2cto.com  
 
            count+=1
        conn.commit()
        print UPDATING TABLE +tablename
cursor.close();
 
說(shuō)明:
 
1.python 有 RRDTOOL 的模塊,相應(yīng)的命令都已經(jīng)可以通過(guò)模塊內(nèi)的函數(shù)直接調(diào)用,并且結(jié)果是的列表或者元組
,很容易遍歷。另外有一種方法就是通過(guò)調(diào)用外部命令將 rrd 導(dǎo)出到 XML 中(RRDTOOL 內(nèi)置有此功能),好處是 XML
里面的數(shù)據(jù)極其相近,缺點(diǎn)是太繁瑣,效率也不高,還要解析 XML。
2.count 是 RRD 里存儲(chǔ)的數(shù)據(jù)的行數(shù),這里為了省事直接設(shè)置成了默認(rèn)的值。嚴(yán)謹(jǐn)?shù)脑拺?yīng)該是先通過(guò) RRDTOOL INFO 取得
想關(guān)的結(jié)構(gòu)信息,得到這個(gè)值,然后再調(diào)用。rrdtool.fetch 即可取得所存儲(chǔ)的所有值。
3. 關(guān)于 commit。剛開(kāi)時(shí)對(duì) API 不熟悉,沒(méi)有加這一句,結(jié)果數(shù)據(jù)都沒(méi)導(dǎo)進(jìn)去。第一次加在每次 insert 之后,結(jié)果插入  www.2cto.com  
速度奇慢,更新一次要差不多一天,根本沒(méi)有用。放到后面之后就很快了。
 
4. 因?yàn)椴迦氲念l率和 RRD 更新的頻率不一樣,為了保證數(shù)據(jù)的連續(xù)性(不丟失),插入的頻率要比更新的頻率高。這樣會(huì)有
很多重復(fù)的數(shù)據(jù),這里用主鍵(時(shí)間戳,為 UNIX 秒數(shù))和 IntegrityError 來(lái)跳過(guò)那些已經(jīng)插入的數(shù)據(jù)。當(dāng)初這樣做的時(shí)候
已經(jīng)考慮到一個(gè)問(wèn)題,就是當(dāng)表里原有行數(shù)很多時(shí),到后面插入的速度有多慢?(單個(gè)表每天更新的數(shù)據(jù)為 5700 行左右,一個(gè)
月為 17 萬(wàn)行左右,一年就會(huì)超過(guò) 200 萬(wàn)行)。現(xiàn)在我運(yùn)行的結(jié)果是表中已有 5 萬(wàn)行數(shù)據(jù),插入速度并沒(méi)有明顯的減慢,想接著再
運(yùn)行一段時(shí)間觀察一下。如果太慢就得換一個(gè)方法。

上述內(nèi)容就是如何將 RRD 數(shù)據(jù)庫(kù)中數(shù)據(jù)導(dǎo)入 MYSQL 中,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-28發(fā)表,共計(jì)4438字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 高淳县| 武山县| 阳西县| 荥阳市| 江源县| 沾化县| 宿迁市| 利川市| 河北区| 滁州市| 镇沅| 吴江市| 尤溪县| 修武县| 综艺| 汝城县| 绥宁县| 平江县| 临城县| 吉隆县| 林甸县| 永嘉县| 灵宝市| 武山县| 东港市| 扎鲁特旗| 张家界市| 镇康县| 长泰县| 晋城| 阿瓦提县| 临澧县| 阿图什市| 富蕴县| 灵山县| 南投县| 闽清县| 长寿区| 乌拉特后旗| 松阳县| 平顶山市|