Upgrade to Pro — share decks privately, control downloads, hide ads and more …

IoTのデータ保存をSREの観点で考える

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →
gr1m0h
November 13, 2026

 IoTのデータ保存をSREの観点で考える

gr1m0h

November 13, 2026

Transcript

19 slides
  1. Wataru Tsuda @gr1m0h SWE, SRE @ Topotal, Inc. - 複数社で

    SRE の技術⽀援に従事 - IoT関連事業会社を2社経験 コミュニティ活動 - SRE Lounge Hiroshima - SRE Magazine - SORACOM UG Hiroshima Website: grimoh.net SORACOM UG Hiroshima #12 | gr1m0h 2
  2. SRE as a Service - 技術⽀援 私たちは Cross-Company Embedded SRE

    として、課題を解決する。 クライアントが変わっても、SRE としてやるべきことは変わらない。 SRE のプロフェッショナルを、 今すぐチームに。 事業成⻑を続ける SRE の仕組みづくりを プロフェッ ショナルが並⾛サポート
  3. 前提 SLI は、利⽤者から⾒たサービスの状態を測る指標 利⽤者の満⾜度 直接は測れない SLI = SLI → Service

    Level Indicator 満⾜度の⽬安として測る指標 SLO → Service Level Objective SLI の⽬標値 良いイベントの数 Web API の例 対象イベントの数 正常に応答したリクエスト ∕ 有効なリクエスト 出典: Google SRE Book「Service Level Objectives」、Google SRE Workbook「Implementing SLOs」 SORACOM UG Hiroshima #12 | gr1m0h 5
  4. 01 課題と対策 送信の完了と、保存の完了を分けて確認する Beam が受け取る PUBACK を返す → IoT Rule

    で処理 デバイスが受け取る「成 功」 → 保存先に書き込む → 利⽤者が参照できる ここから先の結果は、デバイスには返らない 01 ID と内容で突き合わせる 02 受付と参照の時間差を前提にする 測定データごとに event_id を付ける。件数だけで は、重複や別のデータが混ざっても気づけない ⾮同期の構成では、受付直後はまだ参照できないことが ある。失敗した処理の再試⾏‧再処理まで設計する MQTT 3.1.1 では、受信側は後続の配送を完了する前に PUBACK を返せる。出典: OASIS「MQTT Version 3.1.1」、W. Vogels「Eventually Consistent」 SORACOM UG Hiroshima #12 | gr1m0h 7
  5. 01 再現 SORACOM Arc‧Beam から AWS IoT Core へ送る構成を作る Mac

    IoT Device Simulator Paho MQTT‧QoS 1 MQTT → SORACOM Beam 201912 MQTTS → 通常保存先 AWS IoT Core → クライアント証明書 IoT Rule CloudWatch Logs → …/telemetry error action …/rule-errors soratun → Arc の WireGuard トンネル MQTT 通信はこの中 を通る SORACOM CLI:設定を確認する soratun:つなぐ Arc ⽤のクライアント。バーチャル SIM の情報で WireGuard トンネルを作り、Wi-Fi から SORACOM につ なぐ Beam の転送先と認証情報 ID を確認 soracom groups get … \ | jq '.configuration.SoracomBeam' Beam → AWS IoT Core は MQTTS。証明書と秘密鍵は Beam の認証情報ストアに登録し、シミュレーターには持たせない。出典: SORACOM「SORACOM Arc」「soratun」「Beam MQTT エン トリポイント」 SORACOM UG Hiroshima #12 | gr1m0h 8
  6. 01 再現 実測 通信を⽌める実験と、保存先の権限を外す実験をする 通信を15秒⽌める 保存先の権限を外す soratun に SIGSTOP →

    15秒後に SIGCONT 完了待ち2秒‧ 測定データ18件 IoT Rule の保存先を、権限のないロググループに変更 デバイス側の送信 送信側で失敗扱い(再送な し) 保存先にあった測定データ 再送1回までの重複 結果 成功 5件 通常の保存 AccessDenied 18 / 18 error action 元データを保全 3件 後⽇の再投⼊ 通常保存先に回復 どちらの実験でも、送信側の結果だけでは、保存先にデータがあるかは判断できなかった 停⽌対象は Mac 上の Arc クライアントで、SIM の圏外の再現ではない。再投⼊は AWS CLI の iot-data publish で、Arc‧Beam を通していない SORACOM UG Hiroshima #12 | gr1m0h 9
  7. 01 再現 実測 実験1の結果を、3通りの⽅法で集計する 実験1(通信を15秒停⽌‧測定データ18件)。%は、作った18件を分⺟にした SLI の値 集計の⽅法 再送なし 再送1回まで

    送信側の失敗扱いを⽋損とする 5件欠損 72% 2件欠損 89% 保存先の件数をそのまま使う 18件 100% 21件 117% 18 / 18 100% 18 / 18 100% event_id で照合し、重複を除く 結果 良いイベントの決め⽅で、同じ実験でも SLI の値が変わった。event_id で照合すると、どちら の条件でも18件すべて保存されていた SORACOM UG Hiroshima #12 | gr1m0h 10
  8. 01 課題と対策 設計案 期限内配送SLIを、鮮度‧網羅性‧正しさで設計する 期限は⽤途ごとに決める 異常の通知:すぐ必要 履歴の分析:後からでよい 期限内に参照できた対象データのユニーク数 期限内配送 SLI

    その期間に測定‧配送されるべき対象データの数 鮮度 freshness 網羅性 coverage 正しさ correctness 遅れは測定時刻から測る 分⺟はデバイス⼀覧と測定予定 から決める 分⼦は ID で重複を除く 受付時刻が基準だと、 通信が切れていた間の遅れが⼊らない 受信ログからは作らない 期限前のデータは失敗にしない 再送の重複で件数を増やさない 内容も元データと照合する Google SRE Workbook「Implementing SLOs」のデータパイプラインの例を当てはめた設計例。今回は未実装 SORACOM UG Hiroshima #12 | gr1m0h 11
  9. 02 課題と対策 再送‧再処理を冪等にする 冪等 何回受け取っても、結果が1回分と変わらない性質 01 id: a1 id: a1

    → 保存先に1件 同じデータには、同じ ID と内容を使う 再送でも再投⼊でも、event_id と測定時刻を変えない 02 保存先で重複を判定する ⼀意制約や処理済みの記録を使う。ID を付けただけでは重複は防げない 03 同じ ID で内容が違えば、エラーにする ID が同じでも、内容が変わっていないかを照合する 出典: AWS Builders' Library「Making retries safe with idempotent APIs」 SORACOM UG Hiroshima #12 | gr1m0h 13
  10. 02 課題と対策 再試⾏と、復旧時の負荷を制御する 起こりうること たまったデータが⽚付くまでの時間 Thundering Herd B / (μ

    − λ) 多数のデバイスが同時に再接続し、アクセスが集中する Retry Storm 再試⾏が負荷を増やし、失敗と再試⾏がさらに増える 決めておくこと B 未処理の件数 λ 新しく届く件数(毎秒) μ 保存できる件数(毎秒) Exponential Backoff と jitter で再試⾏の時刻を散らす 再試⾏する層と、全体の試⾏回数の上限 再試⾏で直らないエラーは、設定を直してから再処理 μ ≤ λ なら未処理は減らない。jitter は時刻をず らすだけで、μ は増えない B / (μ − λ) は届く件数と保存できる件数が⼀定の場合の⾒積もり。出典: AWS Builders' Library「Timeouts, retries and backoff with jitter」、Google SRE Book「Handling Overload」 SORACOM UG Hiroshima #12 | gr1m0h 14
  11. 02 課題と対策 設計案 観測した状態ごとに、復旧の扱いを決める 観測した状態 運⽤での扱い 復旧の確認 通信中断‧送信のタイムアウト 対象 ID

    を照合し、重複を考慮して再送 新しい測定値の更新、対象データの到達と内 容 保存の権限エラー 保存先‧権限を直し、退避したデータを再処 新しいデータの保存、障害中の ID と元デー 理 タの照合 復旧後も未処理が減らない 要求量‧再試⾏量‧処理能⼒を⾒直す 未処理の件数、⼀番古い未処理の待ち時間 未処理が0件でも、途中で捨てられたデータは保存先に⽋損したまま。 復旧の確認も SLI と同じく、保 存先で参照できるデータを基準にする error action は Rule action が失敗したときに元データを残す仕組み。接続認証や SQL のエラーは対象外 SORACOM UG Hiroshima #12 | gr1m0h 15
  12. 02 再現 ローカルで再 現 同時2件までの保存先に、並列数を変えて送る Subscriber(並列数 8 / 2) 保存サービスへ送る。失敗したら1秒後に再配送

    ↓ 並列数 8 並列数 2 要求(再送を含む) 69 45 HTTP 503 24 0 約5.16秒 約2.69秒 45件を送った結果 HTTP 保存サービス 同時2件まで(1件100ms)。超過分は HTTP 503 ↓ 全件の処理まで SQLite 結果 並列数を8にすると503と再配送が増え、2並列より全件の処理に時間がかかった ローカルで各1回。同時処理数の上限はアプリで意図的に設けたもの。構成は NATS JetStream → Subscriber → HTTP 保存サービス → SQLite SORACOM UG Hiroshima #12 | gr1m0h 16
  13. ま と め IoT のデータ保存で、考えておくべき2つの観点 01 成功の定義 デバイスの「送信成功」と、⽤途ごとの期限内に保存先で参照できること を区別して確認しているか 02

    ⽋損データの復旧 障害中に⽋損したデータを、重複や負荷を増やさずに戻せるか 2つとも、利⽤者が参照できる保存先のデータを基準にし、測定データごとの ID で照合する ご⾃⾝のサービスでも、この2つの観点で⾒直してみてください 17
  14. References 参考資料 SORACOM Arc SORACOM Beam MQTT エントリポイント users.soracom.io/ja-jp/docs/arc/ users.soracom.io/ja-jp/docs/beam/mqtt/

    AWS IoT Rules: Error action MQTT Version 3.1.1 docs.aws.amazon.com/iot/…/rule-error-handling.html docs.oasis-open.org/mqtt/…/mqtt-v3.1.1-os.html Paho MQTT Go v1.5.1 token.go Google SRE Book: Service Level Objectives github.com/eclipse-paho/paho.mqtt.golang sre.google/sre-book/service-level-objectives/ Google SRE Workbook: Implementing SLOs Making retries safe with idempotent APIs sre.google/workbook/implementing-slos/ aws.amazon.com/builders-library/… Timeouts, retries and backoff with jitter Google SRE Book: Handling Overload aws.amazon.com/builders-library/… sre.google/sre-book/handling-overload/ soratun Eventually Consistent users.soracom.io/ja-jp/docs/arc/soratun-overview/ allthingsdistributed.com/2008/12/… asdf-soracom github.com/gr1m0h/asdf-soracom SORACOM UG Hiroshima #12 | gr1m0h 18

More Decks by gr1m0h

Other Decks in Technology