Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Growing Service
Search
Harukasan
PRO
September 11, 2014
Technology
12
12k
Growing Service
成長するサービス
pixiv SUMMER BOOTCAMP -2014- / 2014-09-08
Harukasan
PRO
September 11, 2014
Tweet
Share
More Decks by Harukasan
See All by Harukasan
Successor to PicoRabbit: Ruby Programming Envorinment / RubyKaigi 2025 follow up
harukasan
PRO
1
190
Write your own mrbgem, Create your own device
harukasan
PRO
1
110
PicoRabbit: a Tiny Presentation Device Powered by Ruby
harukasan
PRO
2
470
pixivを支える技術 / 技育CAMPアカデミア
harukasan
PRO
3
520
20240401 新卒研修 - ピクシブにおける技術領域
harukasan
PRO
1
840
ピクシブのコンテンツ配信基盤技術 / pixiv TECH SALON
harukasan
PRO
5
5.7k
Goにおける画像ファイル処理 / golang.tokyo #19
harukasan
PRO
7
6.7k
WebRTC動画をトランスコードする / Transcoding video streams from WebRTC
harukasan
PRO
5
1.6k
ImageFluxを支えるリモート開発 / 20171202
harukasan
PRO
2
1.9k
Other Decks in Technology
See All in Technology
Agile PBL at New Grads Trainings
kawaguti
PRO
1
450
Android Audio: Beyond Winning On It
atsushieno
0
2.4k
20250913_JAWS_sysad_kobe
takuyay0ne
2
240
TS-S205_昨年対比2倍以上の機能追加を実現するデータ基盤プロジェクトでのAI活用について
kaz3284
1
210
「何となくテストする」を卒業するためにプロダクトが動く仕組みを理解しよう
kawabeaver
0
430
2025/09/16 仕様駆動開発とAI-DLCが導くAI駆動開発の新フェーズ
masahiro_okamura
0
110
Unlocking the Power of AI Agents with LINE Bot MCP Server
linedevth
0
110
スクラムガイドに載っていないスクラムのはじめかた - チームでスクラムをはじめるときに知っておきたい勘所を集めてみました! - / How to start Scrum that is not written in the Scrum Guide 2nd
takaking22
1
140
S3アクセス制御の設計ポイント
tommy0124
3
200
はじめてのOSS開発からみえたGo言語の強み
shibukazu
3
950
新規プロダクトでプロトタイプから正式リリースまでNext.jsで開発したリアル
kawanoriku0
1
180
5年目から始める Vue3 サイト改善 #frontendo
tacck
PRO
3
230
Featured
See All Featured
Practical Orchestrator
shlominoach
190
11k
How GitHub (no longer) Works
holman
315
140k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
Making the Leap to Tech Lead
cromwellryan
135
9.5k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.6k
YesSQL, Process and Tooling at Scale
rocio
173
14k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
The World Runs on Bad Software
bkeepers
PRO
70
11k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
Site-Speed That Sticks
csswizardry
10
820
Embracing the Ebb and Flow
colly
87
4.8k
Facilitating Awesome Meetings
lara
55
6.5k
Transcript
͢ΔαʔϏε Δ͔͞Μ / MICHII Shunsuke 2014-09-08 pixiv SUMMER BOOT CAMP
-2014-
これまで3つのプロダクト(広告配信、pixiv、BOOTH)の話を聞 いて、それぞれのプロダクトにどのような技術を使われている か、なぜその技術が使われているか、何を考えて設計されてい るか、そのようなことについて思いを巡らせてみたかと思いま す。どのサービスもそれぞれのバックグラウンドを持っており、 そして、現在稼働しているサービスがあります。それぞれのサー ビスで使われている技術はばらばらだし、1つ1つの技術にそ れなりに理由があったり、特になかったりします(動いているの は正義です)。みなさんもプロダクトをつくったりしたことがあ れば、特に理由もなく新しい技術を採用したりすることもあると
思います。さて、設計の話はそろそろ飽きたと思うので、今日は 運用していく上で必要な技術の話をしようと思います。とはい え、単に運用の話をしてもおもしろくないと思うので、運用して いく上で、どのようなことを考えれば良いかについて話します。
͍
͢ΔαʔϏε Δ͔͞Μ / MICHII Shunsuke 2014-09-08 pixiv SUMMER BOOT CAMP
-2014-
None
2007ʹ͡·ͬͨྺ࢙͋ΔαʔϏε
None
໌Ͱͪΐ͏Ͳ7* *αʔϏε։࢝20079݄10
༗࢙(20091݄)Ҏޙ* *svnʹ࠷ॳʹίϛοτ͞Ε͔ͯΒ
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;’
pixiv ブックマーク フォロー フォロー新着 小説フォ ロ ー 新 着 お す す め
作 品 ス マ ー ト フ ォ ン circle.ms連携 コメント イラスト投稿 iOSアプリ コ ン テ ス ト イ ベ ン ト ゲーム 作品管理 ユーザー ガラケー アンケート うごイラ タグ ランキング 地域ランキング 過去ランキング 検索 シリーズ フィード タグ詳細 使用ツール Androidアプリ 人気のタグ お知らせ みんなの新着 企画目録 フォロー新着 BOOTH連携 注目のタグ ૿͑ଓ͚Δػೳ
૿͑ଓ͚Δσʔλ
༷ʑͳϓϥοτϑΥʔϜ pixiv pixiv touch iOS App. Android App. աڈʹଞʹ
ΛࢭΊͳ͍ͨΊʹԿΛ͢Εྑ͍͔
Ή͠ΖՃ͍ͯ͘͠ʹͲ͏͢Εྑ͍͔
Agenda • αʔϏεͷεέʔϥϏϦςΟ • ܭଌͤΑ • pixivͷέʔεελσΟ
༰Λ٧ΊࠐΈ͗ͨ͢ͷͰ ͔ͳΓۦ͚Ͱ͢
Scalability εέʔϥϏϦςΟ Photo: Container Ship https://flic.kr/p/9buvwZ
— Mark D. Hill. 1990. “What is scalability?”. SIGARCH Comput.
Archit. News 18, 4, 18-21. DOI=10.1145/121973.121975 “͜ͷจʹ͓͍ͯɺࢲScalabilityͷ༷૬ʹ͍ͭͯௐࠪͨ͠ɻ͔͠͠ͳ͕ Βɺ༗༻Ͱݫ֨ͳఆٛΛݟ͚ͭΔ͜ͱग़དྷͳ͔ͬͨɻࢲγεςϜ͕ ʮ”Scalable”Ͱ͋Δʯ͜ͱɺʮ”Modern”Ͱ͋Δʯͱಉ͘͡Β͍ศརͳ ݺͼํͱͯ͠ΘΕ͍ͯΔͱஅݴ͢Δɻࢲɺٕज़ίϛϡχςΟʹର͠ɺ ݫ֨ͳఆٛΛఆٛ͢Δ͔ɺ͜ͷ༻ޠΛ͏ͷΛΊΔ͜ͱΛਪ͢Δɻ”
Scalability • ֦ுੑ͕ߴ͍͜ͱΛചΓʹ͢ΔγεςϜʹ͓͍ͯ Կ͔ͱศརʹΘΕ͍ͯΔ༻ޠͷ1ͭ • Load Scalability: ෛՙʹ͋ΘͤͯϦιʔεΛ૿ͨ͠ΓݮΒͨ͠ΓͰ͖Δ • ΠϯϑϥΤϯδχΞ͕εέʔϥϏϦςΟͬͯݴͬͨΒ
͍͍ͩͨ͜ͷҙຯ • ෛՙʹ͋ΘͤͯϦιʔεΛ؆୯ʹՃɾॖখͰ͖Δ͔ • ͓ۚΛ͔͚ΕͲ͏ʹ͔ͳΔ͔Ͳ͏͔
Latency Ԇ Throughput εϧʔϓοτ Photo: Julie German https://flic.kr/p/3P5yts Photo: Cyril
Caton https://flic.kr/p/6bMwku
Throughput • ୯Ґ࣌ؒ͋ͨΓʹॲཧͰ͖Δ͔ • ͲΕ͚ͩͷྔΛॲཧͰ͖Δ͔ΛѲ͢ΔͨΊͷई 1 container / hour 1
hour source destitnation
Bandwidth (ଳҬ෯) 10 containers / hour 1 hour • 1ͭͷճઢ͋ͨΓͷཧ্ͷ࠷େεϧʔϓοτ
Increasing Throughput 1 hour • εϧʔϓοτΛ૿͢ʹฒྻΛେ͖͘͢Δ 30 containers / hour
Latency • ॲཧʹ͔͔Δ࣌ؒ • ฒྻΛ૿ͯ͠Ԇখ͘͞ͳΒͳ͍ • ԆΛղܾ͢ΔʹॲཧΛ͘͢Δ͔͠ͳ͍ 1 hour 1
minute ྫ͑ϩέοτΛ͏
Latency • ԆΛখ͘͢͞Δͱεϧʔϓοτվળ͢Δ • ࡌͰ͖Δྔ͕ಉ͡Ͱ͋ΕɺԆ͕1/nʹͳΔͱ εϧʔϓοτnഒ 1 hour 1 minute
1 containers / hour 60 containers / hour
Throughput / Latency • εϧʔϓοτ: γεςϜ͕ॲཧग़དྷΔྔΛѲ͢ΔͨΊͷई • εϧʔϓοτΛվળ͢Δʹ • ฒྻΛେ͖͘͢Δ
• ԆΛখ͘͢͞Δ • ϨΠςϯγ: ฒྻΛେ͖ͯ͘͠Ԇখ͘͞ͳΒͳ͍
Scaling • γεςϜͷεϧʔϓοτΛߴΊΔ͜ͱ • ฒྻΛߴΊΔ • ԆΛগͳ͘͢Δ ! • εϧʔϓοτΛߴΊΔͨΊʹ
• νϡʔχϯά • εέʔϧΞοϓ/εέʔϧΞτ
Scale up / Scale out • ฒྻΛ૿͢ʹ: ෳͷαʔόʹॲཧΛৼΓ͚Δ • ԆΛখ͘͢͞Δʹ:
αʔόͷεϖοΫΛ͋͛Δ Ý Ý Ý Ý Ý Ý Scale Up (Vertical Scaling) Ý Ý Scale Out (Horizontal Scaling) • CPUͷίΞΛ૿͢ • ϝϞϦʹऩ·ΔΑ͏ʹ͢Δ • νϡʔχϯά: ॲཧྔΛݮΒ͢=࣮࣭తεέʔϧΞοϓ • ෳαʔόʹࢄͰ͖ΔΑ͏ʹ͢Δ • ࢄ͢Ε͢Δ΄Ͳεέʔϧ͠ͳ͘ͳΔ • 1Λഒʹ͢Δʹ: 1ඞཁ • 10Λഒʹ͢Δʹ: 10ඞཁ
Scaling: ·ͱΊ • νϡʔχϯάεέʔϦϯάͷجຊ • νϡʔχϯά͓࣌ؒۚͦΕ΄Ͳ͔͔Βͳ͍ • ܭଌ͢Δલʹνϡʔχϯά͢Δͳ: ޙड़ •
εέʔϧΞοϓ • ͓ۚΛ͔͚ΕͲ͏ʹ͔ͳΔΑ͏ʹ͓ͯ͘͠ • εέʔϧΞτ • ࢄͰ͖Δߏ͚ͩͭͬͯ͘͠·͑૿ͤΔ • ͕ଟ͘ͳΕଟ͘ͳΔ΄Ͳਏ͘ͳΔ
ܭଌͤΑ Photo: Docklandsboy https://flic.kr/p/5B4TaF
— Rob Pike. 1989. “Notes on Programming in C”. “Rule
1. ϓϩάϥϜ͕Ͳ͜Ͱ࣌ؒΛফඅ͢Δ͜ͱʹͳΔ͔Δ͜ͱग़དྷͳ͍ɻ ϘτϧωοΫࢥ͍͕͚ͳ͍ॴͰൃੜ͢Δɺ͕ͨͬͯ͠Ͳ͕͜ϘτϧωοΫ ͔ূ໌͢Δ·ͰɺਪଌΛߦͬͨΓεϐʔυϋοΫΛߦ͍͚ͬͯͳ͍ɻ”
— Rob Pike. 1989. “Notes on Programming in C”. “Rule
2. ܭଌͤΑɻܭଌ͢Δ·ͰͷͨΊͷνϡʔχϯάΛͯ͠ͳΒͳ͍ɺ ίʔυͷҰ෦͕Γͷ෦Λѹ͠ͳ͍ͷͰ͋Εͳ͓͞ΒͰ͋Δɻ”
ܭଌͤΑ • ϦιʔεΛѲ͢Δ • άϥϑΛΈΔ • ϕϯνϚʔΫ
Ϧιʔε • ݱͷPCαʔόʹ͓͚ΔओཁͳϦιʔε(ܭࢉࢿݯ) • CPU • Memory • Disk I/O
• Network
CPU • PCͰܭࢉҎ֎ʹશମͷ੍ޚCPU͕ߦ͍ͬͯΔ • ྫ͑IOΛ͍ͬͯΔؒଞͷܭࢉ͕ग़དྷͳ͍ • ͲΕ͚ͩCPUΛ༻͔ͨ͠Λܭࢉ࣌ؒͰࣔ͢ • 1࣌ؒͰ1࣌ؒܭࢉ࣌ؒΛ͏ =
༻100% ! • System: Kernel͕༻ͨ͠ܭࢉ࣌ؒ • User: ී௨ͷϓϩάϥϜ͕༻ͨ͠ܭࢉ࣌ؒ • IO wait: IOͷೖग़ྗͪΛߦͬͨ࣌ؒ • IRQ / Soft IRQ: ωοτϫʔΫׂΓࠐΈΛॲཧͨ࣌ؒ͠
ϝϞϦ • PCͷओهԱஔ • ΊͬͪΌ͍ • ϨΠςϯγ:10 ns (SSDͩͱҰ൪ͯ͘0.1ms͘Β͍) •
ΞϓϦέʔγϣϯ༻ྖҬ • Ωϟογϡ(ϖʔδΩϟογϡ) • ϖʔδΩϟογϡʹࡌ͍ͬͯΕσΟεΫ͔Β ಡΈࠐ·ͳ͍͍ͯ͘ʹߴ
σΟεΫIO • PCͷิॿهԱஔ • ͍͘͢͝ͷͰσΟεΫIOجຊతʹ0ʹ͢Δ • HDD: ΊͬͪΌ͍͚Ͳେ༰ྔͰ҆Ձ • SSD:
͍͚Ͳ༰ྔͰߴՁ(࠷ۙ࠷େͰ1TBҐ) • SATAͲΜͳʹ͕Μͬͯ࠷େεϧʔϓοτ6Gb/s • ͞Βʹߴʹ͢Δʹ • RAID 0 (ετϥΠϐϯά) • PCI-E SSD / NVMe (8-32Gb/s)
ωοτϫʔΫ • ଳҬ(෮श: ཧ্ͷ࠷େεϧʔϓοτ) • 1Gbps (࣮ࡍ950MbpsҐ) • 10Gbps •
ϨΠςϯγ: ωοτϫʔΫཧతϨΠςϯγ͕େ͖͍ • ౦ژ-χϡʔϤʔΫ: 150ms • ϙʔτ: TCP/IPͰ࠷େ65,535ݸ • TCPͰϙʔτΛόΠϯυ͠ͳ͍ͱૹड৴͕Ͱ͖ͳ͍
Ϧιʔεঢ়گΛѲ͢Δ • ͲͷϋʔυΣΞϦιʔε͕ϘτϧωοΫ͔Ѳ͢Δ • top — Ͳͷϓϩηε͕CPUΛ༻͍ͯ͠Δ͔ • dstat —
ϦιʔεͷܦաΛѲ • netstat — LISTEN͍ͯ͠Δ͔ɺ༻͍ͯ͠Δϙʔτ
top
htop
dstat
άϥϑΛݟΔ • ৗࠒ͔ΒϦιʔεঢ়گΛՄࢹԽ͠Ѳ͢Δ • Munin: ֤αʔόͷϦιʔεάϥϑΛऩूͯ͘͠ΕΔ
άϥϑͷݟํ • ظؒ͝ͱʹݟΔ: /ि/ • ظతͳάϥϑ͚ͩͩͱظతͳোʹؾ͚ͮͳ͍ • ظάϥϑ͕ͳ͍ͱΏͬ͘Γͨ͠มԽʹؾ͚ͮͳ͍ • ͨ͘͞ΜͷछྨͷάϥϑΛͱΔ
• ʹΑͬͯΘ͔Δ͜ͱ͕ҧ͏ • ·ͱΊΔͱখ͍͞εέʔϧͷ͜ͱΘ͔Βͳ͘ͳΔ
Կ͕ϘτϧωοΫ͔Ѳͨ͠Β • ֤ϓϩηεʹ͍ͭͯৄ͍͠ϕϯνϚʔΫΛऔΔ • ΞϓϦέʔγϣϯ: ϓϩϑΝΠϦϯά • σʔλϕʔε: εϩʔΫΤϦϩάɺEXPLAIN •
ετϨʔδ: Ωϟογϡώοτɾόϥϯγϯά
͜͜·Ͱͷ·ͱΊ
ܭଌͤΑ • Ϧιʔε༗ݶͰ͋Δ • ͦΕͧΕͷϦιʔεͷಛΛѲ͓ͯ͘͠ • ͲͷϦιʔε͕ϘτϧωοΫ͔Λ؍ଌ͢Δ • ϘτϧωοΫ͕Ͳ͔͜Θ͔ͬͨΒ •
ৄ͍͠ϓϩϑΝΠϦϯάΛͱΔ
pixivͷߏ Application Database Cache Image Store Image
Cluster read/write Batch Search
έʔεελσΟ • ৄ͍͠લʑճͷࢿྉʹ͍͍ͩͨॻ͍ͯ͋Δ • ͏͢͜͠جຊతͳΛ͠·͢ ! • pixivΛࢧ͑Δٕज़2014 https://speakerdeck.com/edvakf/pixivwozhi-eruji-shu-2014
Database
Database • pixivʹ͓͚Δσʔλϕʔεͷߏ • σʔλϕʔεͷεϧʔϓοτΛ͋͛Δʹ • σʔλϕʔεͷԆΛগͳ͘͢Δʹ
pixivʹ͓͚ΔҰൠతͳߏ Master Slave Replication PHP Load Balancer
Master ߋ৽ ࢀর
Load Balancer • ॲཧΛෳͷαʔόʹࢄͤ͞ΔͨΊͷϛυϧΣΞ • ύέοτΛෳͷαʔόʹৼΓ͚Δ͜ͱͰ ॲཧΛࢄͤ͞Δ • pixivͰDBͷෛՙࢄʹLVSΛ͍ͬͯΔ PHP
ิεϥΠυ ϩʔυόϥϯαͷํࣜ • L4 Load BalancerʹओʹNATํࣜͱDRSํ͕ࣜ͋Δ • pixivDSRํࣜΛ͍ͬͯΔ • NATํࣜ:
• ύέοτ͕ͯ͢ϩʔυόϥϯαΛܦ༝͢Δ • DSRํࣜ: • ෮࿏͕ϩʔυόϥϯαΛܦ༝͠ͳ͍ • Ϩεϙϯεͷσʔλྔ͕ଟ͍ͷͰ ϩʔυόϥϯαͷτϥϑΟοΫΛେ෯ʹݮΒͤΔ
ิεϥΠυ 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ʹ͓ͯ͘͠
ิεϥΠυ • 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
ิεϥΠυ DSRͷརͱܽ • ར • ϩʔυόϥϯαΛܦ༝͢Δσʔλྔ͕গͳ͘ͳΔͷͰɺ ϩʔυόϥϯαͷτϥϑΟοΫΛ͑Δ͜ͱ͕ग़དྷΔ • ܽ •
ϩʔυόϥϯαͱDBΛಉ͡ωοτϫʔΫʹஔ͢Δ ඞཁ͕͋Δ • ωοτϫʔΫΛ͑Δ͜ͱ͕ग़དྷΔٕज़͋Δ:L3DSR (pixivͰ͍ͬͯΔͷ͑ΒΕͳ͍L2DSR)
• ࢀরͱߋ৽ॲཧΛׂ͢Δߏ • ࢀরͷεϧʔϓοτΛ૿Ճͤ͞Δ͜ͱ͕Ͱ͖Δ • WebαʔϏεͰߋ৽ॲཧʹൺࢀরස͕ѹతʹଟ͍ ࢀরׂ
Slave App. Master ϨϓϦέʔγϣϯ ߋ৽ΫΤϦ Load Balancer ࢄ ࢀরΫΤϦ(SELECT)
• ࢀরͱߋ৽ॲཧΛׂ͢Δߏ • ࢀরͷεϧʔϓοτΛ૿Ճͤ͞Δ͜ͱ͕Ͱ͖Δ • WebαʔϏεͰߋ৽ॲཧʹൺࢀরස͕ѹతʹଟ͍ ࢀরׂ
Slave App. Master ϨϓϦέʔγϣϯ ߋ৽ΫΤϦ Load Balancer ࢄ ࢀরΫΤϦ(SELECT)
• ࢀরͱߋ৽ॲཧΛׂ͢Δߏ • ࢀরͷεϧʔϓοτΛ૿Ճͤ͞Δ͜ͱ͕Ͱ͖Δ • WebαʔϏεͰߋ৽ॲཧʹൺࢀরස͕ѹతʹଟ͍ ࢀরׂ
Slave App. Master ϨϓϦέʔγϣϯ ߋ৽ΫΤϦ Load Balancer ࢄ ࢀরΫΤϦ
• εϧʔϓοτ͕૿Ճ͢ΔͷࢀরΫΤϦ͚ͩ • ߋ৽ΫΤϦ֤SlaveͰ࣮ߦ͞ΕΔ • SELECTͯ͠UPDATEͷΑ͏ͳॲཧͩͱෆ߹͕ى͖Δ • ΞϓϦέʔγϣϯͰߋ৽ΫΤϦͱࢀরΫΤϦΛৼΓ͚ ͳ͍ͱ͍͚ͳ͍ͷͰίʔυ͕ෳࡶʹͳΔ ࢀরׂͷऑ
ิεϥΠυ WebΞϓϦέʔγϣϯͷಛ • ߋ৽ॲཧʹൺࢀরස͕ѹతʹଟ͍ • 1͋ͨΓͷ࡞ߘ: 20,000 • 1͋ͨΓͷӾཡճ: 100,000,000
• େنWebΞϓϦέʔγϣϯͰࢀরׂ͕༗ޮͳ߹͕ଟ͍ クエリ 頻度 SELECT 多い INSERT 少ない UPDATE 少ない DELETE 非常に少ない
গͬͯ͠
pixivʹ͓͚ΔҰൠతͳߏ Master Slave Replication PHP Load Balancer
Master ߋ৽ ࢀর
pixivͷσʔλϕʔε • ઌिͷߨٛͰ͋ͬͨͱ͓Γͨ͘͞Μͷछྨ͕͋Δ • ΠϥετɺϢʔβʔใ • খઆ • ධՁཤྺɺաڈϥϯΩϯά •
ϒοΫϚʔΫ • ϒοΫϚʔΫ౷ܭ • Ϣʔβʔ͚ΞΫηεղੳ༻Ӿཡཤྺ …
ͳͥผΕ͍ͯΔͷ͔ • ͯ͢ͷσʔλΛ1ͷαʔόʹஔ͍͓ͯ͘ͷ͘͠ ͳ͍ͬͯ͘ • ςʔϒϧʹΑͬͯσʔλྔʹ͕ࠩ͋Δ • ΞΫηεύλʔϯҧ͏ • Πϥετใ:
ࢀর͕ଟ͍ • Ӿཡཤྺ: ه͔͠ͳ͍ • ϒοΫϚʔΫ: σʔλྔ͕ଟ͍
νϡʔχϯάͷҧ͍ イラスト・ユーザ情報 ブックマーク σʔλྔ 少ない 多い ࢀরස 多い 比較的少ない νϡʔχϯά
Slave͕ଟ͍ ϝϞϦগͳΊ Slaveগͳ͍ ϝϞϦࡌྔ͕ଟ͍ ίετ ଟ͍͚Ͳ11 εϖοΫͰίετ গͳ͍͚Ͳ 1͋ͨΓͷஈߴ͍
ิεϥΠυ σʔλϕʔεͷνϡʔχϯά • σʔλྔͷੑ࣭ʹΑͬͯదͳνϡʔχϯάҟͳΔ • σʔλɺΠϯσοΫε͕ϝϞϦʹऩ·Δ͔ • ࢀর͞ΕΔσʔλग़དྷΔ͚ͩϝϞϦʹࡌͤΔ • ࢀর͕ͳ͚ΕϝϞϦʹऩ·Δඞཁͳ͍
• MyISAMɺInnoDBͷͲͪΒ͔ • σΟεΫ༰ྔΓΔ͔ • SlaveͷԿʹ͢Δ͔ • શͯಉ͡νϡʔχϯάʹ͢Δͷ͍͠
1ͭͷDBʹશͯࡌͤͨ߹ • ੑ࣭͕ҟͳΔͯ͢ͷςʔϒϧʹ͋ΘͤͯDBΛ νϡʔχϯά͢Δඞཁ͕͋Δ • ڊେͳαʔόΛ༻ҙ͢Δඞཁ͕͋Δ イラスト・ユーザ ブックマーク イラスト・ユーザ ブックマーク
σʔλྔ 少ない 多い 多い ࢀরස 多い 少ない 多い
1ͭͷDBʹશͯࡌͤͨ߹ • TBΫϥεͷϝϞϦΛࡌͰ͖Δαʔό͋Δ͜ͱ͋Δ • ͦ͏͍͏ͷΛߟ͑ͯྑ͍͔ http://www.supermicro.com/newsroom/pressreleases/2014/press140218_4U_4-Way.cfm
σʔλϕʔεͷνϡʔχϯά • εέʔϧΞοϓͰͲ͏ʹ͔͍͍ͯ͠ • ৽͍͠ͷΛௐୡ͢Δͷʹ͕͔͔࣌ؒΔ • ٕज़ݕূɺݟੵΓɺൃ……࠷Ͱिؒ • ࠓճϋʔυΣΞͷεϖοΫΞοϓͰ͠ͷ͚͛ͨͲ ࣍ճߴεϖοΫ͕͋Δ͔Θ͔Βͳ͍
• ಉ͡εϖοΫͷαʔόΛฒ͍͚ͯͩ͘Ͱྑ͍ํָ͕
ਨׂͱਫฏׂ • ਨׂ:ྻຖʹ(·ͨςʔϒϧ୯ҐͰ)ׂ • ਫฏׂ:ߦຖʹׂ イラスト情報 ユーザー情報 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 ਫฏׂ ਨׂ
ਨׂ • લʹઆ໌ͨ͠ͱ͓ΓpixivͰਨׂ͕ଟ༻͞Ε͍ͯΔ • ৽͘͠ػೳΛՃ͢Δͱ͖ʹՃ͍͔͢͠Β ਨׂ͞Εͨঢ়ଶͰ࢝·Δ͜ͱଟ͍ • ࠔΔ͜ͱଟ͍(ઌिͷεϥΠυࢀর) • ݁Ռॲཧ͕ෳࡶʹͳͬͯίʔυ͕มߋग़དྷͳ͘ͳΓ
εέʔϥϏϦςΟ͕Լ͢Δ
ਫฏׂ͠ͳ͍ • pixivͰਫฏׂʹΑΔαʔόʔࢄΛߦ͍ͬͯͳ͍ • ʹΑΔύʔςΟγϣχϯά͚ͩ(ࢄత͡Όͳ͍) • ͋·ΓʹෳࡶʹͳΔͷͰߟ͑ͨ͘ͳ͍ • Ωϟογϡ༻్Ͱ͋Εྑ͍͔ •
ιʔγϟϧήʔϜք۾ͰΑ͘ΘΕͯΔͬΆ͍
εϧʔϓοτΛ͋͛Δʹ • ࢀরׂʹΑΓࢀরεϧʔϓοτΛεέʔϧΞτ • దͳཻͰσʔλϕʔεΛׂ͢Δ • ׂͤͣʹεέʔϧΞοϓ͢Δ͜ͱߟ͑Δ • ඞཁҎ্ʹׂ͠ͳ͍ •
ॲཧ͕ෳࡶʹͳΔͱαʔϏεશମͱͯ͠ΈΔͱ εέʔϥϏϦςΟ͕Լ͍ͯ͠Δ͜ͱ͋ΓಘΔ
ԆΛখ͘͢͞Δʹ • εέʔϧΞοϓʹݶք͕͋Δ • CPUͷपߴࢭ·Γ(FPGAͱ͔ͦ͠͏) • ϝϞϦͷΞΫηεΛ͑Δ͜ͱ͍͠ • ͨ͘͞ΜͷσʔλΛಡΈࠐΊ(ॲཧ͢Ε) ͦΕ͚͕͔͔ͩ࣌ؒΔ
• ԆΛখ͘͢͞Δʹॲཧ͢ΔσʔλྔΛগͳ͘͢Δ
ΠϯσοΫεΛ͏ • ୳ࡧ͢ΔσʔλྔΛগͳ͘͢Δ • ΠϯσοΫε͕ͳ͍߹: ઌ಄͔Βॱʹ୳ࡧ ! ! ! •
ΠϯσοΫε͕͋Δ߹: B+πϦʔͷ୳ࡧͷΈ ID title 20 2000 21 2000 22 2000 : : 20 21 22 … …
ΠϯσοΫε͕ΘΕ͍ͯΔ͔ௐΔ • EXPLAINΛ࣮ߦ͢Δ εϥΠυ࡞ΓΕͨ
ύʔςΟγϣχϯάΛ͏ ID title 20 2000 21 2000 22 2000 :
: • σʔλ͕֨ೲ͞Ε͍ͯΔςʔϒϧ͚ͩΛ୳ࡧ͢Εྑ͍ • 10,000݅ʹׂͨ͠Βઌ಄୳ࡧͯ͠࠷େ10,000݅ ID title 10000 10001 10002 : : ID͕֨ೲ͞Ε͍ͯΔ ςʔϒϧ͚ͩ୳ࡧ
͜͜·Ͱͷ·ͱΊ
Database • σʔλϕʔεͷεϧʔϓοτΛ͋͛Δʹ • ࢀরׂʹΑΓࢀরεϧʔϓοτΛεέʔϧΞτ • దͳཻͰσʔλϕʔεΛׂ͢Δ • σʔλϕʔεͷԆΛগͳ͘͢Δʹ •
୳ࡧ͢ΔσʔλྔΛগͳ͘͢Δ: ΠϯσοΫεΛ͏ • ୳ࡧ͢Δσʔλྔ͕গͳͯ͘ࡁΉΑ͏ʹͪΌΜͱ ߟ͑ͯઃܭ͢Δ
Contents Delivery
Contents Delivery • pixivͷը૾৴Ϋϥελ • ը૾৴ͷεϧʔϓοτΛ͋͛Δʹ • ը૾৴ͷԆΛগͳ͘͢Δʹ
pixivͷը૾৴ • pixivͷϝΠϯίϯςϯπը૾ • ϦΫΤετͷେը૾ϑΝΠϧ • ը૾͕දࣔ͞Εͳ͍ͱϢʔβʔΤΫεϖϦΤϯε͕ େ͖͘Լ͢Δ • ߴʹ҆ఆͯ͠େྔͷը૾Λ৴͢ΔΈ͕ඞཁ
Images HTML Static
pixivͷը૾৴ • େྔͷը૾ϑΝΠϧ • ΦϦδφϧը૾: 40TB • αϜωΠϧͷछྨ: 20छྨҎ্ •
1ຕ͝ͱͷαΠζ • ฏۉ: 60KB (95ˋλΠϧ: 300KB) • ࠷େ: 15MB
pixivͷը૾৴ • େྔͷϦΫΤετ • ϦΫΤετ: ͍͍ͩͨ15,000 req/s • సૹྔ: ࠷େ
14Gbps
ը૾৴Ϋϥελ • pixivͰCDNΛ͍ͬͯͳ͍ • ΘΓʹಠࣗͷCDNͷΑ͏ͳΈΛ͍࣋ͬͯΔ • ճઢඅ༻ΫϥυΑΓΦϯϓϨͷํ͕҆Ձ • Ωϟογϡώοτ95% •
ϩϯάςʔϧͳͷͰେ༰ྔͷΩϟογϡ͕ඞཁ • ఘΊ͍ͯΔ͜ͱ • ཧతͳεέʔϥϏϦςΟ
ը૾৴Ϋϥελ 6GbpsΛ͘͞ΦϨΦϨCDNߏஙज़ http://www.slideshare.net/semind/20101220-pixiv-techmeeting-6267332
ը૾৴Ϋϥελ • ωοτϫʔΫ • 1GbpsͷճઢͰશવΓͳ͍ • ͨ͘͞ΜଋͶΔͱภΓ͕ͰͨΓཧ͕໘ • 10GbpsͷճઢΛ4ຊଋͶ͍ͯͬͯΔ •
αʔό • ݱࡏ40͘Β͍
ը૾৴Ϋϥελ 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
Consistent Hashing • URLΛΩʔʹͯ͠Hashing͢Δ • ΩϟογϡΛෳʹεέʔϧΞτͰ͖Δ • શτϥϑΟοΫͷ95%ΛΩϟογϡͰԠͰ͖Δ TrafficServer Cache
TrafficServer Cache TrafficServer Cache Hash table Hash table Hash table
• 1ϥοΫʹ࠷େͰ49 • εΠονؒͷτϥϑΟοΫ͕٧·Δ(ࠓ10G͔ͩΒେৎʁ) • 1ஈͷΩϟογϡͰશτϥϑΟοΫͷ50%Λฦ͢ 2ஈΩϟογϡͷཧ༝ (1) switch L3
Switch 49U 1Gbps 1Gbps switch
• ϦΫΤετ͕ಛఆΩϟογϡαʔόʹภΔ • ਓؾͷը૾͕ϋογϯά͞ΕΔαʔό͚ͩߴෛՙ • ϝϞϦΩϟογϡͰਓؾ͕͋Δը૾ΛΩϟογϡ 2ஈΩϟογϡͷཧ༝ (2) Server A
Server B Server C Server A Server B Server C Cache
͜͜·Ͱͷ·ͱΊ
Contents Delivery • ը૾৴ͷεϧʔϓοτΛ͋͛Δʹ • εέʔϧ͢ΔΩϟογϡΫϥελΛઃܭ͢Δ • Ωϟογϡ༰ྔͱτϥϑΟοΫʹؾΛ͚ͭΔ ! •
ϨΠςϯγ • Ϥʔϩούʹຊ͔Βʹߴʹసૹ͢Δͷແཧ • ෦తʹCDNΛݕূ͍ͯ͠Δ
ϩάΛ׆༻͢Δ
ϩάΛ׆༻͢Δ • ϩάσʔλଟ͚Εଟ͍ํ͕ྑ͍ Application Load Balancer Database ΞΫηεϩά Πϕϯτϩά εϩʔΫΤϦϩά
ੜσʔλ Τϥʔϩά ΞΫηεϩά • ϦΫΤετͨ͠URL • ૹ৴ݩIPΞυϨεɺUA • ϨεϙϯελΠϜ • ϦΫΤετॲཧ࣌ؒ ! Πϕϯτϩά • Ϣʔβ͕ߦͬͨΠϕϯτͷৄࡉใ • POSTϦΫΤετͷதΞΫηεϩάʹؚ·Εͳ͍
άϩʔεͷͨΊʹ • ΞΫςΟϒϢʔβʔͷಈΛௐࠪ͢Δ • ֤ػೳ͕ͲΕ͚ͩΘΕ͍ͯΔ͔ௐࠪ͢Δ • ػೳվमʹΑͬͯͲͷΑ͏ͳมԽ͕ى͔ͬͨ͜ௐΔ
։ൃऀͷͨΊʹ • ػೳվमʹΑͬͯͲͷΑ͏ͳมԽ͕ى͔ͬͨ͜ௐΔ • ຊ൪ڥͰى͍ͬͯ͜ΔΤϥʔΛѲ͢Δ • ຊ൪ڥͰԆͷݪҼʹͳ͍ͬͯΔͷΛಛఆ͢Δ
ϩάܗࣜΛબͿ • ςΩετܗࣜ • ίϚϯυϥΠϯͰૢ࡞͍͢͠ • ߦϕʔεͰ͋Δ • awk/cutϫϯϥΠφʔͰܗ͍͢͠ •
σʔλྔ͕େ͖͘ͳΒͳ͍
pixivͰ͍ͬͯΔϩάܗࣜ • TSV: λϒ۠Γ • JSON: վߦ͖JSON • ݸਓతʹॱ൪ΛΑ͘ΕΔͷͰLTSV͕͖
• Ұ୴ϑΝΠϧʹॻ͖ग़ͯͦ͠ΕΛผϓϩηε͕ಡΈࠐΉ • ϩάͷ෮چɺઃఆมߋ͕͍͢͠ • ग़ྗઌΛ૿ͨ͠ͱ͖աڈͷϩάΛΠϯϙʔτͰ͖Δ FluentdʹΑΔϩάసૹ Fluentd Files Application
Load Balancer Database ΞΫηεϩά Πϕϯτϩά εϩʔΫΤϦϩά ੜσʔλ Τϥʔϩά BigQuery ! Elasticsearch ! MongoDB Fluentd
Google BigQuery • Google͕ఏڙ͍ͯ͠ΔղੳϓϥοτϑΥʔϜ • SQLͰԯ݅ͷղੳ͕ेඵͰͰ͖Δ • ઍͷαʔόʹࢄ͞ΕͷྗʹΑͬͯܭࢉ͞ΕΔ • Google
Analytics Premiumʹೖ͍ͬͯΔͱ Google AnalyticsͷੜϩάΛղੳग़དྷΔ
Kibana
Kibana • Elasticsearchʹ֨ೲͨ͠σʔλΛղੳ͢Δπʔϧ • ΫϥΠΞϯταΠυͷJavaScript͚ͩͰಈ࡞͢Δ • ࠇ͍ը໘͕ਓؾ͚ͩͲpixivͰന͕ਓؾ elasticsearch EFK
Stack REST API Output
• ͯ͢ͷΤϥʔΛ1͝ͱʹ·ͱΊͯ௨ • େྔͷΤϥʔΛ௨͢Δνϟϯωϧ͋Δ Idobataʹ௨
ՄࢹԽΛߦ͏ʹ • ·ͣ؆୯ʹՄࢹԽͰ͖Δͱ͍͏ࣄ࣮Λͭ͘Δ • ը໘ΛݟΔจԽΛ͔ࠜͤΔ • ՄࢹԽ͢ΔจԽ͕ҰൠతʹͳΕෆຬ͕ग़ͯ͘Δ • ͋·Γίετ͔͚ͳ͍ •
తΛܾఆ͢Δલʹಋೖ͢Δඞཁ͕͋Δ • ·ͣࣾίετΛΘͣʹ֎෦ͷϦιʔεΛ͏
͜͜·Ͱͷ·ͱΊ
ϩάΛ׆༻͢Δ • ϩάΛՄࢹԽ͢ΔจԽΛ͔ࠜͤΔ • ՄࢹԽ͢ΔจԽ͕͋ΕϩάΛͪΌΜͱग़ྗͯ͘͠ΕΔ Α͏ʹͳΔͣ
·ͱΊ
これまで3つのプロダクト(広告配信、pixiv、BOOTH)の話を聞 いて、それぞれのプロダクトにどのような技術を使われている か、なぜその技術が使われているか、何を考えて設計されてい るか、そのようなことについて思いを巡らせてみたかと思います。 どのサービスもそれぞれのバックグラウンドを持っており、そし て、現在稼働しているサービスがあります。それぞれのサービス で使われている技術はばらばらだし、1つ1つの技術にそれなり に理由があったり、特になかったりします(動いているのは正義 です)。みなさんもプロダクトをつくったりしたことがあれば、特 に理由もなく新しい技術を採用したりすることもあると思います。
さて、設計の話はそろそろ飽きたと思うので、今日は運用してい く上で必要な技術の話をしました。運用していく上で、どのよう なことを考えれば良いかについて話しました。運用していく上で どのようなことを考えれば良いか、その一助になれば幸いです。
·ͱΊ • ࣈΛܭଌ͢Δ׳शΛ͚Δ • େنαʔϏεͰϦιʔε͋ͨΓͷεϧʔϓοτ͕ ॏཁʹͳΔ • ࢥ͍ࠐΈͰߦಈͤͣʹ͔ͳΒͣܭଌͯ͠࠷దԽ͢Δ • ࣄͷਐΊํಉ͡