...
InfluxDB subscriptions는 InfluxDB에 기록된 모든 데이터가 local Local 또는 remote Remote endpoint로 복사됩니다.
Subscriptions는 주로 Kapacitor와 함께 사용되지만, InfluxDB에 “SUBSCRIPTION”를 생성하여 UDP, HTTP 또는 HTTPS 연결을 할 수 있는 모든 Endpoint는 InfluxDB에 “SUBSCRIPTION”을 생성하여 모든 데이터의 사본을 받을 Endpoint에 기록된 데이터를 전송할 수 있습니다.
How subscriptions work
데이터가 InfluxDB에 Write 될 때, HTTP, HTTPS 또는 UDP Line protocol(https://docs.influxdata.com/influxdb/v1.8/write_protocols/line_protocol_tutorial)을 통해 Subscriber endpoint에 복제됩니다.
InfluxDB subscriber service는 여러 개의 “writers" goroutines(https://golangbot.com/goroutines)를 생성하여 Subscription endpoints에 Write 데이터를 전송합니다.
Writer goroutines의 개수는 influxdb.
conf의 conf
의 write-concurrency
설정으로 정의됩니다.
InfluxDB에 Writes가 발생될 발생할 때, 각각의 Subscription writer는 지정된 Subscription endpoints로 Write 된 데이터를 전송합니다. 그러나 write-concurrency
(multiple writers)의 부하와 수집속도로 인해 Writer processes와 Transport layer의 Nanosecond의 차이가 발생할 수 있으며, 이에 따라 차례로 수신되지 않을 수 있습니다.
InfluxDB에 Writes가 발생할 때, 각각의 Subscription writer는 지정된 Subscription endpoints로 Write 된 데이터를 전송합니다. 그러나 write-concurrency
(multiple writers)의 부하와 수집속도로 와 전송하려는 데이터양의 상대적 차이로 인해 Writer processes와 Transport layer의 Nanosecond의 차이가 시차가 발생할 수 있으며, 이에 따라 데이터가 차례로 수신되지 전송되지 않을 수 있습니다.
Important information about high write loads
While setting the subscriber
write-concurrency
to greater than 1 does increase your subscriber write throughput, it can result in out-of-order writes under high ingest rates. Settingwrite-concurrency
to 1 ensures writes are passed to subscriber endpoints sequentially, but can create a bottleneck under high ingest rates.What
write-concurrency
should be set to depends on your specific workload and need for in-order writes to your subscription endpointwrite-concurrency
를 1보다 크게 설정하게 되면 Writer processes가 증가하게 되지만 전송하려는 데이터에 부하가 발생하여 비 순차 쓰기가 발생할 수 있습니다.
반대로write-concurrency
를 1로 설정하면 Subscription endpoints에 차례대로 전송되지만, Writer processes에 병목 현상이 발생할 수 있습니다.write-concurrency
는 작업량에 따라 달라지며 Subscription endpoint에 순서대로 전송되게 설정해야 합니다.
InfluxQL subscription statements
아래의 InfluxQL 문을 사용하여 Subscriptions를 관리하십시오관리합니다.
CREATE SUBSCRIPTION
SHOW SUBSCRIPTIONS
DROP SUBSCRIPTION
Create subscriptions
InfluxQL문 CREATE SUBSCRIPTION
을 사용하여 Subscriptions를 생성합니다. CREATE SUBSCRIPTION
은 Subscription name, Database name, Retention policy, InfluxDB에 Write 된 데이터를 복사해야 하는 Host의 URL이 필요하며 구문은 아래 예시를 참고하십시오참고합니다.
Code Block | ||
---|---|---|
| ||
-- Pattern: CREATE SUBSCRIPTION "<subscription_name>" ON "<db_name>"."<retention_policy>" DESTINATIONS <ALL|ANY> "<subscription_endpoint_host>" -- Examples: -- Create a SUBSCRIPTION on database 'telegraf' and retention policy 'autogen' that sends data to 'example.com:9090' via HTTP. CREATE SUBSCRIPTION "cloudhub_sub" ON "telegraf"."autogen" DESTINATIONS ALL 'http://example.com:9090' -- Create a SUBSCRIPTION on database 'telegraf' and retention policy 'autogen' that round-robins the data to 'h1.example.com:9090' and 'h2.example.com:9090' via UDP. CREATE SUBSCRIPTION "cloudhub_sub" ON "telegraf"."autogen" DESTINATIONS ANY 'udp://h1.example.com:9090', 'udp://h2.example.com:9090' |
...
SHOW SUBSCRIPTIONS
문은 CREATE SUBSCRIPTION
으로 생성한 인증계정과 URL을 모두 출력합니다.
...
여러 Host로 Subscription data 전송
CREATE SUBSCRIPTION
문을 사용하여 여러 Hosts의 Endpoints를 DESTINATIONS
절에 쉼표로 구분하여 지정할 수 있습니다.
또한 DESTINATIONS
절 뒤에 ALL
또는 ANY
으로 로 구분하여 Endpoint에 쓰는 방법을 결정합니다.
ALL
: 지정된 모든 Host에 기록합니다.
ANY
: Round robin방식으로 robin 방식으로 지정된 Host에 기록합니다.
여러 Hosts의 Subscriptions 방법
Code Block | ||
---|---|---|
| ||
-- Write all data to multiple hosts CREATE SUBSCRIPTION "cloudhub_sub" ON "telegraf"."autogen" DESTINATIONS ALL 'http://host1.example.com:9090', 'http://host2.example.com:9090' -- Round-robin writes between multiple hosts CREATE SUBSCRIPTION "cloudhub_sub" ON "telegraf"."autogen" DESTINATIONS ANY 'http://host1.example.com:9090', 'http://host2.example.com:9090' |
Subscription protocols
Subscriptions은 HTTP, HTTPS, or UDP 전송 프로토콜을 사용할 수 있습니다.
사용할 엔드 포인트는 구독 엔드 포인트에서 예상 한 프로토콜에 따라 결정됩니다.
사용은 서브스크립션 엔드포인트에서 기대하는 프로토콜에 의해 결정됩니다
Which to use is determined by the protocol expected by the subscription endpoint. If creating a Kapacitor subscription, this is defined by the subscription-protocol
option in the [[influxdb]]
section of your kapacitor.conf
Subscription endpoint는 수신될 Host의 프로토콜로 사용합니다.
Kapacitor subscription으로 생성한다면 kapacitor.conf
의 [[influxdb]]
section의 프로토콜을 사용합니다.
kapacitor.conf
Code Block | ||
---|---|---|
| ||
[[influxdb]]
# ...
subscription-protocol = "http"
# ... |
InfluxDB와 Kapacitor 간의 HTTPS 연결 및 보안에 대한 자세한 내용은 Kapacitor security(https://docs.influxdata.com/kapacitor/v1.5/administration/security/#secure-influxdb-and-kapacitor)를 참조합니다.
Show subscriptions
InfluxQL의 SHOW SUBSCRIPTIONS
문은 등록된 모든 Subscriptions 목록을 조회합니다.
Code Block | ||
---|---|---|
| ||
SHOW SUBSCRIPTIONS |
Example output:
Code Block | ||
---|---|---|
| ||
> SHOW SUBSCRIPTIONS
name: _internal
retention_policy name mode destinations
---------------- ---- ---- ------------
monitor kapacitor-ca6e15ee-db97-4818-ba2f-c79a0994953a ANY [http://localhost:9092]
monitor kapacitor-d054b3d1-aac4-4fb4-84ca-0aee38d48bf1 ANY [http://90807848ad83:9092] |
Remove subscriptions
InfluxQL의 DROP SUBSCRIPTIONS
문은 등록 된 Subscriptions를 삭제합니다.
Code Block | ||
---|---|---|
| ||
-- Pattern:
DROP SUBSCRIPTION "<subscription_name>" ON "<db_name>"."<retention_policy>"
-- Example:
DROP SUBSCRIPTION "cloudhub_sub" ON "telegraf"."autogen" |
모든 Subscriptions 삭제
모든 Subscriptions를 제거해야 할 경우에는 아래 스크립트를 참고하여 실행합니다.
Code Block | ||
---|---|---|
| ||
# Environment variable exports:
# Uncomment these if INFLUXUSER and INFLUXPASS are not already globally set.
# export INFLUXUSER=influxdb-username
# export INFLUXPASS=influxdb-password
IFS=$'\n'; for i in $(influx -format csv -username $INFLUXUSER -password $INFLUXPASS -database _internal -execute 'show subscriptions' | tail -n +2 | grep -v name); do influx -format csv -username $INFLUXUSER -password $INFLUXPASS -database _internal -execute "drop subscription \"$(echo "$i" | cut -f 3 -d ',')\" ON \"$(echo "$i" | cut -f 1 -d ',')\".\"$(echo "$i" | cut -f 2 -d ',')\""; done |
Configure InfluxDB subscriptions
InfluxDB subscription 설정은 influxdb.conf
의 [subscriber]
section에서 할 수 있습니다.
Subcriptions를 사용하려면 [subscriber
] section의 enabled
항목을 true
로 설정해야 합니다.
아래는 Subscriber 설정의 influxdb.conf
의 예제 입니다.
Code Block | ||
---|---|---|
| ||
[subscriber]
enabled = true
http-timeout = "30s"
insecure-skip-verify = false
ca-certs = ""
write-concurrency = 40
write-buffer-size = 1000 |
[subscriber
]의 구성 옵션에 대한 설명은 Configuring InfluxDB(https://docs.influxdata.com/influxdb/v1.8/administration/config#subscription-settings)를 참조합니다.
Troubleshooting
Subscription endpoints에 Access 할 수 없거나 해제됐을 경우
Endpoint host에 Access 할 수 없거나 연결이 해제됐을 경우, InfluxDB Subscription이 삭제되지 않고 계속해서 데이터를 전송한다고 하면 아래와 같은 오류가 표시됩니다.
Code Block | ||
---|---|---|
| ||
Mar 31 17:59:24 localhost influxd: ts=2020-03-31T08:59:24.866296Z lvl=info msg="Post http://192.168.56.110:8088/write?consistency=&db=telegraf&precision=ns&rp=autogen: dial tcp 192.168.56.110:8088: connect: connection refused" log_id=0LsbAPaW000 service=subscriber
Mar 31 17:59:24 localhost influxd: [httpd] 192.168.56.102 - - [31/Mar/2020:17:59:24 +0900] "POST /write?consistency=any&db=telegraf HTTP/1.1" 204 0 "-" "Telegraf/1.12.4" eb6b6cc0-732d-11ea-9f4f-0800277e0592 7910 |
네트워크 오류와 같은 이유로 위와 같은 에러가 발행할 수 있습니다. 하지만 대부분 경우는 Subscription Endpoint가 존재하지 않고 InfluxDB Subscription이 삭제되지 않았을 경우 발생합니다.
InfluxDB는 Endpoint의 상태를 알 수 없기 때문에, Endpoint에 Access 할 수 없는 경우 Subscription이 자동으로 삭제되지 않습니다. 따라서 Subscription endpoint가 제거되면 InfluxDB에서 Subscription을 수동으로 삭제해야 합니다.