ゼロから始めた Gunosyアドサーバ開発運用記 / 2014-12-16-dots

ゼロから始めた Gunosyアドサーバ開発運用記 / 2014-12-16-dots

地雷の話

6e8d1cd646b7cc589fdd5bdea0fd9bf1?s=128

shunsukeaihara

December 16, 2014
Tweet

Transcript

  1. θϩ͔Β࢝Ίͨ GunosyΞυαʔό։ൃӡ༻ه גࣜձࣾGunosy ҄൧ݪढ़հ

  2. ࣗݾ঺հ • ҄൧ݪढ़հ (http://argmax.jp) • Gunosy։ൃຊ෦ Ϛωʔδϟʔ • ޿ࠂ഑৴γεςϜͷ։ൃશମͱR&DܥΛ୲౰ •

    ઐ໳: ܭࢉݴޠֶ • Pythonͱඇಉظ෼ࢄγεςϜΛ޷Ή • ը૾ॲཧɾԻ੠৴߸ॲཧͰ͍Ζ͍ΖϥΠϒϥϦ࡞ͬͯΔ • https://bitbucket.org/aihara
  3. ɹɹGunosy Ads • χϡʔεΩϡϨʔγϣϯΞϓϦͷάϊγʔ಺ͷ޿ࠂ • ೖߘ͔Β഑৴·Ͱ׬શࣗࣾ੡ • ޿ࠂೖߘγεςϜҎ֎͸΄΅Python੡ • ࠷ۙscalaͱgo͕ೖ͖ͬͯͨ

    • End-to-EndͷRTBγεςϜ • ΞυωοτϫʔΫ΋࢝Ίͨ • iOS, Android, JS, Titanium޲͚SDKΛఏڙ
  4. Ξυαʔό͸૯߹֨ಆٕ • ECPM(ऩӹੑ)Λ૿େͤ͞Δ༧ଌΞϧΰϦζϜͷߏங • CPA(ސ٬֫ಘ୯Ձ)Λ௿͘཈͑ͯ޿ࠂΛܧଓ • Ϣʔβʹͱͬͯ΋༗ӹͳ޿ࠂ৘ใΛ഑৴ • େن໛σʔλΛ҆ఆ/ߴ଎ʹॲཧ͠ϩδοΫʹ൓ө •

    50ms or Die
  5. Gunosy Adsαʔόߏ੒  2360 19(!%-7     

     +#4/     ,:*'&5.8   MySQL +#$)"
  6. Ξυαʔό։ൃͷجຊελϯε • ࠷ۙ·Ͱ޿ࠂ഑৴ΤϯδχΞ͸2໊ • AWSͰ༗Δ͜ͱΛ࠷େݶ׆༻ • TimeϕʔεͷϓϩϏδϣχϯά + େྔͷcold standby

    • ӡ༻ɾࢮ׆؂ࢹ͸ՄೳͳݶΓࣗಈԽ • αʔό૿΍͢ΑΓνϡʔχϯά(ශ๡ੑ) • ແବʹଟ͍KPI Tool
  7. ͜ͷҰ೥ΛৼΓฦΔ

  8. 1೥ͰGunosyϢʔβ਺͸10ഒ ޿ࠂ഑৴ྔ͸਺ઍഒʹ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ਓ

    ਓ ݄ ݄ ݄ ݄ ݄ ࠓ μ΢ϯϩʔυ਺ ΞυΤϯδχΞਓ਺      
  9. ͸͡Ί͸਺୆ͷαʔόͩͬͨ • Python(Tornado)੡ͷ഑৴αʔό • ΦϯϥΠϯֶश/όϯσΟοτͰCTRਪఆ • Redisʹ഑৴σʔλΛ͢΂ͯ౤ೖ • RDB͸Ұ੾ݟͳ͍ •

    MongoDBʹtd-agentͰϩάΛ౤ೖ • Capped Collectionʹ౤ೖ Redis MongoDB (Log Collector) Batch Server MySQL MySQL ഑৴αʔό
  10. スパイキーなアクセスで サーバが死ぬ ϢʔβͷੵΈ͕ΓͰ λΠϚʔϕʔεͷఆ࣌1VTI͕໰୊ʹ

  11. ࠷ॳͷ໰୊͸CPUό΢ϯυ • ΞυαʔόΛTimeϕʔεͰϓϩϏδϣχϯά • ॏ͍ܭࢉΛAPIαʔόͰ͢Δͷ͕ؒҧ͍ • ϦΞϧλΠϜͷ౷ܭ஋Λଈ࣌൓ө͢ΔΑ͏ͳσʔλूܭ ܥͱόονܥΛߏங • ਺෼୯ҐͰ΋͘͘͞͞ճΔϨϕϧ

    ! • ͜ͷλΠϛϯάͰϕʔε͕΄΅׬੒
  12. ·ͩ·ͩτϥϒϧ΋ָ͍࣌͠ظ • ΄΅ϓϩτλΠϓͷ͓΋ͪΌΈ͍ͨͳ෺ͩͬ ͨͷͰ഑৴ϩδοΫपΓͷνϡʔχϯάָ͕ ͍͠ • αʔό૿΍͢ΑΓ͸ϒϥογϡΞοϓ • ΞΫηε਺΋ച্΋·ͩ·ͩ

  13. ウルトラマン来襲

  14. CMͷ։࢝ʹΑΓDAU͕ര૿

  15. ਓ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ݄

    ݄ ݄ ݄ ݄ ࠓ μ΢ϯϩʔυ਺ ΞυΤϯδχΞਓ਺       ͜ͷ͋ͨΓ
  16. Ϣʔβ΋޿ࠂ࿮΋૿͍͑ͯ͘ • ऩӹ΋૿͑ͯઈରʹࢭΊΒΕͳ͘ͳΔ… • ΦʔσΟΤϯεσʔλ͕RedisʹࡌΓ੾Βͳ͍ • Slave͕OOMͰࢮΜͩΓ • ΞΫηεͷεύΠΫ͸ΑΓܹ͘͠Redis͕٧·Γ࢝ΊΔ •

    MongoͷCapped Collectionʹ͸1೔෼͢Β৐Βͳ͘ͳ Δ
  17. Redisͷߏ੒Λมߋ • ͢΂ͯͷΞΫηεʹڞ௨͢Δσʔλ(޿ࠂͷ৘ใ/୯Ձ ౳)ΛS3ܦ༝Ͱશαʔόʹ͹Β·͍ͯReadΛ࡟ݮ • Redis͕མͪͯ΋࠷௿ݶͷ഑৴͕Ͱ͖ΔΑ͏ʹͳͬͨ ! ! !

  18. Redisͷߏ੒Λมߋ • σʔλछຖͷਨ௚෼ࢄ • twemproxyೖΕͯ΋σʔλྔ૿Ճ࣌ͷϝϯςφϯεෛ ՙ͸มΘΒͳ͍ͷͰਨ௚෼ࢄ / αΠζΞοϓͰରԠ • Riakݕ౼΋ɺ౰࣌͸ίετ໘Ͱબఆ͔Β֎Εͨ

    ! ! ϢʔβຖͷӾཡཤྺ Ϣʔβͷηάϝϯτσʔλ ޿ࠂຖͷ഑৴ύϥϝʔλ ΫϥΠΞϯτ͕σʔλछຖʹ 3FEJTαʔό੾Γସ͑   
  19. ूܭDBΛRedshiftʹ • fluent-plugin-redshiftʹύονΛ͋ͯͯϩάΛ ൒ϦΞϧλΠϜʹRedshiftʹ౤ೖ • ͱΓ͋͑ͣRedshiftʹೖΕΔͱָͰ͖Δ と思っていた……

  20. アドネットワーク開始で 広告枠とログデータが爆発 Redshiftは死ぬ

  21. ࿮͕૿͑ͯόον΋૿͑ͨ • Pythonͷ෼ࢄTask-Queue(Celery)ϥΠϒϥϦͰ΄΅ແ վ଄Ͱ෼ࢄॲཧԽ • ႈ౳Ͱ૬ޓͷঢ়ଶʹґଘ͕ແ͍όονΛ࡞Δ • numpy, scipy, pandas,

    scikits౳ͷΤίγεςϜ͕ͦͷ··࢖͑Δ Amazon SQS ɾ
 ɾ
 ɾ Celery Workers Django-Celery
  22. Redshift͕٧·Γग़͢ • Redshift͸ूܭର৅ςʔϒϧ͕ϝϞϦʹ৐Βͳ ͘ͳΔͱ్୺ʹ஗͘ͳΔ • Ϋϥελ਺૿ / ΠϯελϯεมߋରԠग़དྷΔ͚ Ͳߴ͗ͯ͢ROI͕߹Θͳ͘ͳͬͯ͘Δ •

    dw2.8xlargeߴ͗͢ • ੴ༉ԦͳΒdw2.8xlargeΫϥελΛ࢖͓͏
  23. • Redshift͸͋͘·ͰσʔλϚʔτ • ఆৗूܭʹඞཁͳϝϞϦʹ৐Γ੾Δσʔλ ͷΈtemporalͳςʔϒϧʹ৐ͤΔ • ൒ࣗಈͰఆظϩʔςʔγϣϯ ϝϞϦʹ৐Βͳ͍Ϗοάσʔλ is ෆཁ

  24. ϝϞϦʹ৐Βͳ͍Ϗοάσʔλ is ෆཁ • ඇఆظతͳ෼ੳ͸Sparkʹ • ශऀͷຯํEMR on Spot Instance

    • ΞυϗοΫͳ෼ੳͱ͔ճؼϞσϧߏங͸Spark Λར༻ • શϩάूܭ͸ImpalaͰ(ΦϯϝϞϦ͡Όͳ͍͚Ͳ)
  25. DAU積み上がりと 記事タイトル付きPushで さらなるスパイクが…

  26. ਓ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ਓ ݄

    ݄ ݄ ݄ ݄ ࠓ μ΢ϯϩʔυ਺ ΞυΤϯδχΞਓ਺       ͜ͷ͋ͨΓ
  27. ࣾ಺ͷผαʔϏεͷվળͷӨڹ͕… • Pushͷهࣄબ୒ΞϧΰϦζϜͷվྑͰϢʔβ ͷ։෧཰͕େ෯޲্ • Remote Pushܥஔ͖׵͑Ͱ਺ඦສ݅1෼ҎԼͰ Delivery • APIαʔόͷεϧʔϓοτ͕վળ

    • Ξυαʔό΁ͷϦΫΤετ਺΋ര૿ • Too Slow To Die
  28. ͞Α͏ͳΒRedis͞Μ • Redisʹର͢ΔR/WΛͻͨ͢Β࡟ݮ • ΞΫςΟϒͳϢʔβ͚ͩ͸ϑΝΠϧDBʹͯ͠શ୆ʹ഑෍ • temporalͳσʔλΛͳͯ͘͠Statelessͳ഑৴ϩδοΫʹมߋ • Redisͱͯ΋ͭΒ͍͚Ͳ·ࣺͩͯΒΕͯͳ͍ •

    RiakͱMemcachedͷೋஈߏ੒͔Aerospikeͷٕज़ݕ౼ • Ͳͬͪʹͯ͠΋ͭΒ͍
  29. ݟ͑ͯΔ஍ཕΛશͯ౿Έൈ͍ͯࠓʹࢸΔ  2360 19(!%-7      

    +#4/     ,:*'&5.8   MySQL +#$)"
  30. ·ͱΊ • Ұ೥ؒͰ͍͖ͳΓαʔϏε͕େ͖͘ͳΔͱ • ເͷٕज़͸ແ͍ͱ͍͏͜ͱ͕਎ʹ͠ΈΔ • ച্΁ͷϓϨογϟʔ͕ͭΒ͘ͳͬͯ͘Δ • ͦͷ෼ී௨ग़དྷͳ͍ܦݧ͕ੵΊΔ •

    GunosyͰ͸Python,Scala, Golang͕޷͖ͳΤϯδ χΞ͕޷͖উख΍ͬͯΔͷͰ༡ͼʹདྷ͍ͯͩ͘͞