HeteroTSDB: 異種混合キーバリューストアを用いた自動階層化のための 時系列データベースアーキテクチャ / HeteroTSDB: A Time Series Database Architecture for Automatically Tiering on Heterogeneous Key-Value Stores

HeteroTSDB: 異種混合キーバリューストアを用いた自動階層化のための 時系列データベースアーキテクチャ / HeteroTSDB: A Time Series Database Architecture for Automatically Tiering on Heterogeneous Key-Value Stores

第11回インターネットと運用技術の研究会 (IOTS2018)。
論文: https://yuuk.io/papers/heterotsdb_iots2018.pdf

システム管理者からの需要の増加に伴い,システムの状態を時系列データとして収集するためのモ ニタリングシステムがサービスとして提供されるようになってきている.モニタリングサービスの時系列 データベースには,高解像度な時系列データ,時系列データの長期間保存,高い書き込みスケーラビリティ と高可用性が求められている.一方で,これまでサービスの機能追加のためにデータ構造の拡張性を考慮 した時系列データベースは提案されていない.本研究では,インメモリのキーバリューストア (KVS) とオ ンディスクの KVS を組み合わせた異種混合 KVS により自動階層化する時系列データベースアーキテク チャを提案する.提案手法では,メモリとディスクのデータ構造を異なる KVS として分離することによ り,書き込み効率とデータ保存効率を保ちつつ,用途ごとに最適化されたデータ構造へ書き込みを複製す るといった拡張が容易となる.

A658ec7f1badf73819dfa501165016c1?s=128

Yuuki Tsubouchi (yuuk1)

December 06, 2018
Tweet

Transcript

  1. HeteroTSDB: ҟछࠞ߹ΩʔόϦϡʔετΞ Λ༻͍ͨࣗಈ֊૚ԽͷͨΊͷ ࣌ܥྻσʔλϕʔεΞʔΩςΫνϟ ௶಺ ༎थ, ࿬ࡔ ேਓ, ᖛా ݈,

    দ໦ խ޾(͸ͯͳ), Ѩ෦ ത(ϨϐμϜ,ίίϯ,JAIST), দຊ ྄հ(GMOϖύϘ,͘͞ΒΠϯλʔωοτ) 2018.12.6 ୈ11ճΠϯλʔωοτͱӡ༻ٕज़γϯϙδ΢Ϝ IOTS2018  
  2. ໨࣍ 1. എܠͱ໨త 2. ࣌ܥྻσʔλϕʔεͷ՝୊ 3. HeteroTSDBΞʔΩςΫνϟ 4. ࣮ݧͱ࣮؀ڥ΁ͷద༻ 5.

    ·ͱΊ 2
  3. എܠͱ໨త 3 1.

  4. γεςϜܭଌͷॏཁੑͷߴ·Γ • Πϯλʔωοτ͕౰ͨΓલʹར༻Ͱ͖Δ࣌୅ • Մ༻ੑͱԠ౴଎౓΁ͷߴ͍ཁٻ • ཁٻΛຬ͍ͨͯ͠Δ͔Ͳ͏͔Λ֬ೝ͢ΔͨΊʹɺγεςϜΛৗ ʹܭଌ͢Δ͜ͱ(ϞχλϦϯά)͕ඞཁ • ϞχλϦϯάઐ༻ͷγεςϜߏஙɾӡ༻͕ඞཁ

    • ϞχλϦϯάγεςϜͷߏஙɾӡ༻ͷෛՙΛ࡟ݮ͢ΔͨΊʹϞ χλϦϯάαʔϏεͷར༻૿Ճ 4
  5. ࣌ܥྻσʔλϕʔε΁ͷཁٻ • ܭଌͨ݁͠ՌΛ࣌ܥྻʹه࿥͠औಘ͢ΔͨΊͷ࣌ܥྻσʔλϕʔ εΛར༻͢Δ͜ͱ͕͋Δ • ϞχλϦϯάαʔϏεఏڙͷͨΊʹ࣌ܥྻσʔλϕʔεʹର͢ Δߴ͍ੑೳཁٻ͕͋Δ • ߴॻ͖ࠐΈεέʔϧΞ΢τੑ •

    ߴՄ༻ੑ • ॻ͖ࠐΈॲཧޮ཰ • σʔλอଘޮ཰ 5
  6. ࣌ܥྻσʔλϕʔεͷ՝୊ • ϞχλϦϯάαʔϏεͷػೳ௥ՃͷͨΊʹσʔλߏ଄Λ֦ுͯ͠ ͍͘ඞཁ͕͋Δ • ͜Ε·Ͱͷख๏Ͱ͸֦ுੑΛߟྀ͞Ε͍ͯͳ͔ͬͨ • ઌߦख๏͸ີ݁߹ͳDBMS(σʔλϕʔε؅ཧγεςϜ)ʹґଘ 6 ຊൃදͰ͸ੑೳཁٻΛຬͨͭͭ͠

    ՝୊ΛղܾͰ͖ΔΞʔΩςΫνϟͷఏҊ
  7. ੑೳͱ֦ுੑΛཱ྆͢ΔΞʔΩςΫνϟఏҊ • ߴॻ͖ࠐΈεέʔϧΞ΢τੑͱߴՄ༻ੑ • εέʔϧΞ΢τͤ͞΍͍͢KVSΛར༻͢Δ • ॻ͖ࠐΈॲཧޮ཰ͱσʔλอଘޮ཰ • ϝϞϦͱσΟεΫͷ଎౓ࠩͱ༰ྔ୯Ձͷੑ࣭Λ૊Έ߹ΘͤΔ •

    ΠϯϝϞϦKVSͰॻ͖ࠐΈΛड͚෇͚ɺΦϯσΟεΫKVSͰݹ ͍࣌ܥྻσʔλΛอ࣋͢Δ • σʔλߏ଄ͷ֦ுੑ • ֦ு಺༰ʹ߹Θͤͯผ్DBMSΛ༻ҙ͠ॻ͖ࠐΈΛෳ੡͢Δ 7
  8. ࣌ܥྻσʔλϕʔεͷ ՝୊ 8 2.

  9. ࣌ܥྻσʔλϕʔεͷઌߦख๏ 9 0QFO54%# (PSJMMB *OqVY%# ॻ͖ࠐΈ εέʔϧΞ΢τੑ Մೳ Մೳ Մೳ

    ঎༻൛ͷΈ ߴՄ༻ੑ Ϋϥελػߏ༗Γ Ϋϥελػߏ༗Γ Ϋϥελػߏ༗Γ ॻ͖ࠐΈޮ཰ ϝϞϦόοϑΝ ΠϯϝϞϦ ϝϞϦόοϑΝ σʔλอଘޮ཰ ແѹॖ ѹॖ ѹॖ ૄ݁߹ੑ ີ݁߹ ີ݁߹ ີ݁߹
  10. HeteroTSDB ΞʔΩςΫνϟ 10 3.

  11. ֦ுੑͷ͋Δ࣌ܥྻDBͷઃܭ • ີ݁߹ͳDBMSͦͷ΋ͷΛ֦ு͢Δ͜ͱ͸༰қͰ͸ͳ͍ • ༻్͝ͱʹҟͳΔෳ਺ͷDBMSΛ૊Έ߹Θͤͨҟछࠞ߹DBMS ʹΑΔૄ݁߹ԽΛ໨ࢦ͢ • ΠϯσοΫεͷΑ͏ͳ௥Ճͷσʔλߏ଄ͷͨΊͷDBMSΛઐ༻ ʹ഑ஔ͢Δ 11

  12. ॻ͖ࠐΈޮ཰ͱσʔλอ࣋ޮ཰ͷཱ྆ • ߴ଎ͳΠϯϝϞϦKVSͰॻ͖ࠐΈΛड͚෇͚Δ • (1) ϝϞϦ͸σΟεΫͱൺֱ͠༰ྔ୯Ձ͕େ͖͍ • ΦϯσΟεΫKVS΁ݹ͍σʔλΛҠಈ͢ΔKVSͷࣗಈ֊૚Խ • (2)

    ΠϯϝϞϦKVSͷނো࣌ʹϝϞϦ্ͷσʔλ͕شൃ͢Δ • ϝοηʔδϒϩʔΧʔʹઌߦॻ͖ࠐΈ͓͖ͯ͠ɺσʔλফࣦ࣌ ʹϒϩʔΧʔ্ͷσʔλΛ࠶ॲཧ͠ɺΠϯϝϞϦKVS্ͷσʔ λΛ෮چͤ͞Δ 12
  13. HeteroTSDBͷϑϩʔ 13 Message Broker (1) write Client Metric Writer Metric

    Reader In-Memory KVS On—Disk KVS (2) subscribe and write (3) migration (i) query (ii) read from each kvs (iii) merge datapoints (ii)
  14. ΩʔόϦϡʔܗࣜΛલఏͱͨ࣌͠ܥྻσʔλߏ଄ 14 • (1) KVSͰ͸ൣғݕࡧ͕Ͱ͖ͳ͍࣮૷͕͋Δ • λΠϜελϯϓΛղ૾౓ͷഒ਺ʹἧ͑ͯॻ͖ࠐΈ(ΞϥΠϯϝϯτ) • (2) KVS΁ͷࢀরճ਺͕ଟ͍

    • ҰͭͷΩʔόϦϡʔϖΞʹಉҰܥྻ಺ͷෳ਺ͷσʔλ఺Λ֨ೲ • (3) KVSͷΩʔόϦϡʔϖΞαΠζͷ੍ݶΛ௒͑ͯ͠·͏ • ݻఆ௕ͷλΠϜ΢Οϯυ΢ʹΑΓܥྻΛ෼ׂͯ֨͠ೲ • (4) ॻ͖ࠐΈΤϥʔ࣌ͷ࠶ࢼߦ࣌ʹಉ͡σʔλΛॏෳอଘͯ͠͠·͏ • ࣌ࠁΛΩʔͱͨ͠ϋογϡϚοϓʹΑΓɺ΂͖౳ʹॻ͖ࠐΈ
  15. 15 (3) λΠϜ΢Οϯυ΢ (4) ϋογϡϚοϓ (1) ΞϥΠϯϝϯτ (2) ܥྻ୯ҐͷϖΞ

  16. KVSؒͷσʔλҠಈ: λΠϚʔख๏ • ΩʔόϦϡʔϖΞ୯ҐͰλΠϚʔΛઃఆ • λΠϚʔ͕0ʹͳΔͱτϦΨʔ͕ىಈ͠ϖΞ୯ҐͰσʔλҠಈ • ϖΞ୯ҐͷҠಈ͸ґଘؔ܎Λ࣋ͨͳ͍ಠཱͨ͠ॲཧͱͳΔͨΊɺ ฒߦॲཧ͕༰қ 16

    • ࣮૷Ͱ͸TTL (Time To Live)Λར༻
  17. KVSؒͷσʔλҠಈ: Χ΢ϯτख๏ • TTL͕ͳ͍KVSΛར༻͢Δ৔߹ • ܥྻ಺ͷσʔλ఺͕֓ͶҰఆִؒͰॻ͖ࠐ·ΕΔ͜ͱʹண໨ • σʔλ఺ͷॻ͖ࠐΈ࣌ʹɺλΠϜ΢Οϯυ΢಺ͷσʔλ఺͕Ұ ఆݸ਺Ҏ্Ͱ͋Ε͹σʔλΛҠಈ •

    Ҡಈʹ͸ɺλΠϜ΢Οϯυ΢಺ͷσʔλ఺ΛಡΈग़͠ɺҠಈઌ ͷKVSʹॻ͖ࠐΈɺҠಈݩͷσʔλ఺Λ࡟আ͢Δ • ్தͰॻ͖ࠐΈ͕ఀࢭͨ͠ܥྻʹ͍ͭͯ͸ɺఆظతʹશσʔλ ΛεΩϟϯ͠ɺҠಈॲཧΛ࣮ࢪ 17
  18. σʔλߏ଄ͷ֦ு • ϦΞϧλΠϜॻ͖ࠐΈ • ϝοηʔδϒϩʔΧʔͷߪಡऀΛผ్༻ҙ͠ɺ௥ՃDBMSʹॻ ͖ࠐΈ • ॻ͖ࠐ·Εͨσʔλ͕֦ு͞ΕͨDBMS্ʹଈ൓ө • όονॻ͖ࠐΈ

    • ΠϯϝϞϦKVS͔ΒΦϯσΟεΫKVS΁Ҡಈ͢Δͱ͖ʹɺෳ਺ͷ ܥྻ಺σʔλ఺Λ·ͱΊͯ௥ՃDBMSʹॻ͖ࠐΈ • ௥ՃDBMS΁ͷॻ͖ࠐΈճ਺Λ࡟ݮ 18
  19. HeteroTSDBΞʔΩςΫνϟͷ࣮૷ 19 • AWS্Ͱ࣮૷ • ҟछࠞ߹KVS؀ڥʹͯ૿Ճ͢Δӡ༻ෛ୲ ͷ࡟ݮͷͨΊαʔόϨεϓϥοτϑΥʔϜΛར༻ • ϝϞϦɺSSDɺ࣓ؾσΟεΫͷ3૚ߏ଄

  20. HeteroTSDBΞʔΩςΫνϟ·ͱΊ • ΠϯϝϞϦKVSͱΦϯσΟεΫKVSʹΑΔࣗಈ֊૚Խ • ࣌ܥྻσʔλߏ଄ • ΞϥΠϯϝϯτɺλΠϜ΢Οϯυ΢ɺϋογϡϚοϓ • KVSؒͷσʔλҠಈ •

    λΠϚʔख๏: ΩʔόϦϡʔϖΞ୯ҐͰฒߦॲཧՄೳ • Χ΢ϯτख๏: TTLΛར༻Ͱ͖ͳ͍৔߹ʹར༻ • σʔλߏ଄ͷ֦ு • ϦΞϧλΠϜॻ͖ࠐΈ • όονॻ͖ࠐΈ 20
  21. ࣮ݧͱ࣮؀ڥ΁ͷద༻ 21 4.

  22. 22 ߲໨ ࢓༷ #FODINBSL $MJFOU &$Πϯελϯε ΠϯελϯελΠϓ 04 ,FSOFM DYMBSHF

    "NB[PO-JOVY   .FTTBHF #SPLFS ,JOFTJT%BUB4USFBNT γϟʔυ਺  .FUSJD 8SJUFS -BNCEB
 ϝϞϦྔ ϥϯλΠϜ  .#  /PEFKT *O.FNPSZ ,74 &MBTUJ$BDIFGPS3FEJT ϊʔυλΠϓ γϟʔυ਺ DBDIFSMBSHF  0O%JTL,74 %ZOBNP%# ࣮ࡍͷϫʔΫϩʔυΛ໛ͨ͠ϕϯ νϚʔΧʔΛ࡞੒ • ΤʔδΣϯτ਺ • ΤʔδΣϯτͷϝτϦοΫૹ৴ ִؒ (1෼ݻఆ) • 1ճͷૹ৴͋ͨΓʹؚ·ΕΔϝτ ϦοΫ਺ (100ݻఆ) ΤʔδΣϯτ਺ 3FEJT ϊʔυ਺ %ZOBNP%# 8$6 1      1      1      1      P1~P4ͷύϥϝʔληοτΛ༻͍ͯϦιʔ εมԽΛ2࣌ؒ؍࡯͢Δ
  23. ࣮ݧ݁Ռ: ෼ؒॻ͖ࠐΈճ਺ 23 0 1 2 3 4 5 0

    20 40 60 80 100 120 datapoint writes / min (mega) minutes In-Memory KVS On-Disk KVS ΠϯϝϞϦKVS΁ͷ෼ؒॻ͖ࠐΈճ਺͸ ໿4MͰҰఆ ΦϯσΟεΫKVS΁෼ؒॻ͖ࠐΈճ਺͸ 70k͔Β170kͷؒΛਪҠ ΦϯσΟεΫKVS΁ͷ ෼ؒॻ͖ࠐΈճ਺Λ ໿1/20ʹ࡟ݮͨ͜͠ͱ͕Θ͔Δ ॻ͖ࠐΈεϧʔϓοτͷ࣌ؒมԽ
  24. 24 0 10 20 30 40 50 60 70 80

    90 100 0 20 40 60 80 100 120 0 2 4 6 8 10 12 14 16 CPU usage (%) Free memory size (GB) minutes master CPU usage (%) slave1 CPU usage (%) slave2 CPU usage (%) Free memory size (GB) 50෼Λ௒͑ͨͱ͜ΖͰ ۭ͖ϝϞϦ࢖༻ྔ͕10.5GBͰҰఆʹͳͬ ͍ͯΔͨΊσʔλҠಈͰ͖͍ͯΔͱ͍͑Δ CPUར༻཰ͱϝϞϦ࢖༻ྔ
  25. 25 0 2 4 6 8 10 12 14 16

    18 P1 P2 P3 P4 0 100 200 300 400 500 600 writes / min (mega) writes / min (kilo) parameters set In-Memory KVS [writes/min (mega)] On-Disk KVS [writes/min (kilo)] ΠϯϝϞϦKVSϊʔυ਺ͱ ΦϯσΟεΫKVSͷΩϟύγ ςΟͷ૿Ճʹରͯ͠εϧʔϓο τ͕ઢܗʹεέʔϧ͍ͯ͠Δ ͱݴ͑Δ ΩϟύγςΟͱ ॻ͖ࠐΈεϧʔϓοτ ͷؔ܎
  26. Mackerelͷ࣮؀ڥ΁ͷద༻ • 2017೥7݄͔Β2018೥8݄·Ͱͷ1೥ؒͷՔಇ࣮੷ • ಉظؒͷো֐݅਺2݅ɺނোճ਺2݅ • ো֐1: ಛఆͷΠϯϝϞϦKVSͷϊʔυʹॻ͖ࠐΈෛՙ͕ूத͠ɺϝϞ Ϧ্ݶʹୡ͠ɺOSʹڧ੍ఀࢭ͞Εɺσʔλফࣦൃੜ •

    ϝοηʔδϒϩʔΧʔ্ͷσʔλΛ࠶ॲཧ͠σʔλ෮چ • ো֐2: ಉҰͷϝτϦοΫ໊ͱλΠϜελϯϓΛ΋ͭσʔλ఺͕୹࣌ؒ ʹେྔʹॻ͖ࠐ·ΕɺΠϯϝϞϦKVSͷॻ͖ࠐΈαΠζ্ݶʹୡͨ͠ • ΠϯϝϞϦKVSʹॻ͖ࠐΉલʹॏෳΛഉআ͢Δ͜ͱͰղܾ 26
  27. Mackerelͷ࣮؀ڥ΁ͷద༻ • ނোʹ͍ͭͯ͸ɺ͍ͣΕ΋ΠϯϝϞϦKVSͷϊʔυ͕ఀࢭ͠ɺ ౰֘ϊʔυ͕Ϋϥελ͔Β֎ΕΔ·ͰͷؒʹΤϥʔ͕ൃੜͨ͠ • Lambdaؔ਺࣮ߦͷࣗಈ࠶ࢼߦʹΑΓࣗಈͰσʔλ෮چ • Ұ෦ͷϝτϦοΫͷॻ͖ࠐΈ͕਺෼஗Ԇ͢ΔʹͱͲ·ͬͨ 27

  28. ࣮ݧͱ࣮؀ڥ΁ͷద༻ͷ·ͱΊ • ॻ͖ࠐΈॲཧޮ཰ • ΦϯσΟεΫKVS΁ͷॻ͖ࠐΈճ਺Λ1/20ʹ࡟ݮͰ͖ͨ • σʔλอଘޮ཰ • ΠϯϝϞϦKVSͷϝϞϦ࢖༻ྔ͕ຬഋʹͳΔ͜ͱͳ͘ɺσʔλҠಈͰ͖ ͍ͯΔ͜ͱΛ֬ೝͰ͖ͨ

    • ॻ͖ࠐΈεέʔϧΞ΢τੑ • KVSͷΩϟύγςΟ૿Ճʹର͢Δεϧʔϓοτͷઢܗ૿ՃΛ֬ೝͰ͖ͨ • ߴՄ༻ੑͱσʔλফࣦ଱ੑ • ࣮؀ڥʹద༻͢Δ͜ͱʹΑΓ֬ೝͰ͖ͨ 28
  29. ·ͱΊ 29 5.

  30. ·ͱΊ • ੑೳͱ֦ுੑΛཱ྆͢Δ࣌ܥྻσʔλϕʔεΞʔΩςΫνϟͷ ఏҊ • AWSͷϚωʔδυαʔϏεʹΑΓҟछࠞ߹σʔλετΞΛલఏ ͱͨ͠ΞʔΩςΫνϟͷߴ͍࣮ݱੑ • Mackerelͷ࣌ܥྻσʔλϕʔεͱͯ͠1೥ͷՔಇ࣮੷ 30

  31. ࠓޙͷల๬ • ઌߦͷ࣌ܥྻσʔλϕʔεͱͷੑೳൺֱ࣮ݧ • σʔλߏ଄ͷ֦ுੑΛ׆͔ͨ͠ػೳͷ࣮૷ • σʔλ഑ஔ৘ใͷΠϯσΩγϯάʹΑΔࢀর໰͍߹ΘͤͷϨΠ ςϯγͷ࠷దԽ • ଟ࣍ݩσʔλϞσϧ΁ͷରԠ

    • KVSؒͷσʔλҠಈख๏ͷ൚༻Խ • ॲཧͱσʔλͱλΠϚʔΛҰମԽͨ͠σʔλύΠϓϥΠϯ 31