Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

͸͍

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

2007೥ʹ͸͡·ͬͨྺ࢙͋ΔαʔϏε

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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;’

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

૿͑ଓ͚Δσʔλ

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

— Mark D. Hill. 1990. “What is scalability?”.
 SIGARCH Comput. Archit. News 18, 4, 18-21.
 DOI=10.1145/121973.121975 “͜ͷ࿦จʹ͓͍ͯɺࢲ͸Scalabilityͷ༷૬ʹ͍ͭͯௐࠪͨ͠ɻ͔͠͠ͳ͕ Βɺ༗༻Ͱݫ֨ͳఆٛΛݟ͚ͭΔ͜ͱ͸ग़དྷͳ͔ͬͨɻࢲ͸γεςϜ͕ ʮ”Scalable”Ͱ͋Δʯ͜ͱ͸ɺʮ”Modern”Ͱ͋Δʯͱಉ͘͡Β͍ศརͳ ݺͼํͱͯ͠࢖ΘΕ͍ͯΔͱஅݴ͢Δɻࢲ͸ɺٕज़ίϛϡχςΟʹର͠ɺ ݫ֨ͳఆٛΛఆٛ͢Δ͔ɺ͜ͷ༻ޠΛ࢖͏ͷΛ΍ΊΔ͜ͱΛਪ঑͢Δɻ”

Slide 20

Slide 20 text

Scalability • ֦ுੑ͕ߴ͍͜ͱΛചΓʹ͢ΔγεςϜʹ͓͍ͯ
 Կ͔ͱศརʹ࢖ΘΕ͍ͯΔ༻ޠͷ1ͭ • Load Scalability:
 ෛՙʹ͋ΘͤͯϦιʔεΛ૿΍ͨ͠ΓݮΒͨ͠ΓͰ͖Δ • ΠϯϑϥΤϯδχΞ͕εέʔϥϏϦςΟͬͯݴͬͨΒ
 ͍͍ͩͨ͜ͷҙຯ • ෛՙʹ͋ΘͤͯϦιʔεΛ؆୯ʹ௥ՃɾॖখͰ͖Δ͔ • ͓ۚΛ͔͚Ε͹Ͳ͏ʹ͔ͳΔ͔Ͳ͏͔

Slide 21

Slide 21 text

Latency ஗Ԇ Throughput εϧʔϓοτ Photo: Julie German https://flic.kr/p/3P5yts Photo: Cyril Caton https://flic.kr/p/6bMwku

Slide 22

Slide 22 text

Throughput • ୯Ґ࣌ؒ͋ͨΓʹॲཧͰ͖Δ͔ • ͲΕ͚ͩͷྔΛॲཧͰ͖Δ͔Λ೺Ѳ͢ΔͨΊͷई౓ 1 container / hour 1 hour source destitnation

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Latency • ॲཧʹ͔͔Δ࣌ؒ • ฒྻ਺Λ૿΍ͯ͠΋஗Ԇ͸খ͘͞ͳΒͳ͍ • ஗ԆΛղܾ͢Δʹ͸ॲཧ଎౓Λ͸΍͘͢Δ͔͠ͳ͍ 1 hour 1 minute ྫ͑͹ϩέοτΛ࢖͏

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Throughput / Latency • εϧʔϓοτ:
 γεςϜ͕ॲཧग़དྷΔྔΛ೺Ѳ͢ΔͨΊͷई౓ • εϧʔϓοτΛվળ͢Δʹ͸ • ฒྻ਺Λେ͖͘͢Δ • ஗ԆΛখ͘͢͞Δ • ϨΠςϯγ:
 ฒྻ਺Λେ͖ͯ͘͠΋஗Ԇ͸খ͘͞ͳΒͳ͍

Slide 28

Slide 28 text

Scaling • γεςϜͷεϧʔϓοτΛߴΊΔ͜ͱ • ฒྻ਺ΛߴΊΔ • ஗ԆΛগͳ͘͢Δ ! • εϧʔϓοτΛߴΊΔͨΊʹ͸ • νϡʔχϯά • εέʔϧΞοϓ/εέʔϧΞ΢τ

Slide 29

Slide 29 text

Scale up / Scale out • ฒྻ਺Λ૿΍͢ʹ͸: ෳ਺ͷαʔόʹॲཧΛৼΓ෼͚Δ • ஗ԆΛখ͘͢͞Δʹ͸: αʔόͷεϖοΫΛ͋͛Δ Ý Ý Ý Ý Ý Ý Scale Up (Vertical Scaling) Ý Ý Scale Out (Horizontal Scaling) • CPUͷίΞ਺Λ૿΍͢ • ϝϞϦʹऩ·ΔΑ͏ʹ͢Δ • νϡʔχϯά: ॲཧྔΛݮΒ͢=࣮࣭తεέʔϧΞοϓ • ෳ਺αʔόʹ෼ࢄͰ͖ΔΑ͏ʹ͢Δ • ෼ࢄ͢Ε͹͢Δ΄Ͳεέʔϧ͠ͳ͘ͳΔ • 1୆Λഒʹ͢Δʹ͸: 1୆ඞཁ • 10୆Λഒʹ͢Δʹ͸: 10୆ඞཁ

Slide 30

Slide 30 text

Scaling: ·ͱΊ • νϡʔχϯά͸εέʔϦϯάͷجຊ • νϡʔχϯά͸࣌ؒ΋͓ۚ΋ͦΕ΄Ͳ͔͔Βͳ͍ • ܭଌ͢Δલʹνϡʔχϯά͢Δͳ: ޙड़ • εέʔϧΞοϓ • ͓ۚΛ͔͚Ε͹Ͳ͏ʹ͔ͳΔΑ͏ʹ͓ͯ͘͠ • εέʔϧΞ΢τ • ෼ࢄͰ͖Δߏ੒͚ͩͭͬͯ͘͠·͑͹૿΍ͤΔ • ୆਺͕ଟ͘ͳΕ͹ଟ͘ͳΔ΄Ͳਏ͘ͳΔ

Slide 31

Slide 31 text

ܭଌͤΑ Photo: Docklandsboy https://flic.kr/p/5B4TaF

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

— Rob Pike. 1989. “Notes on Programming in C”. “Rule 2. ܭଌͤΑɻܭଌ͢Δ·Ͱ଎౓ͷͨΊͷνϡʔχϯάΛͯ͠͸ͳΒͳ͍ɺ ίʔυͷҰ෦͕࢒Γͷ෦෼Λѹ౗͠ͳ͍ͷͰ͋Ε͹ͳ͓͞ΒͰ͋Δɻ”

Slide 34

Slide 34 text

ܭଌͤΑ • ϦιʔεΛ೺Ѳ͢Δ • άϥϑΛΈΔ • ϕϯνϚʔΫ

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

CPU • PCͰ͸ܭࢉҎ֎ʹશମͷ੍ޚ΋CPU͕ߦ͍ͬͯΔ • ྫ͑͹IOΛ଴͍ͬͯΔؒ͸ଞͷܭࢉ͕ग़དྷͳ͍ • ͲΕ͚ͩCPUΛ࢖༻͔ͨ͠Λܭࢉ࣌ؒͰࣔ͢ • 1࣌ؒͰ1࣌ؒ෼ܭࢉ࣌ؒΛ࢖͏ = ࢖༻཰100% ! • System: Kernel͕࢖༻ͨ͠ܭࢉ࣌ؒ • User: ී௨ͷϓϩάϥϜ͕࢖༻ͨ͠ܭࢉ࣌ؒ • IO wait: IOͷೖग़ྗ଴ͪΛߦͬͨ࣌ؒ • IRQ / Soft IRQ: ωοτϫʔΫ౳ׂΓࠐΈΛॲཧͨ࣌ؒ͠

Slide 37

Slide 37 text

ϝϞϦ • PCͷओهԱ૷ஔ • ΊͬͪΌ͸΍͍ • ϨΠςϯγ:10 ns (SSDͩͱҰ൪଎ͯ͘0.1ms͘Β͍) • ΞϓϦέʔγϣϯ࢖༻ྖҬ • Ωϟογϡ(ϖʔδΩϟογϡ) • ϖʔδΩϟογϡʹࡌ͍ͬͯΕ͹σΟεΫ͔Β
 ಡΈࠐ·ͳͯ͘΋͍͍ʹߴ଎

Slide 38

Slide 38 text

σΟεΫIO • PCͷิॿهԱ૷ஔ • ͘͢͝஗͍ͷͰσΟεΫIO͸جຊతʹ0ʹ͢Δ • HDD: ΊͬͪΌ஗͍͚Ͳେ༰ྔͰ҆Ձ • SSD: ͸΍͍͚Ͳ௿༰ྔͰߴՁ(࠷ۙ͸࠷େͰ1TBҐ) • SATA͸ͲΜͳʹ͕Μ͹ͬͯ΋࠷େεϧʔϓοτ6Gb/s • ͞Βʹߴ଎ʹ͢Δʹ͸ • RAID 0 (ετϥΠϐϯά) • PCI-E SSD / NVMe (8-32Gb/s)

Slide 39

Slide 39 text

ωοτϫʔΫ • ଳҬ(෮श: ཧ࿦্ͷ࠷େεϧʔϓοτ) • 1Gbps (࣮ࡍ͸950MbpsҐ) • 10Gbps • ϨΠςϯγ: ωοτϫʔΫ͸஍ཧతϨΠςϯγ͕େ͖͍ • ౦ژ-χϡʔϤʔΫ: 150ms • ϙʔτ਺: TCP/IPͰ͸࠷େ65,535ݸ • TCPͰ͸ϙʔτΛόΠϯυ͠ͳ͍ͱૹड৴͕Ͱ͖ͳ͍

Slide 40

Slide 40 text

Ϧιʔεঢ়گΛ೺Ѳ͢Δ • Ͳͷϋʔυ΢ΣΞϦιʔε͕ϘτϧωοΫ͔೺Ѳ͢Δ • top — Ͳͷϓϩηε͕CPUΛ࢖༻͍ͯ͠Δ͔ • dstat — ϦιʔεͷܦաΛ೺Ѳ • netstat — LISTEN͍ͯ͠Δ͔ɺ࢖༻͍ͯ͠Δϙʔτ਺

Slide 41

Slide 41 text

top

Slide 42

Slide 42 text

htop

Slide 43

Slide 43 text

dstat

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

άϥϑͷݟํ • ظؒ͝ͱʹݟΔ: ೔/ि/೥ • ௕ظతͳάϥϑ͚ͩͩͱ୹ظతͳো֐ʹؾ͚ͮͳ͍ • ௕ظάϥϑ͕ͳ͍ͱΏͬ͘Γͨ͠มԽʹؾ͚ͮͳ͍ • ͨ͘͞ΜͷछྨͷάϥϑΛͱΔ • ஋ʹΑͬͯΘ͔Δ͜ͱ͕ҧ͏ • ·ͱΊΔͱখ͍͞εέʔϧͷ͜ͱ͸Θ͔Βͳ͘ͳΔ

Slide 46

Slide 46 text

Կ͕ϘτϧωοΫ͔೺Ѳͨ͠Β • ֤ϓϩηεʹ͍ͭͯৄ͍͠ϕϯνϚʔΫΛऔΔ • ΞϓϦέʔγϣϯ: ϓϩϑΝΠϦϯά • σʔλϕʔε: εϩʔΫΤϦϩάɺEXPLAIN • ετϨʔδ: Ωϟογϡώοτɾόϥϯγϯά

Slide 47

Slide 47 text

͜͜·Ͱͷ·ͱΊ

Slide 48

Slide 48 text

ܭଌͤΑ • Ϧιʔε͸༗ݶͰ͋Δ • ͦΕͧΕͷϦιʔεͷಛ௃Λ೺Ѳ͓ͯ͘͠ • ͲͷϦιʔε͕ϘτϧωοΫ͔Λ؍ଌ͢Δ • ϘτϧωοΫ͕Ͳ͔͜Θ͔ͬͨΒ • ৄ͍͠ϓϩϑΝΠϦϯάΛͱΔ

Slide 49

Slide 49 text

pixivͷߏ੒ Application    Database Cache Image Store Image Cluster read/write Batch  Search

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

Database 

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

pixivʹ͓͚ΔҰൠతͳߏ੒    Master Slave Replication PHP Load Balancer   Master ߋ৽ ࢀর

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

ิ଍εϥΠυ ϩʔυόϥϯαͷํࣜ • L4 Load Balancerʹ͸ओʹNATํࣜͱDRSํ͕ࣜ͋Δ • pixiv͸DSRํࣜΛ࢖͍ͬͯΔ • NATํࣜ: • ύέοτ͕͢΂ͯϩʔυόϥϯαΛܦ༝͢Δ • DSRํࣜ: • ෮࿏͕ϩʔυόϥϯαΛܦ༝͠ͳ͍ • Ϩεϙϯεͷσʔλྔ͕ଟ͍ͷͰ
 ϩʔυόϥϯαͷτϥϑΟοΫΛେ෯ʹݮΒͤΔ

Slide 56

Slide 56 text

ิ଍εϥΠυ 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ʹ͓ͯ͘͠

Slide 57

Slide 57 text

ิ଍εϥΠυ • 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

Slide 58

Slide 58 text

ิ଍εϥΠυ DSRͷར఺ͱܽ఺ • ར఺ • ϩʔυόϥϯαΛܦ༝͢Δσʔλྔ͕গͳ͘ͳΔͷͰɺ ϩʔυόϥϯαͷτϥϑΟοΫΛ཈͑Δ͜ͱ͕ग़དྷΔ • ܽ఺ • ϩʔυόϥϯαͱDBΛಉ͡ωοτϫʔΫʹ഑ஔ͢Δ
 ඞཁ͕͋Δ • ωοτϫʔΫΛ௒͑Δ͜ͱ͕ग़དྷΔٕज़΋͋Δ:L3DSR
 (pixivͰ͸࢖͍ͬͯΔͷ͸௒͑ΒΕͳ͍L2DSR)

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

ิ଍εϥΠυ WebΞϓϦέʔγϣϯͷಛ௃ • ߋ৽ॲཧʹൺ΂ࢀরස౓͕ѹ౗తʹଟ͍ • 1೔͋ͨΓͷ࡞඼౤ߘ: 20,000 • 1೔͋ͨΓͷӾཡճ਺: 100,000,000 • େن໛WebΞϓϦέʔγϣϯͰ͸ࢀর෼ׂ͕༗ޮͳ৔߹͕ଟ͍ クエリ 頻度 SELECT 多い INSERT 少ない UPDATE 少ない DELETE 非常に少ない

Slide 64

Slide 64 text

গ͠໭ͬͯ

Slide 65

Slide 65 text

pixivʹ͓͚ΔҰൠతͳߏ੒    Master Slave Replication PHP Load Balancer   Master ߋ৽ ࢀর

Slide 66

Slide 66 text

pixivͷσʔλϕʔε • ઌिͷߨٛͰ͋ͬͨͱ͓Γͨ͘͞Μͷछྨ͕͋Δ • ΠϥετɺϢʔβʔ৘ใ • খઆ • ධՁཤྺɺաڈϥϯΩϯά • ϒοΫϚʔΫ • ϒοΫϚʔΫ౷ܭ • Ϣʔβʔ޲͚ΞΫηεղੳ༻Ӿཡཤྺ …

Slide 67

Slide 67 text

ͳͥผΕ͍ͯΔͷ͔ • ͢΂ͯͷσʔλΛ1୆ͷαʔόʹஔ͍͓ͯ͘ͷ͸೉͘͠ ͳ͍ͬͯ͘ • ςʔϒϧʹΑͬͯσʔλྔʹ͕ࠩ͋Δ • ΞΫηεύλʔϯ΋ҧ͏ • Πϥετ৘ใ: ࢀর͕ଟ͍ • Ӿཡཤྺ: ௥ه͔͠ͳ͍ • ϒοΫϚʔΫ: σʔλྔ͕ଟ͍

Slide 68

Slide 68 text

νϡʔχϯάͷҧ͍ イラスト・ユーザ情報 ブックマーク σʔλྔ 少ない 多い ࢀরස౓ 多い 比較的少ない νϡʔχϯά Slave͕ଟ͍
 ϝϞϦ͸গͳΊ Slave͸গͳ͍
 ϝϞϦ౥ࡌྔ͕ଟ͍ ίετ ୆਺͸ଟ͍͚Ͳ1୆1୆͸ ௿εϖοΫͰ௿ίετ ୆਺͸গͳ͍͚Ͳ
 1୆͋ͨΓͷ஋ஈ͸ߴ͍           

Slide 69

Slide 69 text

ิ଍εϥΠυ σʔλϕʔεͷνϡʔχϯά • σʔλྔ౳ͷੑ࣭ʹΑͬͯద੾ͳνϡʔχϯά͸ҟͳΔ • σʔλɺΠϯσοΫε͕ϝϞϦʹऩ·Δ͔ • ࢀর͞ΕΔσʔλ͸ग़དྷΔ͚ͩϝϞϦʹࡌͤΔ • ࢀর͕ͳ͚Ε͹ϝϞϦʹऩ·Δඞཁ͸ͳ͍ • MyISAMɺInnoDBͷͲͪΒ͔ • σΟεΫ༰ྔ͸଍ΓΔ͔ • Slaveͷ୆਺͸Կ୆ʹ͢Δ͔ • શͯಉ͡νϡʔχϯάʹ͢Δͷ͸೉͍͠

Slide 70

Slide 70 text

1ͭͷDBʹશͯࡌͤͨ৔߹ • ੑ࣭͕ҟͳΔ͢΂ͯͷςʔϒϧʹ͋ΘͤͯDBΛ
 νϡʔχϯά͢Δඞཁ͕͋Δ • ڊେͳαʔόΛ༻ҙ͢Δඞཁ͕͋Δ イラスト・ユーザ ブックマーク イラスト・ユーザ
 ブックマーク σʔλྔ 少ない 多い 多い ࢀরස౓ 多い 少ない 多い

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

ਨ௚෼ׂͱਫฏ෼ׂ • ਨ௚෼ׂ:ྻຖʹ(·ͨ͸ςʔϒϧ୯ҐͰ)෼ׂ • ਫฏ෼ׂ:ߦຖʹ෼ׂ イラスト情報 ユーザー情報 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    ਫฏ෼ׂ ਨ௚෼ׂ   

Slide 74

Slide 74 text

ਨ௚෼ׂ • લʹઆ໌ͨ͠ͱ͓ΓpixivͰ͸ਨ௚෼ׂ͕ଟ༻͞Ε͍ͯΔ • ৽͘͠ػೳΛ௥Ճ͢Δͱ͖ʹ௥Ճ͠΍͍͔͢Β
 ਨ௚෼ׂ͞Εͨঢ়ଶͰ࢝·Δ͜ͱ΋ଟ͍ • ࠔΔ͜ͱ΋ଟ͍(ઌिͷεϥΠυࢀর) • ݁Ռॲཧ͕ෳࡶʹͳͬͯίʔυ͕มߋग़དྷͳ͘ͳΓ
 εέʔϥϏϦςΟ͕௿Լ͢Δ

Slide 75

Slide 75 text

ਫฏ෼ׂ͠ͳ͍ • pixivͰ͸ਫฏ෼ׂʹΑΔαʔόʔ෼ࢄΛߦ͍ͬͯͳ͍ • ೔෇ʹΑΔύʔςΟγϣχϯά͚ͩ(෼ࢄ໨త͡Όͳ͍) • ͋·ΓʹෳࡶʹͳΔͷͰߟ͑ͨ͘ͳ͍ • Ωϟογϡ༻్Ͱ͋Ε͹ྑ͍͔΋ • ιʔγϟϧήʔϜք۾Ͱ͸Α͘࢖ΘΕͯΔͬΆ͍

Slide 76

Slide 76 text

εϧʔϓοτΛ͋͛Δʹ͸ • ࢀর෼ׂʹΑΓࢀরεϧʔϓοτΛεέʔϧΞ΢τ • ద੾ͳཻ౓ͰσʔλϕʔεΛ෼ׂ͢Δ • ෼ׂͤͣʹεέʔϧΞοϓ͢Δ͜ͱ΋ߟ͑Δ • ඞཁҎ্ʹ෼ׂ͠ͳ͍ • ॲཧ͕ෳࡶʹͳΔͱαʔϏεશମͱͯ͠ΈΔͱ
 εέʔϥϏϦςΟ͕௿Լ͍ͯ͠Δ͜ͱ΋͋ΓಘΔ

Slide 77

Slide 77 text

஗ԆΛখ͘͢͞Δʹ͸ • εέʔϧΞοϓʹ͸ݶք͕͋Δ • CPUͷप೾਺͸ߴࢭ·Γ(FPGAͱ͔೉ͦ͠͏) • ϝϞϦͷΞΫηε଎౓Λ௒͑Δ͜ͱ͸೉͍͠ • ͨ͘͞ΜͷσʔλΛಡΈࠐΊ͹(ॲཧ͢Ε͹)
 ͦΕ͚͕͔͔ͩ࣌ؒΔ • ஗ԆΛখ͘͢͞Δʹ͸ॲཧ͢ΔσʔλྔΛগͳ͘͢Δ

Slide 78

Slide 78 text

ΠϯσοΫεΛ࢖͏ • ୳ࡧ͢ΔσʔλྔΛগͳ͘͢Δ • ΠϯσοΫε͕ͳ͍৔߹: ઌ಄͔Βॱʹ୳ࡧ ! ! ! • ΠϯσοΫε͕͋Δ৔߹: B+πϦʔͷ୳ࡧͷΈ ID title 20 2000೥ 21 2000೥ 22 2000೥ : : 20 21 22 … …

Slide 79

Slide 79 text

ΠϯσοΫε͕࢖ΘΕ͍ͯΔ͔ௐ΂Δ • EXPLAINΛ࣮ߦ͢Δ εϥΠυ࡞Γ๨Εͨ

Slide 80

Slide 80 text

ύʔςΟγϣχϯάΛ࢖͏ ID title 20 2000೥ 21 2000೥ 22 2000೥ : : • σʔλ͕֨ೲ͞Ε͍ͯΔςʔϒϧ͚ͩΛ୳ࡧ͢Ε͹ྑ͍ • 10,000݅ʹ෼ׂͨ͠Βઌ಄୳ࡧͯ͠΋࠷େ10,000݅ ID title 10000 10001 10002 : : ID͕֨ೲ͞Ε͍ͯΔ
 ςʔϒϧ͚ͩ୳ࡧ

Slide 81

Slide 81 text

͜͜·Ͱͷ·ͱΊ

Slide 82

Slide 82 text

Database • σʔλϕʔεͷεϧʔϓοτΛ͋͛Δʹ͸ • ࢀর෼ׂʹΑΓࢀরεϧʔϓοτΛεέʔϧΞ΢τ • ద੾ͳཻ౓ͰσʔλϕʔεΛ෼ׂ͢Δ • σʔλϕʔεͷ஗ԆΛগͳ͘͢Δʹ͸ • ୳ࡧ͢ΔσʔλྔΛগͳ͘͢Δ: ΠϯσοΫεΛ࢖͏ • ୳ࡧ͢Δσʔλྔ͕গͳͯ͘ࡁΉΑ͏ʹͪΌΜͱ
 ߟ͑ͯઃܭ͢Δ

Slide 83

Slide 83 text

Contents Delivery

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

pixivͷը૾഑৴ • େྔͷը૾ϑΝΠϧ • ΦϦδφϧը૾: 40TB • αϜωΠϧͷछྨ: 20छྨҎ্ • 1ຕ͝ͱͷαΠζ • ฏۉ: 60KB (95ˋλΠϧ: 300KB) • ࠷େ: 15MB

Slide 87

Slide 87 text

pixivͷը૾഑৴ • େྔͷϦΫΤετ • ϦΫΤετ਺: ͍͍ͩͨ15,000 req/s • సૹྔ: ࠷େ 14Gbps

Slide 88

Slide 88 text

ը૾഑৴Ϋϥελ • pixivͰ͸CDNΛ࢖͍ͬͯͳ͍ • ୅ΘΓʹಠࣗͷCDNͷΑ͏ͳ࢓૊ΈΛ͍࣋ͬͯΔ • ճઢඅ༻͸Ϋϥ΢υΑΓΦϯϓϨͷํ͕҆Ձ • Ωϟογϡώοτ཰95% • ϩϯάςʔϧͳͷͰେ༰ྔͷΩϟογϡ͕ඞཁ • ఘΊ͍ͯΔ͜ͱ • ஍ཧతͳεέʔϥϏϦςΟ

Slide 89

Slide 89 text

ը૾഑৴Ϋϥελ 6GbpsΛ͞͹͘ΦϨΦϨCDNߏஙज़ http://www.slideshare.net/semind/20101220-pixiv-techmeeting-6267332

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

ը૾഑৴Ϋϥελ 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

Slide 92

Slide 92 text

Consistent Hashing • URLΛΩʔʹͯ͠Hashing͢Δ • ΩϟογϡΛෳ਺୆ʹεέʔϧΞ΢τͰ͖Δ • શτϥϑΟοΫͷ95%ΛΩϟογϡͰԠ౴Ͱ͖Δ TrafficServer Cache TrafficServer Cache TrafficServer Cache Hash table Hash table Hash table

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

͜͜·Ͱͷ·ͱΊ

Slide 96

Slide 96 text

Contents Delivery • ը૾഑৴ͷεϧʔϓοτΛ͋͛Δʹ͸ • εέʔϧ͢ΔΩϟογϡΫϥελΛઃܭ͢Δ • Ωϟογϡ༰ྔͱτϥϑΟοΫʹؾΛ͚ͭΔ ! • ϨΠςϯγ • Ϥʔϩούʹ೔ຊ͔Βʹߴ଎ʹసૹ͢Δͷ͸ແཧ • ෦෼తʹCDNΛݕূ͍ͯ͠Δ

Slide 97

Slide 97 text

ϩάΛ׆༻͢Δ

Slide 98

Slide 98 text

ϩάΛ׆༻͢Δ • ϩάσʔλ͸ଟ͚Ε͹ଟ͍ํ͕ྑ͍ Application Load Balancer Database ΞΫηεϩά Πϕϯτϩά εϩʔΫΤϦϩά  ੜσʔλ  Τϥʔϩά ΞΫηεϩά • ϦΫΤετͨ͠URL • ૹ৴ݩIPΞυϨεɺUA • ϨεϙϯελΠϜ • ϦΫΤετॲཧ࣌ؒ ! Πϕϯτϩά • Ϣʔβ͕ߦͬͨΠϕϯτͷৄࡉ৘ใ • POSTϦΫΤετͷத਎͸ΞΫηεϩάʹ͸ؚ·Εͳ͍

Slide 99

Slide 99 text

άϩʔεͷͨΊʹ • ΞΫςΟϒϢʔβʔͷಈ޲Λௐࠪ͢Δ • ֤ػೳ͕ͲΕ͚ͩ࢖ΘΕ͍ͯΔ͔ௐࠪ͢Δ • ػೳվमʹΑͬͯͲͷΑ͏ͳมԽ͕ى͔ͬͨ͜ௐ΂Δ

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

ϩάܗࣜΛબͿ • ςΩετܗࣜ • ίϚϯυϥΠϯͰૢ࡞͠΍͍͢ • ߦϕʔεͰ͋Δ • awk/cut΍ϫϯϥΠφʔͰ੔ܗ͠΍͍͢ • σʔλྔ͕େ͖͘ͳΒͳ͍

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

• Ұ୴ϑΝΠϧʹॻ͖ग़ͯͦ͠ΕΛผϓϩηε͕ಡΈࠐΉ • ϩάͷ෮چɺઃఆมߋ͕͠΍͍͢ • ग़ྗઌΛ૿΍ͨ͠ͱ͖աڈͷϩάΛΠϯϙʔτͰ͖Δ FluentdʹΑΔϩάసૹ Fluentd Files Application Load Balancer Database ΞΫηεϩά Πϕϯτϩά εϩʔΫΤϦϩά  ੜσʔλ  Τϥʔϩά BigQuery ! Elasticsearch ! MongoDB Fluentd

Slide 104

Slide 104 text

Google BigQuery • Google͕ఏڙ͍ͯ͠ΔղੳϓϥοτϑΥʔϜ • SQLͰ਺ԯ݅ͷղੳ͕े਺ඵͰͰ͖Δ • ਺ઍ୆ͷαʔόʹ෼ࢄ͞Ε਺ͷ๫ྗʹΑͬͯܭࢉ͞ΕΔ • Google Analytics Premiumʹೖ͍ͬͯΔͱ
 Google AnalyticsͷੜϩάΛղੳग़དྷΔ

Slide 105

Slide 105 text

Kibana

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

ՄࢹԽΛߦ͏ʹ͸ • ·ͣ؆୯ʹՄࢹԽͰ͖Δͱ͍͏ࣄ࣮Λͭ͘Δ • ը໘ΛݟΔจԽΛࠜ෇͔ͤΔ • ՄࢹԽ͢ΔจԽ͕ҰൠతʹͳΕ͹ෆຬ͕ग़ͯ͘Δ • ͋·Γίετ͸͔͚ͳ͍ • ໨తΛܾఆ͢Δલʹಋೖ͢Δඞཁ͕͋Δ • ·ͣ͸ࣾ಺ίετΛ࢖Θͣʹ֎෦ͷϦιʔεΛ࢖͏

Slide 109

Slide 109 text

͜͜·Ͱͷ·ͱΊ

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

·ͱΊ

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

·ͱΊ • ਺ࣈΛܭଌ͢Δ׳शΛ෇͚Δ • େن໛αʔϏεͰ͸Ϧιʔε͋ͨΓͷεϧʔϓοτ͕
 ॏཁʹͳΔ • ࢥ͍ࠐΈͰߦಈͤͣʹ͔ͳΒͣܭଌͯ͠࠷దԽ͢Δ • ࢓ࣄͷਐΊํ΋ಉ͡