[Up]常用資訊

[重點文章] 重點文章 [重點文章] 重點文章

2020年6月10日 星期三

[Influxdb] Influxdb相關概念及簡單實用操作

[Influxdb] Influxdb相關概念及簡單實用操作

 
#Step: 01 – Influxdb相關概念及簡單實用操作
最近學influxdb 使用時候記憶一下


2、命令列下建立及查詢

通過influx命令進行管理,可以使用如下命令建立資料庫:

> CREATE DATABASE "testDB"
> show databases //查詢當前的所有資料庫
> show databases
name: databases
---------------
name
_internal
testDB
> use testDB //使用某個資料庫

建庫的操作可以發現非常類似於mysql下的操作。而在influxdb下沒有細分的表的概念,influxdb下的表在插入資料庫的時候自動會建立。
可以通過SHOW measurements命令檢視所有的表,這個類似於mysql下的show tables; 。

> INSERT cpu,host=serverA,region=us_west value=0.64 //在cpu表中插入相關的資料
> SELECT * FROM cpu ORDER BY time DESC LIMIT 3 //查詢最近的三條資料
> SELECT * FROM /.*/ LIMIT 1 //正則表示式查詢
> delete from cpu where time=1480235366557373922 //刪除某條資料
> DROP MEASUREMENT "measurementName" //刪除表

#按时间逆序查询数据 (查詢最新資料)
select * from exec6_F5_system order by desc limit 5

update更新語句沒有,不過有alter命令,在influxdb中,刪除操作用和更新基本不用到 。
在針對資料儲存策略方面,有一個特殊的刪除方式,這個後面再提。

關於使用者的操作如下:

# 顯示使用者
SHOW USERS
# 建立使用者
CREATE USER "username" WITH PASSWORD 'password'
# 建立管理員許可權的使用者
CREATE USER "username" WITH PASSWORD 'password' WITH ALL PRIVILEGES
# 刪除使用者
DROP USER "username"

influxdb的許可權設定比較簡單,只有讀、寫、ALL幾種。更多使用者許可權設定可以參看官方文件:https://docs.influxdata.com/influxdb/v1.0/query_language/authentication_and_authorization/ 。
預設情況下,influxdb類似與mongodb,是不開啟使用者認證的,可以修改其 conf檔案,配置http塊內容如下:

[http]
enable = true
bind-address = ":8086"
auth-enabled = true # 開啟認證





資料儲存策略及連續查詢

1、資料儲存策略

一般情況下基於時間序列的point資料不會進行直接刪除操作,一般我們平時只關心當前資料,歷史資料不需要一直儲存,不然會佔用太多空間。
這裡可以配置資料儲存策略(Retention Policies),當資料超過了指定的時間之後,就會被刪除。

===========================================================================================================

SHOW RETENTION POLICIES ON "testDB" //檢視當前資料庫的Retention Policies
CREATE RETENTION POLICY "rp_name" ON "db_name" DURATION 30d REPLICATION 1 DEFAULT //建立新的Retention Policies
#註釋如下:
rp_name:策略名
db_name:具體的資料庫名
30d:儲存30天,30天之前的資料將被刪除
它具有各種時間引數,比如:h(小時),w(星期)
REPLICATION 1:副本個數,這裡填1就可以了
DEFAULT 設為預設的策略

===========================================================================================================

也可以通過如下命令修改和刪策略:


ALTER RETENTION POLICY "rp_name" ON db_name" DURATION 3w DEFAULT
DROP RETENTION POLICY "rp_name" ON "db_name


2、連續查詢(Continuous Queries)

當資料超過儲存策略裡指定的時間之後,就會被刪除。如果我們不想完全刪除掉,比如做一個數據統計取樣:
把原先每秒的資料,存為每小時的資料,讓資料佔用的空間大大減少(以降低精度為代價)。
這就需要InfluxDB提供的:連續查詢(Continuous Queries)。

SHOW CONTINUOUS QUERIES

CREATE CONTINUOUS QUERY cq_30m ON testDB BEGIN SELECT mean(temperature) INTO weather30m FROM weather GROUP BY time(30m) END

#註釋如下:
cq_30m:連續查詢的名字
testDB:具體的資料庫名
mean(temperature): 算平均溫度
weather: 當前表名
weather30m: 存新資料的表名
30m:時間間隔為30分鐘

當我們插入新資料之後,通過SHOW MEASUREMENTS查詢發現。可以發現數據庫中多了一張名為weather30m(裡面已經存著計算好的資料了)。
這一切都是通過Continuous Queries自動完成的。

刪除Continuous Queries

DROP CONTINUOUS QUERY  ON 


檢視當前的查詢策略


#RESTful 介面操作

插入及查詢操作:

# code from xxx.xxx.xxx
now=$(date '+%FT%T.000Z')
tomorrow=$(date -v +1d '+%FT%T.000Z')
echo "creating database"
curl -G http://localhost:8086/query --data-urlencode "q=CREATE DATABASE foo"
echo "creating retention policy"
curl -G http://localhost:8086/query --data-urlencode "q=CREATE RETENTION POLICY bar ON foo DURATION INF REPLICATION 1 DEFAULT"
echo "inserting data"
curl -d "{\"database\" : \"foo\", \"retentionPolicy\" : \"bar\", \"points\": [{\"measurement\": \"cpu\", \"tags\": {\"region\":\"uswest\",\"host\": \"server01\"},\"time\": \"$now\",\"fields\": {\"value\": 100}}]}" -H "Content-Type: application/json" http://localhost:8086/write
echo "inserting data"
curl -d "{\"database\" : \"foo\", \"retentionPolicy\" : \"bar\", \"points\": [{\"measurement\": \"cpu\", \"tags\": {\"region\":\"uswest\",\"host\": \"server01\"},\"time\": \"$tomorrow\",\"fields\": {\"value\": 200}}]}" -H "Content-Type: application/json" http://localhost:8086/write
sleep 1
echo "querying data"
curl -G http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT count(value) FROM \"foo\".\"bar\".cpu"
echo "querying data"
curl -G http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT count(value) FROM \"foo\".\"bar\".cpu where time < now() + 10d"


GZIP壓縮資料插入及查詢:

# code from xxx.xxx.xxx
echo "inserting data"
curl -v -i -H "Content-encoding: gzip" -H "Content-Type: application/json" -X POST -T foo.json.gz http://localhost:8086/write
rm foo.json.gz
echo "querying data with gzip encoding"
curl -v -G --compressed http://localhost:8086/query --data-urlencode "db=foo" --data-urlencode "q=SELECT sum(value) FROM \"foo\".\"bar\".cpu GROUP BY time(1h)"


還可以指定資料儲存策略及表的各關鍵值插入:

echo "creating retention policy"
curl -G http://localhost:8086/query --data-urlencode "q=CREATE RETENTION POLICY bar ON foo DURATION 300d REPLICATION 3 DEFAULT"
curl -d '{"database" : "foo", "retentionPolicy" : "bar", "points": [{"measurement": "network", "tags": {"host": "server01","region":"uswest"},"time": "2015-02-26T22:01:11.703Z","fields": {"rx": 2342,"tx": 9804}}]}' -H "Content-Type: application/json" http://localhost:8086/write
curl -d '{"database" : "foo", "retentionPolicy" : "bar", "points": [{"measurement": "network", "tags": {"host": "server01","region":"useast"},"time": "2015-02-27T22:01:11.703Z","fields": {"rx": 4324,"tx": 7930}}]}' -H "Content-Type: application/json" http://localhost:8086/write

無論是influx還是通過RESETful 引數進行查詢,其還有pertty引數可以使輸出的json格式更加美觀 。除此之外,influx命令還有column、CSV等格式輸出,
influx命令支援通過import引數輸入類csv類格式的資料。

 python lspool-loop3.py   

##
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from f5.bigip import ManagementRoot
from f5.utils.responses.handlers import Stats
import datetime
import sys
import getopt
import getpass
import argparse

#username = 'jenkins'
#password = 'jenkins'
password = getpass.getpass()
username = sys.argv[3]
#password = sys.argv[5]
host_ip = sys.argv[1]
fnames = sys.argv[2]
#poolnames = sys.argv[3]
now = datetime.datetime.now()
mgmt = ManagementRoot(host_ip, username, password, token=True)

#my_pool = mgmt.tm.ltm.pools.pool.load(partition='Common', name=(poolnames))

pools = mgmt.tm.ltm.pools.pool.load(name='Pool_ssh')
#my_pool_mbrs = my_pool.members_s.get_collection()
Count = 0
print ( "\n" )
print ("\033[0;37;44m\tCurrent Run date and time : \033[0m")
print (now.strftime("\033[0;37;45m\t%Y-%m-%d %H:%M:%S\t\t\033[0m"))

#pools = mgmt.tm.ltm.pools.get_collection()
#POOLS = ['Pool_ssh', 'Pool_syslog_Splunk_For_F5', 'pool_80_for_172.19.58.121']

for pool in pools:
    print (pool.name)
    for pool_mbr in pool.members_s.get_collection():
        mbr_stats = Stats(pool_mbr.stats.load())
        dic_test = mbr_stats.stat.nodeName
        dic_test1 = dic_test['description']
        dic_test2 = dic_test1.replace('/Common/', '')
        dic_btest = mbr_stats.stat.status_availabilityState
        dic_btest1 = dic_btest['description']
        dic_ctest = mbr_stats.stat.serverside_curConns
        dic_ctest1 = dic_ctest['value']
        dic_dtest = mbr_stats.stat.status_enabledState
        dic_dtest1 = dic_dtest['description']
        Count = ((Count+1))
        #print ( "%s_%02d pool_member: [ %s ] 主機狀態 : %s  目前連線數 : \033[43m[ %s ]\033[0m" % (fnames, Count, dic_test2, dic_btest1,  dic_ctest1) )
        if (dic_btest1 == 'available' or dic_dtest1 != 'enabled' or dic_btest1 == 'offline'):
          if (dic_dtest1 == 'enabled' and dic_btest1 == 'available'):
              print("%s  pool_member: [ %s ] 主機狀態 : \033[0;37;42m[ %s ]\033[0m 目前連線數 : \033[43m[ %s ]\033[0m" %(fnames, dic_test2, dic_btest1, dic_ctest1))
          elif (dic_dtest1 != 'disabled' or dic_btest1 != 'offline'):
              print("%s  pool_member: [ %s ] 主機狀態 : \033[0;37;41m[ %s ]\033[0m 目前連線數 : \033[43m[ %s ]\033[0m" %(fnames, dic_test2, dic_dtest1, dic_ctest1))
          elif (dic_btest1 == 'offline'):
              print("%s  pool_member: [ %s ] 主機狀態 : \033[0;37;41m[ %s ]\033[0m 目前連線數 : \033[43m[ %s ]\033[0m" %(fnames, dic_test2, dic_btest1, dic_ctest1))


print ( "\n" )
# vim:set nu et ts=4 sw=4 cino=>4:






沒有留言:

張貼留言