1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

#14. Azure IoT EdgeのStore-and-Forwardは何時間耐えられる?TTL・Disk容量・再送時間を確認する

1
Posted at

Azure IoT EdgeのStore-and-Forwardは何時間耐えられる?TTL・Disk容量・再送時間を確認する

Azure IoT EdgeのStore-and-Forwardを設定すると、Cloudとの通信が切れても、edgeHubが未送信Messageをローカルに保持できます。

しかし、24時間365日の無人運用を考えると、

Store-and-Forwardが有効になっているだけでは不十分

です。

実運用では、少なくとも次を確認する必要があります。

・何時間Messageを保持できるのか
・Disk容量は足りるのか
・TTLは十分なのか
・RestartしてもDataは残るのか
・Cloud復旧後、何分で再送が終わるのか
・Data欠落や重複が発生しないか

この記事では、Azure IoT EdgeのStore-and-Forwardを、

設定できている

ではなく、

Cloud断に何時間耐えられるか

という視点で確認します。


結論

最初に結論です。

Store-and-Forwardで実際に保持できる時間は、大まかには、

TTLで許可された保持時間

と

Disk容量から計算した保持可能時間

の短い方

で決まります。

つまり、

実質的な保持可能時間
=
min(TTL, Storageから計算した保持時間)

です。

さらに、Cloudが復旧したあとも、

Cloud Connected
=
完全復旧

ではありません。

通信断中に蓄積したDataがすべて再送され、

Backlog = 0

になるところまで確認する必要があります。


1. まず「何時間のCloud断に耐えたいか」を決める

最初に決めるのはDisk容量ではありません。

まず、

最大何時間のCloud通信断までDataを失わず保持したいか

を決めます。

例えば、

30分
2時間
6時間
24時間
72時間

では、必要なStorage容量もTTLも大きく変わります。

例えば要件が、

最大24時間のCloud Disconnectまで
Dataを保持したい

であれば、少なくとも24時間分のDataをEdge PC側へ保存できる必要があります。

実際には限界ぎりぎりではなく、

想定最大通信断
+
Safety Margin

で設計します。


2. Disk容量から「何時間持つか」を計算する

例えば、1時間に発生するData量が、

50 MB/hour

だったとします。

10時間通信が切れると、

50 MB × 10時間
=
500 MB

24時間なら、

50 MB × 24時間
=
1.2 GB

必要です。

基本的には、

必要容量
=
1時間あたりのData量
×
想定通信断時間

で概算できます。

逆に、Storage容量から、

あと何時間保持できるか

も計算できます。

例えば、Store-and-Forwardで安全に使用できる領域が、

3.5 GB

Data増加量が、

50 MB/hour

であれば、

3500 MB
÷
50 MB/hour
=
約70時間

です。

この考え方を使うと、

Disk残量 3.5GB

よりも、

現在のData量なら
あと約70時間保持できる

と表示できます。

障害対応では、この方が判断しやすくなります。


3. Data量は想像ではなく実測する

重要なのは、

50 MB/hour

のような値を想像だけで決めないことです。

実際にSystemを動かして、

1時間
3時間
24時間

などの単位でStorage使用量を測ります。

例えば、

試験開始時
10.00 GB

1時間後
10.12 GB

なら、

約120 MB/hour

増加しています。

Edge PC全体のDisk容量は、

df -h

で確認できます。

ただし、同じDiskには、

OS Log
Docker Log
Application Log
Temporary File

なども書き込まれます。

Store-and-Forward単体の増加量を確認するなら、edgeHubが使用しているStorage領域を個別に確認した方が分かりやすいです。

Host側へPersistent Storageを割り当てている場合は、

sudo du -sh <edgeHubのHost Storage Path>

などで確認できます。

Mount設定は、

docker inspect edgeHub

でも確認できます。


4. Diskが大きくてもTTLが短ければ保持できない

Store-and-Forwardでは、Disk容量だけでなく、

timeToLiveSecs

も確認する必要があります。

timeToLiveSecsは、edgeHubが未送信Messageを保持する時間です。

Microsoft Learn上の既定値は、

7200秒
=
2時間

です。

そのため、

Disk容量
100時間分

TTL
2時間

という構成では、100時間保持できるわけではありません。

TTL側が先にLimitになります。

逆に、

TTL
72時間

Disk容量
20時間分

なら、Disk側が先にLimitになります。

したがって、

実質的な保持可能時間

=
TTLによる保持時間

と

Disk容量による保持時間

の短い方

と考えます。


5. Cloud復旧後にはBacklogが残る

次に見落としやすいのが、Cloud復旧後です。

例えば、

02:00
Cloud Disconnect

08:00
Cloud Reconnect

だったとします。

08:00にIoT HubとのConnectionが復旧しても、Edge PCには6時間分の未送信Dataが残っています。

この未送信Dataを、ここでは、

Backlog

とします。

例えば通常、

100 MB/hour

のDataが発生するSystemで6時間通信が停止すると、

100 MB × 6時間
=
600 MB

のBacklogが発生します。

Cloud復旧後は、

過去6時間分のData
+
現在発生しているData

を同時に送る必要があります。


6. 再送速度が通常Data量と同じでは追いつかない

例えば通常のData発生量が、

100 MB/hour

だったとします。

Cloud復旧後の送信能力も、

100 MB/hour

しかなければ、

新規Data発生
100 MB/hour

送信
100 MB/hour

となります。

これでは、新しいDataを送るだけで送信能力をすべて使ってしまいます。

通信断中に溜まったBacklogは減りません。

したがって、

送信可能量
>
通常のData発生量

である必要があります。


7. 「何時間で追いつくか」を計算する

例えば、

通常Data発生量
100 MB/hour

Cloud復旧後の送信能力
300 MB/hour

だったとします。

新しく発生するDataへ、

100 MB/hour

必要なので、Backlog解消に使用できるのは、

300 - 100
=
200 MB/hour

です。

6時間の通信断で、

600 MB

溜まっている場合、

600 MB
÷
200 MB/hour
=
3時間

となります。

つまり、

08:00
Cloud Reconnect

↓

11:00頃
Backlog Clear

です。

このため、

何時間Offlineに耐えられるか

と、

Cloud復旧後、何時間で追いつけるか

は別の指標として確認した方がよいです。


8. 「Connected」だけで復旧判定しない

Monitoring側でも、復旧を1段階にしない方が分かりやすくなります。

例えば、

NORMAL
↓
CLOUD DISCONNECTED
↓
BUFFERING
↓
CLOUD RECONNECTED
↓
RESENDING
↓
BACKLOG CLEARED
↓
NORMAL

という状態管理です。

CloudとのConnectionが復旧しても、

6時間分のDataを再送中

なのであれば、まだ完全なNormalとは言えません。

Cloud Reconnected
≠
System Recovered

です。


9. 欠落を確認するためMessage IDやSequenceを持たせる

障害試験では、

通信断中に発生したDataが本当にすべてCloudへ届いたか

を確認する必要があります。

そのため、可能であればDataへ、

Message ID
Sequence Number
Timestamp
Device ID

などを持たせます。

例えば、

10001
10002
10003
10004
10005

まで送信されている状態で通信を切断し、

10006
10007
10008
10009

がOffline中に発生したとします。

復旧後、Cloud側で、

10001
10002
10003
10004
10005
10006
10007
10008
10009

まで確認できれば、Sequence上の欠落はありません。


10. Duplicateも確認する

確認するのは欠落だけではありません。

IoT EdgeのMessage Routingは、少なくとも1回の配信を保証する仕組みなので、受信側ではDuplicateの可能性も考慮します。

例えば、

10001
10002
10003
10003
10004

となっていれば、

10003

が重複しています。

そのためCloud側でも、

Message ID
Sequence Number

などを使って、

Missing
Duplicate

を確認できるようにしておくと障害試験がしやすくなります。


11. 実際にやっておきたい障害試験

Store-and-Forwardは設定だけを見るのではなく、実際に通信を切って確認します。

Test 1:短時間のCloud Disconnect

まずは5分程度です。

正常通信
↓
Cloud通信を遮断
↓
Dataを発生
↓
Cloud通信を復旧

通信断中に、

Application Moduleが停止しない
edgeHubが動作している
Dataが保持される
Storage使用量が増える

ことを確認します。

復旧後は、保存されたDataがIoT Hubへ送信されることを確認します。


Test 2:長時間のDisconnect

次に、

30分
1時間
3時間
6時間

などへ延ばします。

それぞれについて、

Disconnect Duration
Generated Messages
Storage Increase
Reconnect Time
Backlog Clear Time
Missing
Duplicate

を記録します。

例えば、

Disconnect:
3 hours

Generated:
10,800 messages

Recovered:
10,800 messages

Missing:
0

Duplicate:
0

Backlog Clear:
18 minutes

のように数字で残します。


Test 3:Cloud断中にIoT EdgeをRestart

さらに、

Cloud Disconnect
↓
Data蓄積
↓
IoT Edge Restart
↓
CloudはまだDisconnect
↓
Data発生継続
↓
Cloud Restore

を試します。

ここで確認したいのは、

Restart前に保持していたDataが残っているか

です。

Production環境では、edgeHubやedgeAgentの状態をContainer内部だけへ依存させず、Host側のPersistent Storageへ保存する構成が重要になります。


Test 4:Cloud断中にOSをReboot

24時間365日の無人Edge PCでは、OS Rebootも現実的なFailureとして考えます。

Cloud Disconnect
↓
Data蓄積
↓
OS Reboot
↓
Ubuntu起動
↓
IoT Edge起動
↓
CloudはまだDisconnect
↓
Cloud Restore

通信断単体だけでなく、

通信断
+
Restart

でもDataが保持できることを確認します。


Test 5:Backlogが0になるまで確認

最後に、

Cloud Restore

だけを確認して終わらせないようにします。

Cloud Restore
↓
Backlog送信開始
↓
Queue減少
↓
Backlog Clear
↓
通常Dataのみ

まで確認します。

記録する時刻も、

Reconnect Time
Backlog Clear Time

の2つを分けます。


12. 試験中に確認するコマンド

Moduleの状態は、

iotedge list

で確認できます。

edgeHubのLogは、

iotedge logs edgeHub --since 30m

で確認できます。

通信やMessage関連に絞るなら、

iotedge logs edgeHub --since 30m 2>&1 | \
grep -Ei 'cloud|connect|disconnect|message|store|queue'

のように確認できます。

Disk全体は、

df -h

Persistent Storageを割り当てている場合は、

sudo du -sh <edgeHubのHost Storage Path>

も確認します。

つまり、障害試験では、

Network
edgeHub
Application
Message
Storage
Cloud

を同時に見ます。


13. 「Disk 80%」だけではなく「あと何時間」を監視する

通常のDisk Monitoringでは、

70%
80%
90%

のようなThresholdを設定します。

もちろんこれも必要ですが、Store-and-Forwardでは、

Remaining Buffer Time

という考え方も有効です。

例えば、

Store-and-Forward用空き容量
3 GB

現在のData増加量
150 MB/hour

なら、

3000
÷
150
=
約20時間

です。

つまり、

Disk Usage: 75%

だけではなく、

Remaining Buffer Time:
約20時間

と判断できます。

Cloud通信断が発生している時に、

通信断開始
02:00

現在
08:00

経過
6時間

残り保持可能時間
約18時間

と分かれば、

今すぐ現地対応が必要か
Network復旧を待てるか
Data保持Limitが近いか

を判断しやすくなります。


14. 最終的には試験結果を数字で残す

例えば、次のように結果を残します。

Cloud Disconnect Test

Disconnect Duration:
6 hours

Generated Messages:
21,600

Recovered Messages:
21,600

Missing:
0

Duplicate:
0

Storage Increase:
1.4 GB

Disk Remaining:
42 GB

Reconnect:
08:00

Backlog Cleared:
08:37

Recovery Time:
37 minutes

単に、

Store-and-Forward OK

と記録するよりも、

6時間のCloud DisconnectでもData欠落がなく、Cloud復旧後37分でBacklogが解消した

と説明できる方が、SystemのReliabilityを判断しやすくなります。


まとめ

Azure IoT EdgeのStore-and-Forwardを24時間365日の無人運用で使用するなら、

Store-and-Forwardが有効

だけではなく、

何時間Dataを保持できるか

Diskはどれくらい必要か

TTLは十分か

RestartしてもDataが残るか

Cloud復旧後に何分で追いつくか

Missingがないか

Duplicateがないか

まで確認しておく必要があります。

特に重要なのは、

Cloud Reconnected
≠
完全復旧

という点です。

Cloud Disconnect
↓
Buffering
↓
Cloud Reconnect
↓
Resending
↓
Backlog Clear
↓
Normal

まで確認して、初めて復旧と判断できます。

またDisk容量も、

あと何GBあるか

だけではなく、

現在のData量なら
あと何時間保持できるか

へ変換すると、障害時の判断材料として使いやすくなります。

Store-and-Forwardを単なるAzure IoT Edgeの機能としてではなく、

「何時間の通信断に耐えられるのか」を数字で説明できる運用設計

として扱うことがポイントです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?