Hadoop集群監(jiān)控需要使用時(shí)間序列數(shù)據(jù)庫(kù),今天花了半天時(shí)間調(diào)研使用了一下最近比較火的InfluxDB,發(fā)現(xiàn)還真是不錯(cuò),記錄一下學(xué)習(xí)心得。
Influx是用Go語(yǔ)言寫(xiě)的,專(zhuān)為時(shí)間序列數(shù)據(jù)持久化所開(kāi)發(fā)的,由于使用Go語(yǔ)言,所以各平臺(tái)基本都支持。類(lèi)似的時(shí)間序列數(shù)據(jù)庫(kù)還有OpenTSDB,Prometheus等。
OpenTSDB很有名,性能也不錯(cuò),但是基于HBase,要用那個(gè)還得先搭一套HBase,有點(diǎn)為了吃紅燒肉自己得先去殺豬,燙皮,拔毛的感覺(jué)。Prometheus相關(guān)文檔和討論太少,而InfluxDB項(xiàng)目活躍,使用者多,文檔也比較豐富,所以先看看這個(gè)。Influx可以說(shuō)是LevelDB的Go語(yǔ)言修改版實(shí)現(xiàn),LevelDB采用LSM引擎,效率很高,Influx是基于LSM引擎再修改的TSM引擎,專(zhuān)為時(shí)間序列設(shè)計(jì)。
InfluxDB 架構(gòu)原理介紹
LevelDB 架構(gòu)原理介紹
下午跟七牛的CrazyJVM聊了一下,因?yàn)槠吲6际怯肎o,所以也大量部署了Influx給大型企業(yè)級(jí)用戶(hù)使用,據(jù)說(shuō)是全球大的InfluxDB集群,七牛也給Influx提交了大量的Patch,結(jié)果Influx通過(guò)早期開(kāi)源弄得差不多穩(wěn)定了,突然就閉源了,這也太不局氣了,然后搞Cluster功能收費(fèi),單機(jī)功能免費(fèi)使用。
昨天看了一會(huì)文檔,今天試用了一下,感覺(jué)很不錯(cuò),值得推薦。把學(xué)習(xí)了解的內(nèi)容記錄下來(lái),供愛(ài)好者參考,也省的自己時(shí)間長(zhǎng)忘了。
InfluxDB其實(shí)不能說(shuō)像哪個(gè)數(shù)據(jù)庫(kù),初上手感覺(jué)更像Mongo類(lèi)型的NoSQL,但是有意思的是,它提供了類(lèi)SQL接口,對(duì)開(kāi)發(fā)人員十分友好。命令行查詢(xún)結(jié)果的界面又有點(diǎn)像MySQL,挺有意思的。
不寫(xiě)安裝部署和CLI接口,因?yàn)閷?shí)在沒(méi)得可寫(xiě),直接yum或者apt就裝了。service一啟動(dòng),再influx命令就進(jìn)命令行了,網(wǎng)上一大堆安裝教程
InfluxDB有幾個(gè)關(guān)鍵概念是需要了解的。
database:相當(dāng)于RDBMS里面的庫(kù)名。創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)句也十分相似。一進(jìn)去就可以先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)玩,加不加分號(hào)都行。
CREATE DATABASE 'hadoop'然后需要?jiǎng)?chuàng)建一個(gè)用戶(hù),我省事點(diǎn),直接創(chuàng)建一個(gè)高權(quán)限,就看了一天,然后直接寫(xiě)REST接口去了,權(quán)限管理慢慢再細(xì)看。
CREATE USER "xianglei" WITH PASSWORD 'password' WITH ALL PRIVILEGES使用查詢(xún)語(yǔ)句插入一條數(shù)據(jù)
INSERT hdfs,hdfs=adh,path=/ free=2341234,used=51234123,nonhdfs=1234Influx沒(méi)有先建立schema的概念,因?yàn)镮nflux允許存儲(chǔ)的數(shù)據(jù)是schemeless的,表在這里叫做measurement,數(shù)據(jù)在插入時(shí)如果沒(méi)有表,則自動(dòng)創(chuàng)建該表。
measurement: 相當(dāng)于RDBMS里面的數(shù)據(jù)表名。
在上面的INSERT語(yǔ)句中,跟在insert后面的第一個(gè)hdfs就是measurement,如果不存在一個(gè)叫做hdfs的,就自動(dòng)創(chuàng)建一個(gè)叫做hdfs的表,否則直接插入數(shù)據(jù)。
然后是tags,tags的概念類(lèi)似于RDBMS里面的查詢(xún)索引名,這里的tags是hdfs=adh和path=/,等于我建立了兩個(gè)tags。
free往后統(tǒng)稱(chēng)叫fields,tags和fields之間用空格分開(kāi),tags和fields內(nèi)部自己用逗號(hào)分開(kāi)。tags和fields名稱(chēng)可以隨意填寫(xiě),主要是一開(kāi)始設(shè)計(jì)好就行。
所以,對(duì)以上插入語(yǔ)句做一個(gè)注釋的話(huà),就是這樣。
INSERT [hdfs(measurement)],[hdfs=adh,path=/(tags)] [free=2341234,used=51234123,nonhdfs=1234(fields)]然后即可查詢(xún)?cè)摂?shù)據(jù)
SELECT free FROM hdfs WHERE hdfs='adh' and path='/'name: hdfs time free ---- ---- 1485251656036494252 425234 1485251673348104714 425234這里的where條件,即是上面tags里面的hdfs=adh和path=/,所以tags可以隨意添加,但是在插入第一條數(shù)據(jù)的時(shí)候,最好先設(shè)計(jì)好你的查詢(xún)條件。當(dāng)然,你插入的任何數(shù)據(jù),都會(huì)自動(dòng)添加time列,數(shù)了數(shù),應(yīng)該是納秒級(jí)的時(shí)間戳。
上面是Influx的基本概念和基本使用的記錄,下面是接口開(kāi)發(fā)的使用。以Tornado示例Restful查詢(xún)接口。
Influx本身支持restful的HTTP API,python有直接封裝的接口可以調(diào)用,直接 pip install influxdb即可
influxdb-python文檔
Talk is cheap, show me your code.
Models Influx模塊,用于連接influxdb
class InfluxClient: def __init__(self): self._conf = ParseConfig() self._config = self._conf.load() self._server = self._config['influxdb']['server'] self._port = self._config['influxdb']['port'] self._user = self._config['influxdb']['username'] self._pass = self._config['influxdb']['password'] self._db = self._config['influxdb']['db'] self._retention_days = self._config['influxdb']['retention']['days'] self._retention_replica = self._config['influxdb']['retention']['replica'] self._retention_name = self._config['influxdb']['retention']['name'] self._client = InfluxDBClient(self._server, self._port, self._user, self._pass, self._db) def _create_database(self): try: self._client.create_database(self._db) except Exception, e: print e.message def _create_retention_policy(self): try: self._client.create_retention_policy(self._retention_name, self._retention_days, self._retention_replica, default=True) except Exception, e: print e.message def _switch_user(self): try: self._client.switch_user(self._user, self._pass) except Exception, e: print e.message def write_points(self, data): self._create_database() self._create_retention_policy() if self._client.write_points(data): return True else: return False def query(self, qry): try: result = self._client.query(qry) return result except Exception, e: return e.message連接influxdb的配置從項(xiàng)目的配置文件里讀取,自己寫(xiě)也行。
Controller模塊InfluxController
class InfluxRestController(tornado.web.RequestHandler): ''' "GET" op=query&qry=select+used+from+hdfs+where+hdfs=adh ''' 查詢(xún)方法,使用HTTP GET def get(self, *args, **kwargs): op = self.get_argument('op') #自己實(shí)現(xiàn)的python switch case,網(wǎng)上一大堆 for case in switch(op): if case('query'): #查詢(xún)語(yǔ)句從url參數(shù)獲取 qry = self.get_argument('qry') #實(shí)例化Models里面的class influx = InfluxClient() result = influx.query(qry) #返回結(jié)果為對(duì)象,通過(guò)raw屬性獲取對(duì)象中的字典。 self.write(json.dumps(result.raw, ensure_ascii=False)) break if case(): self.write('No argument found') #寫(xiě)入數(shù)據(jù),使用HTTP PUT def put(self): op = self.get_argument('op') for case in switch(op): if case('write'): #data should urldecode first and then turn into json data = json.loads(urllib.unquote(self.get_argument('data'))) influx = InfluxClient() #寫(xiě)入成功或失敗判斷 if influx.write_points(data): self.write('{"result":true}') else: self.write('{"result":false}') break if case(): self.write('No argument found')Tornado配置路由
applications = tornado.web.Application( [ (r'/', IndexController), (r'/ws/api/influx', InfluxRestController) ], **settings )JSON項(xiàng)目配置文件
{ "http_port": 19998, "influxdb":{ "server": "47.88.6.247", "port": "8086", "username": "root", "password": "root", "db": "hadoop", "retention": { "days": "365d", "replica": 3, "name": "hound_policy" }, "replica": 3 }, "copyright": "CopyLeft 2017 Xianglei" }插入測(cè)試
def test_write(): base_url = 'http://localhost:19998/ws/api/influx' #data = '[{"measurement": "hdfs"},"tags":{"hdfs": "adh","path":"/user"},"fields":{"used": 234123412343423423,"free": 425234523462546546,"nonhdfs": 1341453452345}]' #構(gòu)造插入數(shù)據(jù) body = dict() body['measurement'] = 'hdfs' body['tags'] = dict() body['tags']['hdfs'] = 'adh' body['tags']['path'] = '/' body['fields'] = dict() body['fields']['used'] = 234123 body['fields']['free'] = 425234 body['fields']['nonhdfs'] = 13414 tmp = list() tmp.append(body) op = 'write' # dict data to json and urlencode data = urllib.urlencode({'op': op, 'data': json.dumps(tmp)}) headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'} try: http = tornado.httpclient.HTTPClient() response = http.fetch( tornado.httpclient.HTTPRequest( url=base_url, method='PUT', headers=headers, body=data ) ) print response.body except tornado.httpclient.HTTPError, e: print e test_write()插入數(shù)據(jù)后通過(guò)訪問(wèn)http連接獲取插入結(jié)果
curl -i "http://localhost:19998/ws/api/influx?op=query&qry=select%20*%20from%20hdfs" HTTP/1.1 200 OK Date: Tue, 24 Jan 2017 15:47:42 GMT Content-Length: 1055 Etag: "7a2b1af6edd4f6d11f8b000de64050a729e8621e" Content-Type: text/html; charset=UTF-8 Server: TornadoServer/4.4.2 {"values": [["2017-01-24T09:54:16.036494252Z", 425234, "adh", 13414, "/", 234123]], "name": "hdfs", "columns": ["time", "free", "hdfs", "nonhdfs", "path", "used"]}收工,明天用React寫(xiě)監(jiān)控前端
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前題目:試用時(shí)間序列數(shù)據(jù)庫(kù)InfluxDB-創(chuàng)新互聯(lián)
分享地址:http://aaarwkj.com/article20/cdpcco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、商城網(wǎng)站、響應(yīng)式網(wǎng)站、定制開(kāi)發(fā)、靜態(tài)網(wǎng)站、軟件開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容