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
11k
Growing Service
成長するサービス
pixiv SUMMER BOOTCAMP -2014- / 2014-09-08
Harukasan
PRO
September 11, 2014
Tweet
Share
More Decks by Harukasan
See All by Harukasan
pixivを支える技術 / 技育CAMPアカデミア
harukasan
PRO
3
260
20240401 新卒研修 - ピクシブにおける技術領域
harukasan
PRO
1
610
ピクシブのコンテンツ配信基盤技術 / pixiv TECH SALON
harukasan
PRO
5
5.2k
Goにおける画像ファイル処理 / golang.tokyo #19
harukasan
PRO
7
6.3k
WebRTC動画をトランスコードする / Transcoding video streams from WebRTC
harukasan
PRO
5
1.4k
ImageFluxを支えるリモート開発 / 20171202
harukasan
PRO
2
1.7k
YAPC::Fukuoka 前夜祭LT / Yet Another Pawoo Commit logs
harukasan
PRO
0
2.8k
YAPC::Fukuoka lunch session
harukasan
PRO
1
2.9k
マストドン会議: Pawoo / Mastodon Kaigi2
harukasan
PRO
2
420
Other Decks in Technology
See All in Technology
ペパボのオブザーバビリティ研修2024 説明資料
kesompochy
0
1.1k
[NIKKEI Tech Talk]Bias for Action!! 実践から学ぶための仕組とコミュニティ / Community for Practice and Learning
kanamasa
0
280
RAGのサービスをリリースして1年3ヶ月が経ちました
segavvy
4
960
運用改善、不都合な真実 / 20240722-ssmjp-kaizen
opelab
17
8.4k
GoとアクターモデルでES+CQRSを実践! / proto_actor_es_cqrs
ytake
1
160
サーバーレスAPI(API Gateway+Lambda)とNext.jsで 個人ブログを作ろう!
shuntaka
PRO
0
560
データ分析基盤を作ってみよう~設計編~
nrinetcom
PRO
1
110
AWS IAMのアンチパターン/AWSが考える最低権限実現へのアプローチ概略(JAWS-UG朝会#59資料改修20分版)
htan
0
330
Matterport を使ってクラスメソッド各拠点のバーチャルオフィスツアーを作成してみた
wakatsuki
0
160
ギークの理想が7つ集まるエムスリーで夢を叶えよう - エムスリー株式会社
m3_engineering
1
260
AIエージェントを現場に導入する目線とは
masahiro_nishimi
1
1.5k
[NIKKEI Tech Talk] KDDI/KAG Scrum & Community for Engineering Training
curanosuke
2
220
Featured
See All Featured
In The Pink: A Labor of Love
frogandcode
139
22k
Learning to Love Humans: Emotional Interface Design
aarron
269
39k
Building Flexible Design Systems
yeseniaperezcruz
323
37k
10 Git Anti Patterns You Should be Aware of
lemiorhan
652
58k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
Imperfection Machines: The Place of Print at Facebook
scottboms
262
13k
Fontdeck: Realign not Redesign
paulrobertlloyd
79
5.1k
Rebuilding a faster, lazier Slack
samanthasiow
78
8.5k
How GitHub (no longer) Works
holman
305
140k
YesSQL, Process and Tooling at Scale
rocio
166
14k
Building Applications with DynamoDB
mza
89
5.8k
Stop Working from a Prison Cell
hatefulcrawdad
266
20k
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つの技術にそれなり に理由があったり、特になかったりします(動いているのは正義 です)。みなさんもプロダクトをつくったりしたことがあれば、特 に理由もなく新しい技術を採用したりすることもあると思います。
さて、設計の話はそろそろ飽きたと思うので、今日は運用してい く上で必要な技術の話をしました。運用していく上で、どのよう なことを考えれば良いかについて話しました。運用していく上で どのようなことを考えれば良いか、その一助になれば幸いです。
·ͱΊ • ࣈΛܭଌ͢Δ׳शΛ͚Δ • େنαʔϏεͰϦιʔε͋ͨΓͷεϧʔϓοτ͕ ॏཁʹͳΔ • ࢥ͍ࠐΈͰߦಈͤͣʹ͔ͳΒͣܭଌͯ͠࠷దԽ͢Δ • ࣄͷਐΊํಉ͡