Yet Another TimeSeries Database는 InfluxDb 및 RavenDB에서 영감을 받은 실험적인 시계열 데이터베이스입니다.
YATsDb는 뛰어난 성능을 갖춘 순수 .NET 및 최신 C# 으로 구현됩니다(Intel i7-8550U CPU, 1.80GHz, 24GB RAM, SSD에서 초당 약 30K 삽입 - 한 번에 하나씩 행 삽입).
홈 IoT 프로젝트를 위한 시계열 데이터베이스가 필요했지만 InfluxDb를 사용하는 것은 지루할 것입니다. 데이터를 입력하고 문의하는 방법을 알고 있는 프로토타입의 구현에는 단 12시간이 걸렸습니다.
YATsDb는 GUI, OpenAPI 정의 및 작업을 갖춘 완전한 데이터베이스 구현입니다. 실행하려면 .NET 8 런타임이 필요합니다.
YATsDb.Lite는 핵심 시계열 데이터베이스 기능을 갖춘 AOT 컴파일 버전입니다. 대상 시스템에 대한 종속성이 없습니다.
결과 바이너리는 15MB 미만으로 상대적으로 작습니다.
다음은 cURL을 사용하여 YATsDb/YATsDb.Litle을 사용하는 예입니다( YATsDb는 OpenAPI 엔드포인트 정의도 제공함).
예제에서 기본 URL은 http://localhost:8080/입니다.
새 버킷 smart_home
만들기:
curl -XPOST http://localhost:8080/management/bucket --header " Content-Type: application/json " --data-binary " { " bucketName " : " smart_home " , " description " : null} "
간단한 라인 형식 ( <measurement>[,<tag>] <value>[,<value>...n] [<timestampInMs>]
)으로 샘플 데이터를 입력합니다. 이 형식은 InfluxDb 에서 영감을 얻었지만 명명된 값을 사용하지 않습니다. , 그러나 위치 값. 또한 InfluxDb 이전에는 밀리초 단위의 unix 타임스탬프가 항상 시간으로 사용됩니다.
다음 샘플 데이터는 온도, 습도, 조도 등 가정에서 센서를 측정한 데이터를 나타냅니다.
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.0,45,80.4 1719242779202 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 23.1,39.4,75.0 1719243079200 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 23.2,41.7,NULL 1719243379246 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room2 23.0,41,80.4 1719243379256 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.0,45,80.4 1719243679194 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room2 22.7,47.4,NULL 1719243979257 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 22.1,47,NULL 1719244279035 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room3 18.7,NULL,NULL 1719244579031 "
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 24.7,51.7,2.4 1719244879109 "
하나의 메시지에 여러 줄을 보내는 것이 가능하지만 모든 쉘이 이를 지원하는 것은 아닙니다.
curl -XPOST http://localhost:8080/write/smart_home --data-binary " sensors_data,Room1 24.7,51.7,2.4 1719244879109
sensors_data,Room1 24.8,55.7,3.9 1719244899109 "
YATsDb에서는 SQL과 유사한 구문으로 쿼리할 수 있지만 이름 대신 값 위치를 사용합니다. 쿼리 결과는 JSON 결과입니다.
12시간이 지난 Room2 의 습도 데이터 선택:
curl -XPOST http://localhost:8080/query/raw/smart_home --data-binary " SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -10h) GROUP BY +10m "
데이터 데이터 삽입을 위한 완전한 문법 - 간단한 라인 프로토콜:
<lines> ::= <line> [ [r]n...n ]
<line> ::= <measurement> <values> [<timestamp>]
<measurement> ::= measurement_name [, tag]
<values> ::= <value> [, ...250]
<value> ::={ double_value | NULL }
<timestamp> ::= unix timestamp in milliseconds
태그 없이 측정:
sensors_data 12.5 1608852317000
태그를 사용한 측정:
sensors_data,home/room3/esp32 12.5 1608852317000
여러 값으로 측정:
sensors_data,home/room3/esp32 12.5,-14.3,89,47.0036 1608852317000
결측값을 사용한 측정(결측값에는 NULL
사용):
sensors_data,home/room4/esp32 12.5,NULL,89,47.0036 1608852317000
Unix 타임스탬프 없이 측정 - 현재 서버 시간이 사용됩니다.
sensors_data,home/room3/esp32 12.5
여러 줄 값:
sensors_data,home/room3/esp32 12.5 1608852317000
pc_data,Workstation1 25.78,47.5,236566 1608852317900
sensors_data,home/room3/esp32 13.5 1608852417000
데이터 쿼리를 위한 완전한 문법:
<SELECT statement> ::= SELECT <projection statement> FROM measurement_name
[<WHERE statement>]
[<GROUPBY statement>]
[<LIMIT statement>]
<projection statement> ::= { * | <projection> [ ,...250 ]}
<projection> ::= <projection function>(<index>)
<projection function> ::= { VARIANCE | SUM | COUNT | AVG | IDENTITY | MAX | MIN | STDDEV | REMEDIAN | SIGN | CHANGE_PER_SEC | CHANGE_PER_HOUR | CHANGE_PER_DAY }
<index> ::= integer_number
<WHERE statement> ::= WHERE <where function> [AND ...n]
<where function> ::= { TAG(<string>) | INTERVAL(<interval exp>, <interval exp>) }
<string> ::= string
<interval exp> ::= { integer_number | <time span> | <string> | NOW() }
<time span> ::= { + | - }double_value{ ms | s | m | h | d | w | y }
<GROUPBY statement> ::= GROUP BY <time span>
<LIMIT statement> ::= LIMIT { integer_number | integer_number, integer_number | ..integer_number }
모든 데이터 선택:
SELECT * FROM sensors_data
Room3 에서 처음 5개 레코드를 선택합니다.
SELECT * FROM sensors_data WHERE TAG('Room3') LIMIT 0,5
10분 단위로 온도 데이터 그룹을 선택합니다.
SELECT AVG(0), MIN(0), MAX(0) FROM sensors_data GROUP BY +10m
Room2 에서 습도 데이터 선택:
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') GROUP BY +1d
12시간이 지난 Room2 의 습도 데이터 선택:
SELECT AVG(1), MIN(1), MAX(1), COUNT(1) FROM sensors_data WHERE TAG('Room2') AND INTERVAL(NULL, -12h) GROUP BY +10m
마지막 레코드 선택:
SELECT * FROM sensors_data LIMIT ..1
모든 데이터 그룹화:
SELECT AVG(0), AVG(1), AVG(2) FROM sensors_data
구체적인 시간으로 선택하세요(밀리초 단위의 Unix 타임스탬프 사용).
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL(1603519860000, 1608852317000) GROUP BY +10m
구체적인 시간을 기준으로 선택하세요(사람이 읽을 수 있는 시간 사용).
SELECT AVG(0), COUNT(0) FROM sensors_data WHERE INTERVAL('2012-06-12 08:33:12.478', '2012-06-13') GROUP BY +10m