5分鐘瞭解阿里時序時空數據庫

簡介

時序時空數據庫(Time Series & Spatial Temporal Database,簡稱 TSDB)是一種高性能、低成本、穩定可靠的在線時序時空數據庫服務,提供高效讀寫、高壓縮比存儲、時序數據插值及聚合計算等服務,普遍應用於物聯網(IoT)設備監控系統、企業能源管理系統(EMS)、生產安全監控系統和電力檢測系統等行業場景;除此之外,還提供時空場景的查詢和分析的能力。html

三個數據庫

時序時空數據庫文檔最近通過幾回大的變更,有點亂,看的時候注意一下。算法

時序數據庫TSDB版數據庫

通過阿里集團大規模驗證的時序數據庫,支持分佈式集羣架構水平擴展,支持千萬物聯網設備接入,基於自研壓縮算法,具有高效壓縮比。安全

- 針對時序數據優化,包括存儲模型,多值數據模型,時序數據壓縮、聚合、採樣,高效壓縮算法,列存,邊緣一體化;
- 具有高性能,內存優先數據處理,分佈式MPP SQL並行計算,動態schema,實時流式數據計算引擎,海量時間線自適應索引;
- 高可擴展,數據動態分區,水平擴展,動態彈性擴容,動態升降配規格;高可靠性,自動集羣控制,線程級讀寫分離,多層數據備份,分級存儲;
- 瞄準的是大規模指標數據,事件數據場景

協議兼容OpenTSDB,但後面內核實現是阿里自研的。但仍是徹底能夠把它看成OpenTSDB的阿里雲版,參見 相比OpenTSDB優點服務器

InfluxDB®網絡

不只僅是一個數據庫,更是一個監控系統,圍繞採集,可視化,分析服務,事件和指標存儲和計算系統;走的是tick生態,瞄準指標,事件,trace,日誌,實時分析場景。架構

InfluxDB®剛上線不久,如今還處在公測階段。寫入速度經測試,每次500條數據,每秒能夠執行26次左右,平均速度達到1萬/s,增長每次寫入數據條數應該還能提升速度。另外,請求地址是外網,若是使用vpc網絡速度應該還會加快很多。curl

注意:InfluxDB在阿里雲上有時間線限制(數據庫級別最高1萬),時間線的定義參見後面簡介。分佈式

時空數據庫函數

時空數據庫可以存儲、管理包括時間序列以及空間地理位置相關的數據。時空數據是一種高維數據,具備時空數據模型、時空索引和時空算子,徹底兼容SQL及SQL/MM標準,支持時空數據同業務數據一體化存儲、無縫銜接,易於集成使用。

時空數據庫主要是空間相關的場景,好比熱力圖,店鋪選址等等。

時序數據庫簡介(主要是InfluxDB)

時序數據庫英文全稱爲 Time Series Database,提供高效存取時序數據和統計分析功能的數據管理系統。主要的時序數據庫包括OpenTSDB、Druid、InfluxDB以及Beringei這四個。本人主要了解一點OpenTSDB和InfluxDB,不過期序數據庫有不少共性。

基本名詞

measurement:

tag,field和time列的容器
對InfluxDB: measurement在概念上相似於傳統DB的table(表格)
  從原理上講更像SQL中表的概念,這和其餘不少時序數據庫有些不一樣
對其餘時序DB: Measurement與Metric等同

field(數值列):

TSDB For InfluxDB®中不能沒有field。
注意:field是沒有索引的
在某種程度上,能夠把field理解爲k/v表的value

tag(維度列):

tag不是必需要有的字段
tag是被索引的,這意味着以tag做爲過濾條件的查詢會更快
在某種程度上,能夠把field理解爲k/v表的key

timestamp(時間戳):

默認使用服務器的本地時間戳
時間戳是UNIX時間戳,單位:納秒
最小的有效時間戳是-9223372036854775806或1677-09-21T00:12:43.145224194Z
最大的有效時間戳是9223372036854775806或2262-04-11T23:47:16.854775806Z

point(數據點):

由時間線(series)中包含的field組成。每一個數據點由它的時間線和時間戳(timestamp)惟一標識
您不能在同一時間線存儲多個有相同時間戳的數據點

Series(時間線)

Series是InfluxDB中最重要的概念,時序數據的時間線就是:一個數據源採集的一個指標隨着時間的流逝而源源不斷地吐出數據這樣造成的一條數據線稱之爲時間線。

下圖中有兩個數據源,每一個數據源會採集兩種指標:

Series由Measurement和Tags組合而成,
Tags組合用來惟一標識Measurement
就是說:
1. Measurement不一樣,就是不一樣的時間線
2. Measurement相同,Tags不一樣也是不一樣的時間線

retention policy(保留策略,簡稱RP)

一個保留策略描述了:

1.InfluxDB保存數據的時間(DURATION)
  2.以及存儲在集羣中數據的副本數量(REPLICATION)
  3.指定ShardGroup Duration
注:複本係數(replication factors)不適用於單節點實例。
autogen:無限的存儲時間而且複製係數設爲1

RP建立語句以下:

CREATE RETENTION POLICY ON <retention_policy_name> ON <database_name>
DURATION <duration> REPLICATION <n> [SHARD DURATION <duration> ] [DEFAULT]
實例:
CREATE RETENTION POLICY "one_day_only" ON "water_database"
DURATION 1d REPLICATION 1 SHARD DURATION 1h DEFAULT

寫入時指定rp進行寫入:

% 若是沒有指定任何RP,則使用默認的RP
curl -X POST 'http://localhost:8086/write?db=mydb&rp=six_month_rollup'
    --data-binary 'disk,host=server01 value=442221834240i 1435362189575692182'

Shard Group

Shard Group是InfluxDB中一個重要的邏輯概念:

Shard Group會包含多個Shard,每一個Shard Group只存儲指定時間段的數據
不一樣Shard Group對應的時間段不會重合

每一個Shard Group對應多長時間是經過Retention Policy中字段」SHARD DURATION」指定的:

若是沒有指定,也能夠經過Retention Duration(數據過時時間)計算出來,二者的對應關係爲:

Retention Duration              SHARD DURATION
<2 days                             1h
>=2days and <=6month                1day
>6month                             7day

Shard:

相似於HBase中Region,Kudu中Tablet的概念
1. Shard是InfluxDB的存儲引擎實現,具體稱之爲TSM(Time Sort Merge Tree) Engine
    負責數據的編碼存儲、讀寫服務等。
TSM相似於LSM,所以Shard和HBase Region同樣包含Cache、WAL以及Data File等各個組件,
    也會有flush、compaction等這類數據操做
2. Shard Group對數據按時間進行了分區
    InfluxDB採用了Hash分區的方法將落到同一個Shard Group中的數據再次進行了一次分區
    InfluxDB是根據hash(Series)將數據映射到不一樣的Shard,而非根據Measurement進行hash映射

InfluxQL

行協議

格式:

<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] 
  <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]

如下是符合格式的數據寫入TSDB For InfluxDB®的示例:

1. cpu,host=serverA,region=us_west value=0.64
2. payment,device=mobile,product=Notepad,method=credit billed=33,licenses=3i 1434067467100293230
3. stock,symbol=AAPL bid=127.46,ask=127.48
4. temperature,machine=unit42,type=assembly external=25,internal=37 1434067467000000000

登陸

// 登陸
$> influx -ssl -username <帳號名稱> -password <密碼> -host <網絡地址> -port 3242
// 建立用戶
> create user gordon with password '1QAZ2wsx'
// 賦值權限
grant all privileges to gordon
// 建立數據庫
create database testdb

基本QL

1. # 顯示時間線
show series
2. # 顯示度量
show measurements
3. # 顯示Tag的Key
show tag keys
4. # 顯示數據字段的Key
show field keys

查詢:

1. select * from metrics
2. show tag keys from metrics
3. show field keys from metrics

# 查看自定度量的數據, 裏面的相關字段,官方建議使用「雙引號」標註出來
select * from "CPU" order by time desc

# 查看指定的Field和Tag
select "load1","role" from "CPU" order by time desc

# 只查看Field
select *::field from "CPU"

# 查詢指定Tag的數據,注意,Where子句的字符串值要使用「單引號」,字符串值
# 若是沒有使用引號或者使用了雙引號,都不會有任何值的返回
select * from "CPU" where role = 'FrontServer'

# 查詢Field中,load1 > 20 的全部數據
select * from "CPU" where "load1" > 20

插入:

INSERT weather,location=us-midwest temperature=82 1465839830100400200

基本運算:

# 執行基本的運算
select ("load1" * 2) + 0.5 from "CPU"

// SELECT語句支持使用基本的數學運算符,例如,+、-、/、*和()等等。
SELECT field_key1 + field_key2 AS "field_key_sum"
  FROM "measurement_name" WHERE time < now() - 15m

SELECT (key1 + key2) - (key3 + key4) AS "some_calculation"
  FROM "measurement_name" WHERE time < now() - 15m

// 使用聚合函數計算百分比:
SELECT (sum(field_key1) / sum(field_key2)) * 100 AS "calculated_percentage"
  FROM "measurement_name" WHERE time < now() - 15m GROUP BY time(1m)


原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索