Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Growing Service

Harukasan
September 11, 2014

Growing Service

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

Harukasan

September 11, 2014
Tweet

More Decks by Harukasan

Other Decks in Technology

Transcript

  1. 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;’
  2. pixiv ブックマーク フォロー フォロー新着 小説フォ ロ ー 新 着  お す す め

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

    Archit. News 18, 4, 18-21.
 DOI=10.1145/121973.121975 “͜ͷ࿦จʹ͓͍ͯɺࢲ͸Scalabilityͷ༷૬ʹ͍ͭͯௐࠪͨ͠ɻ͔͠͠ͳ͕ Βɺ༗༻Ͱݫ֨ͳఆٛΛݟ͚ͭΔ͜ͱ͸ग़དྷͳ͔ͬͨɻࢲ͸γεςϜ͕ ʮ”Scalable”Ͱ͋Δʯ͜ͱ͸ɺʮ”Modern”Ͱ͋Δʯͱಉ͘͡Β͍ศརͳ ݺͼํͱͯ͠࢖ΘΕ͍ͯΔͱஅݴ͢Δɻࢲ͸ɺٕज़ίϛϡχςΟʹର͠ɺ ݫ֨ͳఆٛΛఆٛ͢Δ͔ɺ͜ͷ༻ޠΛ࢖͏ͷΛ΍ΊΔ͜ͱΛਪ঑͢Δɻ”
  4. Scale up / Scale out • ฒྻ਺Λ૿΍͢ʹ͸: ෳ਺ͷαʔόʹॲཧΛৼΓ෼͚Δ • ஗ԆΛখ͘͢͞Δʹ͸:

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

    εέʔϧΞοϓ • ͓ۚΛ͔͚Ε͹Ͳ͏ʹ͔ͳΔΑ͏ʹ͓ͯ͘͠ • εέʔϧΞ΢τ • ෼ࢄͰ͖Δߏ੒͚ͩͭͬͯ͘͠·͑͹૿΍ͤΔ • ୆਺͕ଟ͘ͳΕ͹ଟ͘ͳΔ΄Ͳਏ͘ͳΔ
  6. — Rob Pike. 1989. “Notes on Programming in C”. “Rule

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

    2. ܭଌͤΑɻܭଌ͢Δ·Ͱ଎౓ͷͨΊͷνϡʔχϯάΛͯ͠͸ͳΒͳ͍ɺ ίʔυͷҰ෦͕࢒Γͷ෦෼Λѹ౗͠ͳ͍ͷͰ͋Ε͹ͳ͓͞ΒͰ͋Δɻ”
  8. CPU • PCͰ͸ܭࢉҎ֎ʹશମͷ੍ޚ΋CPU͕ߦ͍ͬͯΔ • ྫ͑͹IOΛ଴͍ͬͯΔؒ͸ଞͷܭࢉ͕ग़དྷͳ͍ • ͲΕ͚ͩCPUΛ࢖༻͔ͨ͠Λܭࢉ࣌ؒͰࣔ͢ • 1࣌ؒͰ1࣌ؒ෼ܭࢉ࣌ؒΛ࢖͏ =

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

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

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

    ϨΠςϯγ: ωοτϫʔΫ͸஍ཧతϨΠςϯγ͕େ͖͍ • ౦ژ-χϡʔϤʔΫ: 150ms • ϙʔτ਺: TCP/IPͰ͸࠷େ65,535ݸ • TCPͰ͸ϙʔτΛόΠϯυ͠ͳ͍ͱૹड৴͕Ͱ͖ͳ͍
  12. top

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

    • ύέοτ͕͢΂ͯϩʔυόϥϯαΛܦ༝͢Δ • DSRํࣜ: • ෮࿏͕ϩʔυόϥϯαΛܦ༝͠ͳ͍ • Ϩεϙϯεͷσʔλྔ͕ଟ͍ͷͰ
 ϩʔυόϥϯαͷτϥϑΟοΫΛେ෯ʹݮΒͤΔ
  14. ิ଍εϥΠυ 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ʹ͓ͯ͘͠
  15. ิ଍εϥΠυ • 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
  16. ิ଍εϥΠυ DSRͷར఺ͱܽ఺ • ར఺ • ϩʔυόϥϯαΛܦ༝͢Δσʔλྔ͕গͳ͘ͳΔͷͰɺ ϩʔυόϥϯαͷτϥϑΟοΫΛ཈͑Δ͜ͱ͕ग़དྷΔ • ܽ఺ •

    ϩʔυόϥϯαͱDBΛಉ͡ωοτϫʔΫʹ഑ஔ͢Δ
 ඞཁ͕͋Δ • ωοτϫʔΫΛ௒͑Δ͜ͱ͕ग़དྷΔٕज़΋͋Δ:L3DSR
 (pixivͰ͸࢖͍ͬͯΔͷ͸௒͑ΒΕͳ͍L2DSR)
  17. ิ଍εϥΠυ WebΞϓϦέʔγϣϯͷಛ௃ • ߋ৽ॲཧʹൺ΂ࢀরස౓͕ѹ౗తʹଟ͍ • 1೔͋ͨΓͷ࡞඼౤ߘ: 20,000 • 1೔͋ͨΓͷӾཡճ਺: 100,000,000

    • େن໛WebΞϓϦέʔγϣϯͰ͸ࢀর෼ׂ͕༗ޮͳ৔߹͕ଟ͍ クエリ 頻度 SELECT 多い INSERT 少ない UPDATE 少ない DELETE 非常に少ない
  18. νϡʔχϯάͷҧ͍ イラスト・ユーザ情報 ブックマーク σʔλྔ 少ない 多い ࢀরස౓ 多い 比較的少ない νϡʔχϯά

    Slave͕ଟ͍
 ϝϞϦ͸গͳΊ Slave͸গͳ͍
 ϝϞϦ౥ࡌྔ͕ଟ͍ ίετ ୆਺͸ଟ͍͚Ͳ1୆1୆͸ ௿εϖοΫͰ௿ίετ ୆਺͸গͳ͍͚Ͳ
 1୆͋ͨΓͷ஋ஈ͸ߴ͍           
  19. ਨ௚෼ׂͱਫฏ෼ׂ • ਨ௚෼ׂ:ྻຖʹ(·ͨ͸ςʔϒϧ୯ҐͰ)෼ׂ • ਫฏ෼ׂ:ߦຖʹ෼ׂ イラスト情報 ユーザー情報 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    ਫฏ෼ׂ ਨ௚෼ׂ   
  20. ΠϯσοΫεΛ࢖͏ • ୳ࡧ͢ΔσʔλྔΛগͳ͘͢Δ • ΠϯσοΫε͕ͳ͍৔߹: ઌ಄͔Βॱʹ୳ࡧ ! ! ! •

    ΠϯσοΫε͕͋Δ৔߹: B+πϦʔͷ୳ࡧͷΈ ID title 20 2000೥ 21 2000೥ 22 2000೥ : : 20 21 22 … …
  21. ύʔςΟγϣχϯάΛ࢖͏ ID title 20 2000೥ 21 2000೥ 22 2000೥ :

    : • σʔλ͕֨ೲ͞Ε͍ͯΔςʔϒϧ͚ͩΛ୳ࡧ͢Ε͹ྑ͍ • 10,000݅ʹ෼ׂͨ͠Βઌ಄୳ࡧͯ͠΋࠷େ10,000݅ ID title 10000 10001 10002 : : ID͕֨ೲ͞Ε͍ͯΔ
 ςʔϒϧ͚ͩ୳ࡧ
  22. ը૾഑৴Ϋϥελ 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
  23. ϩάΛ׆༻͢Δ • ϩάσʔλ͸ଟ͚Ε͹ଟ͍ํ͕ྑ͍ Application Load Balancer Database ΞΫηεϩά Πϕϯτϩά εϩʔΫΤϦϩά

     ੜσʔλ  Τϥʔϩά ΞΫηεϩά • ϦΫΤετͨ͠URL • ૹ৴ݩIPΞυϨεɺUA • ϨεϙϯελΠϜ • ϦΫΤετॲཧ࣌ؒ ! Πϕϯτϩά • Ϣʔβ͕ߦͬͨΠϕϯτͷৄࡉ৘ใ • POSTϦΫΤετͷத਎͸ΞΫηεϩάʹ͸ؚ·Εͳ͍
  24. • Ұ୴ϑΝΠϧʹॻ͖ग़ͯͦ͠ΕΛผϓϩηε͕ಡΈࠐΉ • ϩάͷ෮چɺઃఆมߋ͕͠΍͍͢ • ग़ྗઌΛ૿΍ͨ͠ͱ͖աڈͷϩάΛΠϯϙʔτͰ͖Δ FluentdʹΑΔϩάసૹ Fluentd Files Application

    Load Balancer Database ΞΫηεϩά Πϕϯτϩά εϩʔΫΤϦϩά  ੜσʔλ  Τϥʔϩά BigQuery ! Elasticsearch ! MongoDB Fluentd