Pro Yearly is on sale from $80 to $50! »

Growing Service

124da56a613b15fa980427533e4e3839?s=47 Harukasan
September 11, 2014

Growing Service

成長するサービス
pixiv SUMMER BOOTCAMP -2014- / 2014-09-08

124da56a613b15fa980427533e4e3839?s=128

Harukasan

September 11, 2014
Tweet

Transcript

  1. ੒௕͢ΔαʔϏε ͸Δ͔͞Μ / MICHII Shunsuke 2014-09-08
 pixiv SUMMER BOOT CAMP

    -2014-
  2. これまで3つのプロダクト(広告配信、pixiv、BOOTH)の話を聞 いて、それぞれのプロダクトにどのような技術を使われている か、なぜその技術が使われているか、何を考えて設計されてい るか、そのようなことについて思いを巡らせてみたかと思いま す。どのサービスもそれぞれのバックグラウンドを持っており、 そして、現在稼働しているサービスがあります。それぞれのサー ビスで使われている技術はばらばらだし、1つ1つの技術にそ れなりに理由があったり、特になかったりします(動いているの は正義です)。みなさんもプロダクトをつくったりしたことがあ れば、特に理由もなく新しい技術を採用したりすることもあると

    思います。さて、設計の話はそろそろ飽きたと思うので、今日は 運用していく上で必要な技術の話をしようと思います。とはい え、単に運用の話をしてもおもしろくないと思うので、運用して いく上で、どのようなことを考えれば良いかについて話します。
  3. ͸͍

  4. ੒௕͢ΔαʔϏε ͸Δ͔͞Μ / MICHII Shunsuke 2014-09-08
 pixiv SUMMER BOOT CAMP

    -2014-
  5. None
  6. 2007೥ʹ͸͡·ͬͨྺ࢙͋ΔαʔϏε

  7. None
  8. ໌೔Ͱͪΐ͏Ͳ7೥* *αʔϏε։࢝೔͸2007೥9݄10 ೔

  9. ༗࢙(2009೥1݄)Ҏޙ* *svnʹ࠷ॳʹίϛοτ͞Ε͔ͯΒ

  10. 8,736,432ߦͷίʔυ͕௥Ճ͞Ε
 7,399,601ߦͷίʔυ͕࡟আ͞Εͨ ࣍ͷϫϯϥΠφʔͰܭͬͨɻؒҧͬͯͨΒ͝ΊΜɻ git log --follow --shortstat --pretty="format:" . |

    ruby -e ‘i=0;d=0;STDIN.each{|l| i+=l.match(/(\d+) i/).to_a[1].to_i; d+=l.match(/(\d+) d/).to_a[1].to_i; }; puts i,d;’
  11. pixiv ブックマーク フォロー フォロー新着 小説フォ ロ ー 新 着  お す す め

    作 品  ス マ ー ト フ ォ ン  circle.ms連携 コメント イラスト投稿 iOSアプリ コ ン テ ス ト        イ ベ ン ト                      ゲーム         作品管理  ユーザー               ガラケー  アンケート              うごイラ  タグ  ランキング 地域ランキング 過去ランキング  検索 シリーズ フィード タグ詳細 使用ツール  Androidアプリ 人気のタグ お知らせ みんなの新着  企画目録 フォロー新着  BOOTH連携 注目のタグ ૿͑ଓ͚Δػೳ
  12. ૿͑ଓ͚Δσʔλ

  13. ༷ʑͳϓϥοτϑΥʔϜ  pixiv pixiv touch iOS App. Android App. աڈʹ͸ଞʹ΋

  14. ੒௕ΛࢭΊͳ͍ͨΊʹ͸ԿΛ͢Ε͹ྑ͍͔

  15. Ή͠ΖՃ଎͍ͯ͘͠ʹ͸Ͳ͏͢Ε͹ྑ͍͔

  16. Agenda • αʔϏεͷεέʔϥϏϦςΟ • ܭଌͤΑ • pixivͷέʔεελσΟ

  17. ಺༰Λ٧ΊࠐΈ͗ͨ͢ͷͰ ͔ͳΓۦ͚଍Ͱ͢

  18. Scalability εέʔϥϏϦςΟ Photo: Container Ship https://flic.kr/p/9buvwZ

  19. — Mark D. Hill. 1990. “What is scalability?”.
 SIGARCH Comput.

    Archit. News 18, 4, 18-21.
 DOI=10.1145/121973.121975 “͜ͷ࿦จʹ͓͍ͯɺࢲ͸Scalabilityͷ༷૬ʹ͍ͭͯௐࠪͨ͠ɻ͔͠͠ͳ͕ Βɺ༗༻Ͱݫ֨ͳఆٛΛݟ͚ͭΔ͜ͱ͸ग़དྷͳ͔ͬͨɻࢲ͸γεςϜ͕ ʮ”Scalable”Ͱ͋Δʯ͜ͱ͸ɺʮ”Modern”Ͱ͋Δʯͱಉ͘͡Β͍ศརͳ ݺͼํͱͯ͠࢖ΘΕ͍ͯΔͱஅݴ͢Δɻࢲ͸ɺٕज़ίϛϡχςΟʹର͠ɺ ݫ֨ͳఆٛΛఆٛ͢Δ͔ɺ͜ͷ༻ޠΛ࢖͏ͷΛ΍ΊΔ͜ͱΛਪ঑͢Δɻ”
  20. Scalability • ֦ுੑ͕ߴ͍͜ͱΛചΓʹ͢ΔγεςϜʹ͓͍ͯ
 Կ͔ͱศརʹ࢖ΘΕ͍ͯΔ༻ޠͷ1ͭ • Load Scalability:
 ෛՙʹ͋ΘͤͯϦιʔεΛ૿΍ͨ͠ΓݮΒͨ͠ΓͰ͖Δ • ΠϯϑϥΤϯδχΞ͕εέʔϥϏϦςΟͬͯݴͬͨΒ


    ͍͍ͩͨ͜ͷҙຯ • ෛՙʹ͋ΘͤͯϦιʔεΛ؆୯ʹ௥ՃɾॖখͰ͖Δ͔ • ͓ۚΛ͔͚Ε͹Ͳ͏ʹ͔ͳΔ͔Ͳ͏͔
  21. Latency ஗Ԇ Throughput εϧʔϓοτ Photo: Julie German https://flic.kr/p/3P5yts Photo: Cyril

    Caton https://flic.kr/p/6bMwku
  22. Throughput • ୯Ґ࣌ؒ͋ͨΓʹॲཧͰ͖Δ͔ • ͲΕ͚ͩͷྔΛॲཧͰ͖Δ͔Λ೺Ѳ͢ΔͨΊͷई౓ 1 container / hour 1

    hour source destitnation
  23. Bandwidth (ଳҬ෯) 10 containers / hour 1 hour • 1ͭͷճઢ͋ͨΓͷཧ࿦্ͷ࠷େεϧʔϓοτ

  24. Increasing Throughput 1 hour • εϧʔϓοτΛ૿΍͢ʹ͸ฒྻ਺Λେ͖͘͢Δ 30 containers / hour

  25. Latency • ॲཧʹ͔͔Δ࣌ؒ • ฒྻ਺Λ૿΍ͯ͠΋஗Ԇ͸খ͘͞ͳΒͳ͍ • ஗ԆΛղܾ͢Δʹ͸ॲཧ଎౓Λ͸΍͘͢Δ͔͠ͳ͍ 1 hour 1

    minute ྫ͑͹ϩέοτΛ࢖͏
  26. Latency • ஗ԆΛখ͘͢͞Δͱεϧʔϓοτ͸վળ͢Δ • ౥ࡌͰ͖Δྔ͕ಉ͡Ͱ͋Ε͹ɺ஗Ԇ͕1/nʹͳΔͱ
 εϧʔϓοτ͸nഒ 1 hour 1 minute

    1 containers / hour 60 containers / hour
  27. Throughput / Latency • εϧʔϓοτ:
 γεςϜ͕ॲཧग़དྷΔྔΛ೺Ѳ͢ΔͨΊͷई౓ • εϧʔϓοτΛվળ͢Δʹ͸ • ฒྻ਺Λେ͖͘͢Δ

    • ஗ԆΛখ͘͢͞Δ • ϨΠςϯγ:
 ฒྻ਺Λେ͖ͯ͘͠΋஗Ԇ͸খ͘͞ͳΒͳ͍
  28. Scaling • γεςϜͷεϧʔϓοτΛߴΊΔ͜ͱ • ฒྻ਺ΛߴΊΔ • ஗ԆΛগͳ͘͢Δ ! • εϧʔϓοτΛߴΊΔͨΊʹ͸

    • νϡʔχϯά • εέʔϧΞοϓ/εέʔϧΞ΢τ
  29. Scale up / Scale out • ฒྻ਺Λ૿΍͢ʹ͸: ෳ਺ͷαʔόʹॲཧΛৼΓ෼͚Δ • ஗ԆΛখ͘͢͞Δʹ͸:

    αʔόͷεϖοΫΛ͋͛Δ Ý Ý Ý Ý Ý Ý Scale Up (Vertical Scaling) Ý Ý Scale Out (Horizontal Scaling) • CPUͷίΞ਺Λ૿΍͢ • ϝϞϦʹऩ·ΔΑ͏ʹ͢Δ • νϡʔχϯά: ॲཧྔΛݮΒ͢=࣮࣭తεέʔϧΞοϓ • ෳ਺αʔόʹ෼ࢄͰ͖ΔΑ͏ʹ͢Δ • ෼ࢄ͢Ε͹͢Δ΄Ͳεέʔϧ͠ͳ͘ͳΔ • 1୆Λഒʹ͢Δʹ͸: 1୆ඞཁ • 10୆Λഒʹ͢Δʹ͸: 10୆ඞཁ
  30. Scaling: ·ͱΊ • νϡʔχϯά͸εέʔϦϯάͷجຊ • νϡʔχϯά͸࣌ؒ΋͓ۚ΋ͦΕ΄Ͳ͔͔Βͳ͍ • ܭଌ͢Δલʹνϡʔχϯά͢Δͳ: ޙड़ •

    εέʔϧΞοϓ • ͓ۚΛ͔͚Ε͹Ͳ͏ʹ͔ͳΔΑ͏ʹ͓ͯ͘͠ • εέʔϧΞ΢τ • ෼ࢄͰ͖Δߏ੒͚ͩͭͬͯ͘͠·͑͹૿΍ͤΔ • ୆਺͕ଟ͘ͳΕ͹ଟ͘ͳΔ΄Ͳਏ͘ͳΔ
  31. ܭଌͤΑ Photo: Docklandsboy https://flic.kr/p/5B4TaF

  32. — Rob Pike. 1989. “Notes on Programming in C”. “Rule

    1. ϓϩάϥϜ͕Ͳ͜Ͱ࣌ؒΛফඅ͢Δ͜ͱʹͳΔ͔஌Δ͜ͱ͸ग़དྷͳ͍ɻ ϘτϧωοΫ͸ࢥ͍͕͚ͳ͍৔ॴͰൃੜ͢Δɺ͕ͨͬͯ͠Ͳ͕͜ϘτϧωοΫ ͔ূ໌͢Δ·ͰɺਪଌΛߦͬͨΓεϐʔυϋοΫΛߦͬͯ͸͍͚ͳ͍ɻ”
  33. — Rob Pike. 1989. “Notes on Programming in C”. “Rule

    2. ܭଌͤΑɻܭଌ͢Δ·Ͱ଎౓ͷͨΊͷνϡʔχϯάΛͯ͠͸ͳΒͳ͍ɺ ίʔυͷҰ෦͕࢒Γͷ෦෼Λѹ౗͠ͳ͍ͷͰ͋Ε͹ͳ͓͞ΒͰ͋Δɻ”
  34. ܭଌͤΑ • ϦιʔεΛ೺Ѳ͢Δ • άϥϑΛΈΔ • ϕϯνϚʔΫ

  35. Ϧιʔε • ݱ୅ͷPCαʔόʹ͓͚ΔओཁͳϦιʔε(ܭࢉࢿݯ) • CPU • Memory • Disk I/O

    • Network
  36. CPU • PCͰ͸ܭࢉҎ֎ʹશମͷ੍ޚ΋CPU͕ߦ͍ͬͯΔ • ྫ͑͹IOΛ଴͍ͬͯΔؒ͸ଞͷܭࢉ͕ग़དྷͳ͍ • ͲΕ͚ͩCPUΛ࢖༻͔ͨ͠Λܭࢉ࣌ؒͰࣔ͢ • 1࣌ؒͰ1࣌ؒ෼ܭࢉ࣌ؒΛ࢖͏ =

    ࢖༻཰100% ! • System: Kernel͕࢖༻ͨ͠ܭࢉ࣌ؒ • User: ී௨ͷϓϩάϥϜ͕࢖༻ͨ͠ܭࢉ࣌ؒ • IO wait: IOͷೖग़ྗ଴ͪΛߦͬͨ࣌ؒ • IRQ / Soft IRQ: ωοτϫʔΫ౳ׂΓࠐΈΛॲཧͨ࣌ؒ͠
  37. ϝϞϦ • PCͷओهԱ૷ஔ • ΊͬͪΌ͸΍͍ • ϨΠςϯγ:10 ns (SSDͩͱҰ൪଎ͯ͘0.1ms͘Β͍) •

    ΞϓϦέʔγϣϯ࢖༻ྖҬ • Ωϟογϡ(ϖʔδΩϟογϡ) • ϖʔδΩϟογϡʹࡌ͍ͬͯΕ͹σΟεΫ͔Β
 ಡΈࠐ·ͳͯ͘΋͍͍ʹߴ଎
  38. σΟεΫIO • PCͷิॿهԱ૷ஔ • ͘͢͝஗͍ͷͰσΟεΫIO͸جຊతʹ0ʹ͢Δ • HDD: ΊͬͪΌ஗͍͚Ͳେ༰ྔͰ҆Ձ • SSD:

    ͸΍͍͚Ͳ௿༰ྔͰߴՁ(࠷ۙ͸࠷େͰ1TBҐ) • SATA͸ͲΜͳʹ͕Μ͹ͬͯ΋࠷େεϧʔϓοτ6Gb/s • ͞Βʹߴ଎ʹ͢Δʹ͸ • RAID 0 (ετϥΠϐϯά) • PCI-E SSD / NVMe (8-32Gb/s)
  39. ωοτϫʔΫ • ଳҬ(෮श: ཧ࿦্ͷ࠷େεϧʔϓοτ) • 1Gbps (࣮ࡍ͸950MbpsҐ) • 10Gbps •

    ϨΠςϯγ: ωοτϫʔΫ͸஍ཧతϨΠςϯγ͕େ͖͍ • ౦ژ-χϡʔϤʔΫ: 150ms • ϙʔτ਺: TCP/IPͰ͸࠷େ65,535ݸ • TCPͰ͸ϙʔτΛόΠϯυ͠ͳ͍ͱૹड৴͕Ͱ͖ͳ͍
  40. Ϧιʔεঢ়گΛ೺Ѳ͢Δ • Ͳͷϋʔυ΢ΣΞϦιʔε͕ϘτϧωοΫ͔೺Ѳ͢Δ • top — Ͳͷϓϩηε͕CPUΛ࢖༻͍ͯ͠Δ͔ • dstat —

    ϦιʔεͷܦաΛ೺Ѳ • netstat — LISTEN͍ͯ͠Δ͔ɺ࢖༻͍ͯ͠Δϙʔτ਺
  41. top

  42. htop

  43. dstat

  44. άϥϑΛݟΔ • ৗ೔ࠒ͔ΒϦιʔεঢ়گΛՄࢹԽ͠೺Ѳ͢Δ • Munin: ֤αʔόͷϦιʔεάϥϑΛऩूͯ͘͠ΕΔ

  45. άϥϑͷݟํ • ظؒ͝ͱʹݟΔ: ೔/ि/೥ • ௕ظతͳάϥϑ͚ͩͩͱ୹ظతͳো֐ʹؾ͚ͮͳ͍ • ௕ظάϥϑ͕ͳ͍ͱΏͬ͘Γͨ͠มԽʹؾ͚ͮͳ͍ • ͨ͘͞ΜͷछྨͷάϥϑΛͱΔ

    • ஋ʹΑͬͯΘ͔Δ͜ͱ͕ҧ͏ • ·ͱΊΔͱখ͍͞εέʔϧͷ͜ͱ͸Θ͔Βͳ͘ͳΔ
  46. Կ͕ϘτϧωοΫ͔೺Ѳͨ͠Β • ֤ϓϩηεʹ͍ͭͯৄ͍͠ϕϯνϚʔΫΛऔΔ • ΞϓϦέʔγϣϯ: ϓϩϑΝΠϦϯά • σʔλϕʔε: εϩʔΫΤϦϩάɺEXPLAIN •

    ετϨʔδ: Ωϟογϡώοτɾόϥϯγϯά
  47. ͜͜·Ͱͷ·ͱΊ

  48. ܭଌͤΑ • Ϧιʔε͸༗ݶͰ͋Δ • ͦΕͧΕͷϦιʔεͷಛ௃Λ೺Ѳ͓ͯ͘͠ • ͲͷϦιʔε͕ϘτϧωοΫ͔Λ؍ଌ͢Δ • ϘτϧωοΫ͕Ͳ͔͜Θ͔ͬͨΒ •

    ৄ͍͠ϓϩϑΝΠϦϯάΛͱΔ
  49. pixivͷߏ੒ Application    Database Cache Image Store Image

    Cluster read/write Batch  Search
  50. έʔεελσΟ • ৄ͍͠࿩͸લʑճͷࢿྉʹ͍͍ͩͨॻ͍ͯ͋Δ • ΋͏͢͜͠جຊతͳ࿩Λ͠·͢ ! • pixivΛࢧ͑Δٕज़2014
 https://speakerdeck.com/edvakf/pixivwozhi-eruji-shu-2014

  51. Database 

  52. Database • pixivʹ͓͚Δσʔλϕʔεͷߏ੒ • σʔλϕʔεͷεϧʔϓοτΛ͋͛Δʹ͸ • σʔλϕʔεͷ஗ԆΛগͳ͘͢Δʹ͸

  53. pixivʹ͓͚ΔҰൠతͳߏ੒    Master Slave Replication PHP Load Balancer

      Master ߋ৽ ࢀর
  54. Load Balancer • ॲཧΛෳ਺ͷαʔόʹ෼ࢄͤ͞ΔͨΊͷϛυϧ΢ΣΞ • ύέοτΛෳ਺ͷαʔόʹৼΓ෼͚Δ͜ͱͰ
 ॲཧΛ෼ࢄͤ͞Δ • pixivͰ͸DBͷෛՙ෼ࢄʹLVSΛ࢖͍ͬͯΔ PHP

     
  55. ิ଍εϥΠυ ϩʔυόϥϯαͷํࣜ • L4 Load Balancerʹ͸ओʹNATํࣜͱDRSํ͕ࣜ͋Δ • pixiv͸DSRํࣜΛ࢖͍ͬͯΔ • NATํࣜ:

    • ύέοτ͕͢΂ͯϩʔυόϥϯαΛܦ༝͢Δ • DSRํࣜ: • ෮࿏͕ϩʔυόϥϯαΛܦ༝͠ͳ͍ • Ϩεϙϯεͷσʔλྔ͕ଟ͍ͷͰ
 ϩʔυόϥϯαͷτϥϑΟοΫΛେ෯ʹݮΒͤΔ
  56. ิ଍εϥΠυ NATํࣜ  Database  Database Application 192.168.0.2/A:B 宛先: 192.168.0.11

    (C:E) 送信元: 192.168.0.2 (A:B) 宛先: 192.168.0.2 (C:E) 送信元: 192.168.0.53 (D:A) ⁞   ⁠ ⁡ 宛先: 192.168.0.53 (D:A) 送信元: 192.168.0.2 (C:E) 192.168.0.53/D:A 宛先: 192.168.0.2 (A:B) 送信元: 192.168.0.11 (C:E) Load Balancer 192.168.0.11/C:E DNAT • Load Balancer͕ૹ৴ઌ(෮࿏Ͱ͸ૹ৴ݩ)Λॻ͖׵͑Δ • ֤σʔλϕʔε͸σϑΥϧτήʔτ΢ΣΠΛLBʹ͓ͯ͘͠
  57. ิ଍εϥΠυ • Load Balancer͸ૹ৴ઌΞυϨεΛॻ͖׵͑ͳ͍ • DB͔ΒͷԠ౴͕௚઀ΞϓϦέʔγϣϯαʔόʹฦ͞ΕΔ DSR (Direct Server Return)

    Load Balancer 192.168.0.11/C:E  Database  Database Application 192.168.0.2/A:B 宛先: 192.168.0.11 (C:E) 送信元: 192.168.0.2 (A:B) 宛先: 192.168.0.2 (A:B) 送信元: 192.168.0.11 (D:A) ⁞   宛先: 192.168.0.11 (D:A) 送信元: 192.168.0.2 (C:E) 192.168.0.53/D:A DNAT ⁠ -A PREROUTING -d 192.168.0.11 -p tcp -j REDIRECT
  58. ิ଍εϥΠυ DSRͷར఺ͱܽ఺ • ར఺ • ϩʔυόϥϯαΛܦ༝͢Δσʔλྔ͕গͳ͘ͳΔͷͰɺ ϩʔυόϥϯαͷτϥϑΟοΫΛ཈͑Δ͜ͱ͕ग़དྷΔ • ܽ఺ •

    ϩʔυόϥϯαͱDBΛಉ͡ωοτϫʔΫʹ഑ஔ͢Δ
 ඞཁ͕͋Δ • ωοτϫʔΫΛ௒͑Δ͜ͱ͕ग़དྷΔٕज़΋͋Δ:L3DSR
 (pixivͰ͸࢖͍ͬͯΔͷ͸௒͑ΒΕͳ͍L2DSR)
  59. • ࢀরͱߋ৽ॲཧΛ෼ׂ͢Δߏ੒ • ࢀরͷεϧʔϓοτΛ૿Ճͤ͞Δ͜ͱ͕Ͱ͖Δ • WebαʔϏεͰ͸ߋ৽ॲཧʹൺ΂ࢀরස౓͕ѹ౗తʹଟ͍ ࢀর෼ׂ   

     Slave App.  Master ϨϓϦέʔγϣϯ ߋ৽ΫΤϦ Load Balancer ෼ࢄ ࢀরΫΤϦ(SELECT)
  60. • ࢀরͱߋ৽ॲཧΛ෼ׂ͢Δߏ੒ • ࢀরͷεϧʔϓοτΛ૿Ճͤ͞Δ͜ͱ͕Ͱ͖Δ • WebαʔϏεͰ͸ߋ৽ॲཧʹൺ΂ࢀরස౓͕ѹ౗తʹଟ͍ ࢀর෼ׂ   

     Slave App.  Master ϨϓϦέʔγϣϯ ߋ৽ΫΤϦ Load Balancer ෼ࢄ ࢀরΫΤϦ(SELECT)
  61. • ࢀরͱߋ৽ॲཧΛ෼ׂ͢Δߏ੒ • ࢀরͷεϧʔϓοτΛ૿Ճͤ͞Δ͜ͱ͕Ͱ͖Δ • WebαʔϏεͰ͸ߋ৽ॲཧʹൺ΂ࢀরස౓͕ѹ౗తʹଟ͍ ࢀর෼ׂ   

     Slave App.  Master ϨϓϦέʔγϣϯ ߋ৽ΫΤϦ Load Balancer ෼ࢄ ࢀরΫΤϦ
  62. • εϧʔϓοτ͕૿Ճ͢Δͷ͸ࢀরΫΤϦ͚ͩ • ߋ৽ΫΤϦ͸֤SlaveͰ࣮ߦ͞ΕΔ • SELECTͯ͠UPDATEͷΑ͏ͳॲཧͩͱෆ੔߹͕ى͖Δ • ΞϓϦέʔγϣϯͰߋ৽ΫΤϦͱࢀরΫΤϦΛৼΓ෼͚ ͳ͍ͱ͍͚ͳ͍ͷͰίʔυ͕ෳࡶʹͳΔ ࢀর෼ׂͷऑ఺

  63. ิ଍εϥΠυ WebΞϓϦέʔγϣϯͷಛ௃ • ߋ৽ॲཧʹൺ΂ࢀরස౓͕ѹ౗తʹଟ͍ • 1೔͋ͨΓͷ࡞඼౤ߘ: 20,000 • 1೔͋ͨΓͷӾཡճ਺: 100,000,000

    • େن໛WebΞϓϦέʔγϣϯͰ͸ࢀর෼ׂ͕༗ޮͳ৔߹͕ଟ͍ クエリ 頻度 SELECT 多い INSERT 少ない UPDATE 少ない DELETE 非常に少ない
  64. গ͠໭ͬͯ

  65. pixivʹ͓͚ΔҰൠతͳߏ੒    Master Slave Replication PHP Load Balancer

      Master ߋ৽ ࢀর
  66. pixivͷσʔλϕʔε • ઌिͷߨٛͰ͋ͬͨͱ͓Γͨ͘͞Μͷछྨ͕͋Δ • ΠϥετɺϢʔβʔ৘ใ • খઆ • ධՁཤྺɺաڈϥϯΩϯά •

    ϒοΫϚʔΫ • ϒοΫϚʔΫ౷ܭ • Ϣʔβʔ޲͚ΞΫηεղੳ༻Ӿཡཤྺ …
  67. ͳͥผΕ͍ͯΔͷ͔ • ͢΂ͯͷσʔλΛ1୆ͷαʔόʹஔ͍͓ͯ͘ͷ͸೉͘͠ ͳ͍ͬͯ͘ • ςʔϒϧʹΑͬͯσʔλྔʹ͕ࠩ͋Δ • ΞΫηεύλʔϯ΋ҧ͏ • Πϥετ৘ใ:

    ࢀর͕ଟ͍ • Ӿཡཤྺ: ௥ه͔͠ͳ͍ • ϒοΫϚʔΫ: σʔλྔ͕ଟ͍
  68. νϡʔχϯάͷҧ͍ イラスト・ユーザ情報 ブックマーク σʔλྔ 少ない 多い ࢀরස౓ 多い 比較的少ない νϡʔχϯά

    Slave͕ଟ͍
 ϝϞϦ͸গͳΊ Slave͸গͳ͍
 ϝϞϦ౥ࡌྔ͕ଟ͍ ίετ ୆਺͸ଟ͍͚Ͳ1୆1୆͸ ௿εϖοΫͰ௿ίετ ୆਺͸গͳ͍͚Ͳ
 1୆͋ͨΓͷ஋ஈ͸ߴ͍           
  69. ิ଍εϥΠυ σʔλϕʔεͷνϡʔχϯά • σʔλྔ౳ͷੑ࣭ʹΑͬͯద੾ͳνϡʔχϯά͸ҟͳΔ • σʔλɺΠϯσοΫε͕ϝϞϦʹऩ·Δ͔ • ࢀর͞ΕΔσʔλ͸ग़དྷΔ͚ͩϝϞϦʹࡌͤΔ • ࢀর͕ͳ͚Ε͹ϝϞϦʹऩ·Δඞཁ͸ͳ͍

    • MyISAMɺInnoDBͷͲͪΒ͔ • σΟεΫ༰ྔ͸଍ΓΔ͔ • Slaveͷ୆਺͸Կ୆ʹ͢Δ͔ • શͯಉ͡νϡʔχϯάʹ͢Δͷ͸೉͍͠
  70. 1ͭͷDBʹશͯࡌͤͨ৔߹ • ੑ࣭͕ҟͳΔ͢΂ͯͷςʔϒϧʹ͋ΘͤͯDBΛ
 νϡʔχϯά͢Δඞཁ͕͋Δ • ڊେͳαʔόΛ༻ҙ͢Δඞཁ͕͋Δ イラスト・ユーザ ブックマーク イラスト・ユーザ
 ブックマーク

    σʔλྔ 少ない 多い 多い ࢀরස౓ 多い 少ない 多い
  71. 1ͭͷDBʹશͯࡌͤͨ৔߹ • TBΫϥεͷϝϞϦΛ౥ࡌͰ͖Δαʔό΋͋Δ͜ͱ͸͋Δ • ͦ͏͍͏ͷΛߟ͑ͯ΋ྑ͍͔΋ http://www.supermicro.com/newsroom/pressreleases/2014/press140218_4U_4-Way.cfm

  72. σʔλϕʔεͷνϡʔχϯά • εέʔϧΞοϓͰͲ͏ʹ͔ͯ͠΋͍͍ • ৽͍͠΋ͷΛௐୡ͢Δͷʹ΋͕͔͔࣌ؒΔ • ٕज़ݕূɺݟੵ΋Γɺൃ஫……࠷௿Ͱ΋਺िؒ • ࠓճ͸ϋʔυ΢ΣΞͷεϖοΫΞοϓͰ͠ͷ͚͛ͨͲ ࣍ճ΋ߴεϖοΫ͕͋Δ͔Θ͔Βͳ͍

    • ಉ͡εϖοΫͷαʔόΛฒ΂͍͚ͯͩ͘Ͱྑ͍ํָ͕
  73. ਨ௚෼ׂͱਫฏ෼ׂ • ਨ௚෼ׂ:ྻຖʹ(·ͨ͸ςʔϒϧ୯ҐͰ)෼ׂ • ਫฏ෼ׂ:ߦຖʹ෼ׂ イラスト情報 ユーザー情報 ID イラストタイトル 画像URL

    ユーザーID ニックネーム 1 2000೥ 20 10 അࠎ : 2000೥ 21 10 അࠎ 1000000 2000೥ 22 10 അࠎ 1000001 Ͷ͜ΈΈΐΜ 1819357 11318 $ : ̏ඵؒݟͭΊͯ 2901760 18484 Suzumemiku 10000000 ͸ͳ·Δ 7768620 164813 ੺ΓΜ͝ 20000001 present 23291240 196214 ͘͞ : νϟνϟ 25628357 3867630 ϨʔΠν 30000000 ࣣ༦ 28211016 2546651 ͸͠Ό ブックマーク情報 ユーザーID イラストID    ਫฏ෼ׂ ਨ௚෼ׂ   
  74. ਨ௚෼ׂ • લʹઆ໌ͨ͠ͱ͓ΓpixivͰ͸ਨ௚෼ׂ͕ଟ༻͞Ε͍ͯΔ • ৽͘͠ػೳΛ௥Ճ͢Δͱ͖ʹ௥Ճ͠΍͍͔͢Β
 ਨ௚෼ׂ͞Εͨঢ়ଶͰ࢝·Δ͜ͱ΋ଟ͍ • ࠔΔ͜ͱ΋ଟ͍(ઌिͷεϥΠυࢀর) • ݁Ռॲཧ͕ෳࡶʹͳͬͯίʔυ͕มߋग़དྷͳ͘ͳΓ


    εέʔϥϏϦςΟ͕௿Լ͢Δ
  75. ਫฏ෼ׂ͠ͳ͍ • pixivͰ͸ਫฏ෼ׂʹΑΔαʔόʔ෼ࢄΛߦ͍ͬͯͳ͍ • ೔෇ʹΑΔύʔςΟγϣχϯά͚ͩ(෼ࢄ໨త͡Όͳ͍) • ͋·ΓʹෳࡶʹͳΔͷͰߟ͑ͨ͘ͳ͍ • Ωϟογϡ༻్Ͱ͋Ε͹ྑ͍͔΋ •

    ιʔγϟϧήʔϜք۾Ͱ͸Α͘࢖ΘΕͯΔͬΆ͍
  76. εϧʔϓοτΛ͋͛Δʹ͸ • ࢀর෼ׂʹΑΓࢀরεϧʔϓοτΛεέʔϧΞ΢τ • ద੾ͳཻ౓ͰσʔλϕʔεΛ෼ׂ͢Δ • ෼ׂͤͣʹεέʔϧΞοϓ͢Δ͜ͱ΋ߟ͑Δ • ඞཁҎ্ʹ෼ׂ͠ͳ͍ •

    ॲཧ͕ෳࡶʹͳΔͱαʔϏεશମͱͯ͠ΈΔͱ
 εέʔϥϏϦςΟ͕௿Լ͍ͯ͠Δ͜ͱ΋͋ΓಘΔ
  77. ஗ԆΛখ͘͢͞Δʹ͸ • εέʔϧΞοϓʹ͸ݶք͕͋Δ • CPUͷप೾਺͸ߴࢭ·Γ(FPGAͱ͔೉ͦ͠͏) • ϝϞϦͷΞΫηε଎౓Λ௒͑Δ͜ͱ͸೉͍͠ • ͨ͘͞ΜͷσʔλΛಡΈࠐΊ͹(ॲཧ͢Ε͹)
 ͦΕ͚͕͔͔ͩ࣌ؒΔ

    • ஗ԆΛখ͘͢͞Δʹ͸ॲཧ͢ΔσʔλྔΛগͳ͘͢Δ
  78. ΠϯσοΫεΛ࢖͏ • ୳ࡧ͢ΔσʔλྔΛগͳ͘͢Δ • ΠϯσοΫε͕ͳ͍৔߹: ઌ಄͔Βॱʹ୳ࡧ ! ! ! •

    ΠϯσοΫε͕͋Δ৔߹: B+πϦʔͷ୳ࡧͷΈ ID title 20 2000೥ 21 2000೥ 22 2000೥ : : 20 21 22 … …
  79. ΠϯσοΫε͕࢖ΘΕ͍ͯΔ͔ௐ΂Δ • EXPLAINΛ࣮ߦ͢Δ εϥΠυ࡞Γ๨Εͨ

  80. ύʔςΟγϣχϯάΛ࢖͏ ID title 20 2000೥ 21 2000೥ 22 2000೥ :

    : • σʔλ͕֨ೲ͞Ε͍ͯΔςʔϒϧ͚ͩΛ୳ࡧ͢Ε͹ྑ͍ • 10,000݅ʹ෼ׂͨ͠Βઌ಄୳ࡧͯ͠΋࠷େ10,000݅ ID title 10000 10001 10002 : : ID͕֨ೲ͞Ε͍ͯΔ
 ςʔϒϧ͚ͩ୳ࡧ
  81. ͜͜·Ͱͷ·ͱΊ

  82. Database • σʔλϕʔεͷεϧʔϓοτΛ͋͛Δʹ͸ • ࢀর෼ׂʹΑΓࢀরεϧʔϓοτΛεέʔϧΞ΢τ • ద੾ͳཻ౓ͰσʔλϕʔεΛ෼ׂ͢Δ • σʔλϕʔεͷ஗ԆΛগͳ͘͢Δʹ͸ •

    ୳ࡧ͢ΔσʔλྔΛগͳ͘͢Δ: ΠϯσοΫεΛ࢖͏ • ୳ࡧ͢Δσʔλྔ͕গͳͯ͘ࡁΉΑ͏ʹͪΌΜͱ
 ߟ͑ͯઃܭ͢Δ
  83. Contents Delivery

  84. Contents Delivery • pixivͷը૾഑৴Ϋϥελ • ը૾഑৴ͷεϧʔϓοτΛ͋͛Δʹ͸ • ը૾഑৴ͷ஗ԆΛগͳ͘͢Δʹ͸

  85. pixivͷը૾഑৴ • pixivͷϝΠϯίϯςϯπ͸ը૾ • ϦΫΤετͷେ൒͸ը૾ϑΝΠϧ • ը૾͕දࣔ͞Εͳ͍ͱϢʔβʔΤΫεϖϦΤϯε͕
 େ͖͘௿Լ͢Δ • ߴ଎ʹ҆ఆͯ͠େྔͷը૾Λ഑৴͢Δ࢓૊Έ͕ඞཁ

    Images HTML Static
  86. pixivͷը૾഑৴ • େྔͷը૾ϑΝΠϧ • ΦϦδφϧը૾: 40TB • αϜωΠϧͷछྨ: 20छྨҎ্ •

    1ຕ͝ͱͷαΠζ • ฏۉ: 60KB (95ˋλΠϧ: 300KB) • ࠷େ: 15MB
  87. pixivͷը૾഑৴ • େྔͷϦΫΤετ • ϦΫΤετ਺: ͍͍ͩͨ15,000 req/s • సૹྔ: ࠷େ

    14Gbps
  88. ը૾഑৴Ϋϥελ • pixivͰ͸CDNΛ࢖͍ͬͯͳ͍ • ୅ΘΓʹಠࣗͷCDNͷΑ͏ͳ࢓૊ΈΛ͍࣋ͬͯΔ • ճઢඅ༻͸Ϋϥ΢υΑΓΦϯϓϨͷํ͕҆Ձ • Ωϟογϡώοτ཰95% •

    ϩϯάςʔϧͳͷͰେ༰ྔͷΩϟογϡ͕ඞཁ • ఘΊ͍ͯΔ͜ͱ • ஍ཧతͳεέʔϥϏϦςΟ
  89. ը૾഑৴Ϋϥελ 6GbpsΛ͞͹͘ΦϨΦϨCDNߏஙज़ http://www.slideshare.net/semind/20101220-pixiv-techmeeting-6267332

  90. ը૾഑৴Ϋϥελ • ωοτϫʔΫ • 1GbpsͷճઢͰ͸શવ଍Γͳ͍ • ͨ͘͞ΜଋͶΔͱภΓ͕ͰͨΓ؅ཧ͕໘౗ • 10GbpsͷճઢΛ4ຊଋͶͯ࢖͍ͬͯΔ •

    αʔό • ݱࡏ͸40୆͘Β͍
  91. ը૾഑৴Ϋϥελ nginx Front Cache Consistent Hashing i1.pixiv.net i2.pixiv.net nginx Front

    Cache nginx Front Cache nginx Front Cache TrafficServer Cache TrafficServer Cache TrafficServer Cache TrafficServer Cache nginx Dispatch nginx Dispatch nginx Dispatch nginx Dispatch Apache Origin Apache Thumb. Gen. 1࣍Ωϟογϡ 2࣍Ωϟογϡ 64GB Memory MEM SSD 256x3 GB SSD i2.pixiv.net i1.pixiv.net
  92. Consistent Hashing • URLΛΩʔʹͯ͠Hashing͢Δ • ΩϟογϡΛෳ਺୆ʹεέʔϧΞ΢τͰ͖Δ • શτϥϑΟοΫͷ95%ΛΩϟογϡͰԠ౴Ͱ͖Δ TrafficServer Cache

    TrafficServer Cache TrafficServer Cache Hash table Hash table Hash table
  93. • 1ϥοΫʹ͸࠷େͰ΋49୆ • εΠονؒͷτϥϑΟοΫ͕٧·Δ(ࠓ͸10G͔ͩΒେৎ෉ʁ) • 1ஈ໨ͷΩϟογϡͰશτϥϑΟοΫͷ50%Λฦ͢ 2ஈΩϟογϡͷཧ༝ (1) switch L3

    Switch 49U 1Gbps 1Gbps switch
  94. • ϦΫΤετ͕ಛఆΩϟογϡαʔόʹภΔ • ਓؾͷը૾͕ϋογϯά͞ΕΔαʔό͚ͩߴෛՙ • ϝϞϦΩϟογϡͰਓؾ͕͋Δը૾ΛΩϟογϡ 2ஈΩϟογϡͷཧ༝ (2) Server A

    Server B Server C Server A Server B Server C Cache
  95. ͜͜·Ͱͷ·ͱΊ

  96. Contents Delivery • ը૾഑৴ͷεϧʔϓοτΛ͋͛Δʹ͸ • εέʔϧ͢ΔΩϟογϡΫϥελΛઃܭ͢Δ • Ωϟογϡ༰ྔͱτϥϑΟοΫʹؾΛ͚ͭΔ ! •

    ϨΠςϯγ • Ϥʔϩούʹ೔ຊ͔Βʹߴ଎ʹసૹ͢Δͷ͸ແཧ • ෦෼తʹCDNΛݕূ͍ͯ͠Δ
  97. ϩάΛ׆༻͢Δ

  98. ϩάΛ׆༻͢Δ • ϩάσʔλ͸ଟ͚Ε͹ଟ͍ํ͕ྑ͍ Application Load Balancer Database ΞΫηεϩά Πϕϯτϩά εϩʔΫΤϦϩά

     ੜσʔλ  Τϥʔϩά ΞΫηεϩά • ϦΫΤετͨ͠URL • ૹ৴ݩIPΞυϨεɺUA • ϨεϙϯελΠϜ • ϦΫΤετॲཧ࣌ؒ ! Πϕϯτϩά • Ϣʔβ͕ߦͬͨΠϕϯτͷৄࡉ৘ใ • POSTϦΫΤετͷத਎͸ΞΫηεϩάʹ͸ؚ·Εͳ͍
  99. άϩʔεͷͨΊʹ • ΞΫςΟϒϢʔβʔͷಈ޲Λௐࠪ͢Δ • ֤ػೳ͕ͲΕ͚ͩ࢖ΘΕ͍ͯΔ͔ௐࠪ͢Δ • ػೳվमʹΑͬͯͲͷΑ͏ͳมԽ͕ى͔ͬͨ͜ௐ΂Δ

  100. ։ൃऀͷͨΊʹ • ػೳվमʹΑͬͯͲͷΑ͏ͳมԽ͕ى͔ͬͨ͜ௐ΂Δ • ຊ൪؀ڥͰى͍ͬͯ͜ΔΤϥʔΛ೺Ѳ͢Δ • ຊ൪؀ڥͰ஗ԆͷݪҼʹͳ͍ͬͯΔ΋ͷΛಛఆ͢Δ

  101. ϩάܗࣜΛબͿ • ςΩετܗࣜ • ίϚϯυϥΠϯͰૢ࡞͠΍͍͢ • ߦϕʔεͰ͋Δ • awk/cut΍ϫϯϥΠφʔͰ੔ܗ͠΍͍͢ •

    σʔλྔ͕େ͖͘ͳΒͳ͍
  102. pixivͰ࢖͍ͬͯΔϩάܗࣜ • TSV: λϒ۠੾Γ • JSON: վߦ෇͖JSON • ݸਓతʹ͸ॱ൪ΛΑ͘๨ΕΔͷͰLTSV͕޷͖

  103. • Ұ୴ϑΝΠϧʹॻ͖ग़ͯͦ͠ΕΛผϓϩηε͕ಡΈࠐΉ • ϩάͷ෮چɺઃఆมߋ͕͠΍͍͢ • ग़ྗઌΛ૿΍ͨ͠ͱ͖աڈͷϩάΛΠϯϙʔτͰ͖Δ FluentdʹΑΔϩάసૹ Fluentd Files Application

    Load Balancer Database ΞΫηεϩά Πϕϯτϩά εϩʔΫΤϦϩά  ੜσʔλ  Τϥʔϩά BigQuery ! Elasticsearch ! MongoDB Fluentd
  104. Google BigQuery • Google͕ఏڙ͍ͯ͠ΔղੳϓϥοτϑΥʔϜ • SQLͰ਺ԯ݅ͷղੳ͕े਺ඵͰͰ͖Δ • ਺ઍ୆ͷαʔόʹ෼ࢄ͞Ε਺ͷ๫ྗʹΑͬͯܭࢉ͞ΕΔ • Google

    Analytics Premiumʹೖ͍ͬͯΔͱ
 Google AnalyticsͷੜϩάΛղੳग़དྷΔ
  105. Kibana

  106. Kibana • Elasticsearchʹ֨ೲͨ͠σʔλΛղੳ͢Δπʔϧ • ΫϥΠΞϯταΠυͷJavaScript͚ͩͰಈ࡞͢Δ • ࠇ͍ը໘͕ਓؾ͚ͩͲpixivͰ͸ന͕ਓؾ  elasticsearch EFK

    Stack REST API Output
  107. • ͢΂ͯͷΤϥʔΛ1෼͝ͱʹ·ͱΊͯ௨஌ • େྔͷΤϥʔΛ௨஌͢Δνϟϯωϧ΋͋Δ Idobataʹ௨஌

  108. ՄࢹԽΛߦ͏ʹ͸ • ·ͣ؆୯ʹՄࢹԽͰ͖Δͱ͍͏ࣄ࣮Λͭ͘Δ • ը໘ΛݟΔจԽΛࠜ෇͔ͤΔ • ՄࢹԽ͢ΔจԽ͕ҰൠతʹͳΕ͹ෆຬ͕ग़ͯ͘Δ • ͋·Γίετ͸͔͚ͳ͍ •

    ໨తΛܾఆ͢Δલʹಋೖ͢Δඞཁ͕͋Δ • ·ͣ͸ࣾ಺ίετΛ࢖Θͣʹ֎෦ͷϦιʔεΛ࢖͏
  109. ͜͜·Ͱͷ·ͱΊ

  110. ϩάΛ׆༻͢Δ • ϩάΛՄࢹԽ͢ΔจԽΛࠜ෇͔ͤΔ • ՄࢹԽ͢ΔจԽ͕͋Ε͹ϩάΛͪΌΜͱग़ྗͯ͘͠ΕΔ Α͏ʹͳΔ͸ͣ

  111. ·ͱΊ

  112. これまで3つのプロダクト(広告配信、pixiv、BOOTH)の話を聞 いて、それぞれのプロダクトにどのような技術を使われている か、なぜその技術が使われているか、何を考えて設計されてい るか、そのようなことについて思いを巡らせてみたかと思います。 どのサービスもそれぞれのバックグラウンドを持っており、そし て、現在稼働しているサービスがあります。それぞれのサービス で使われている技術はばらばらだし、1つ1つの技術にそれなり に理由があったり、特になかったりします(動いているのは正義 です)。みなさんもプロダクトをつくったりしたことがあれば、特 に理由もなく新しい技術を採用したりすることもあると思います。

    さて、設計の話はそろそろ飽きたと思うので、今日は運用してい く上で必要な技術の話をしました。運用していく上で、どのよう なことを考えれば良いかについて話しました。運用していく上で どのようなことを考えれば良いか、その一助になれば幸いです。
  113. ·ͱΊ • ਺ࣈΛܭଌ͢Δ׳शΛ෇͚Δ • େن໛αʔϏεͰ͸Ϧιʔε͋ͨΓͷεϧʔϓοτ͕
 ॏཁʹͳΔ • ࢥ͍ࠐΈͰߦಈͤͣʹ͔ͳΒͣܭଌͯ͠࠷దԽ͢Δ • ࢓ࣄͷਐΊํ΋ಉ͡