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

hoscon2016-shibuya-takumakume

Takuma Kume
October 29, 2016

 hoscon2016-shibuya-takumakume

ホスティングにおける柔軟かつ軽量なアクセス制御の必要性とその実装
---
GMOペパボ株式会社
ホスティング事業部インフラエンジニア 久米 拓馬 @takumakume

ホスティングサービスは色々なお客様のデータをお預かりしている性質上、様々なプログラムが動作し刻一刻と負荷状況が変動します。我々は多くのお客様に安定的にサービスをご利用いただくために、その変化に対応できる柔軟な負荷コントロールを行う必要がありました。本セッションでは、パフォーマンス劣化を最小限に抑えつつ、アクセス先ファイルや時間帯に応じて柔軟なアクセスコントロールをmrubyを用いて実現しサービスに導入しましたのでご紹介します。

Takuma Kume

October 29, 2016
Tweet

More Decks by Takuma Kume

Other Decks in Technology

Transcript

  1. 

  2.     ࣌ ࣌ ࣌ ࣌ ࣌ ࣌

    ࣌ ࣌ ࣌ ͋ΔαʔόͷϦιʔεফඅྔ <> 
  3.     ࣌ ࣌ ࣌ ࣌ ࣌ ࣌

    ࣌ ࣌ ࣌ શମ ͋ΔαʔόͷϦιʔεফඅྔ <>  ಛఆͷϑΝΠϧ ఆظతʹॏ͍ॲཧ͕࣮ߦ͞Ε͍ͯͨ
  4.     ࣌ ࣌ ࣌ ࣌ ࣌ ࣌

    ࣌ ࣌ ࣌ શମ ͋ΔαʔόͷϦιʔεফඅྔ <>  ಛఆͷϑΝΠϧ ಛఆͷϑΝΠϧͷॲཧͰϦιʔεͷ΄ͱΜͲΛফඅ͠ ఆظతʹଞͷ͓٬༷΁ͷαʔϏεఏڙʹࢧোΛ͖͍ͨͯͨ͠ɻ
  5.     ࣌ ࣌ ࣌ ࣌ ࣌ ࣌

    ࣌ ࣌ ࣌ શମ ಛఆͷϑΝΠϧ ղܾํ๏ <>  ෛՙͷߴ͍ϑΝΠϧʹରͯ͠ ࣌ؒࢦఆͰ੍ޚ͢Δ
  6. ಈ࡞֓ཁ   ਌ NSVCZ 8PSLFS NSVCZ 8PSLFS NSVCZ IUUQE

    ڞ༗ϝϞϦ global mutex ಉ࣌઀ଓ਺ Χ΢ϯλʔ KVS ಉ࣌઀ଓ਺Χ΢ϯλʔ localmemcacheΛ༻͍ͨ Key-Value-Store Ωʔͱͨ͠ϦΫΤετύϥϝʔ λΛݩʹಉ࣌ΞΫηε਺ΛΧ ΢ϯτ͢Δɻ global mutex ֤Worker͔Βಉ࣌઀ଓ਺Χ ΢ϯλʔΛૢ࡞͢ΔͨΊෆ੔ ߹͕ൃੜ͠ͳ͍Α͏ʹ౎౓ϩο ΫΛߦ͏ɻ KEY /path/to/hoge.php VALUE 1
  7. ಈ࡞֓ཁ   ਌ NSVCZ 8PSLFS NSVCZ 8PSLFS NSVCZ IUUQE

    ڞ༗ϝϞϦ global mutex ಉ࣌઀ଓ਺ Χ΢ϯλʔ KVS  ϦΫΤετ  ϦΫΤετ  NVUFYΛϩοΫ  MPDL  ϦΫΤετύϥϝʔλΛΩʔ ʹΠϯΫϦϝϯτ  ΠϯΫϦϝϯτ KEY /path/to/hoge.php VALUE 1  VOMPDL  NVUFYΛΞϯϩοΫ
  8. ಈ࡞֓ཁ   ਌ NSVCZ 8PSLFS NSVCZ 8PSLFS NSVCZ IUUQE

    ڞ༗ϝϞϦ global mutex ಉ࣌઀ଓ਺ Χ΢ϯλʔ KVS  ίϯςϯπͷॲཧΛߦ͏  NVUFYΛϩοΫ  MPDL  σΫϦϝϯτ  σΫϦϝϯτ  VOMPDL  NVUFYΛΞϯϩοΫ KEY /path/to/hoge.php VALUE 0  ίϯςϯπͷॲཧ
  9. ػೳ௥ՃΠϝʔδ  ਌ NSVCZ 8PSLFS NSVCZ 8PSLFS NSVCZ IUUQE ڞ༗ϝϞϦ

    global mutex ಉ࣌઀ଓ਺ Χ΢ϯλʔ KVS ੍ޚ৚݅ localmemcacheΛ༻͍ͨ Key-Value-Store ϑΝΠϧͷϑϧύε͕Ωʔ ࠷େಉ࣌઀ଓ਺ ੍ݶΛ༗ޮԽ͢Δ࣌ؒଳ KVS ੍ޚ৚݅
  10. ੍ݶ৚݅ͷσʔλ /path/to/hoge.php { "max_clients" : 30, # ࠷େಉ࣌઀ଓ਺ "time_slots" :

    [ # ༗ޮʹ͢Δ࣌ؒଳ { "begin" : 1200, "end" : 1800 }, { "begin" : 2100, "end" : 2200 } ] } KEY VALUE A Aͷؒ͸AQBUIUPIPHFQIQA΁ͷ ࠷େ઀ଓ਺ΛAA·Ͱʹ੍ݶ͢Δɻ 
  11. ػೳ௥Ճޙͷಈ࡞֓ཁ  ਌ NSVCZ 8PSLFS NSVCZ 8PSLFS NSVCZ IUUQE ڞ༗ϝϞϦ

    global mutex ಉ࣌઀ଓ਺ Χ΢ϯλʔ KVS KVS ੍ޚ৚݅  ϦΫΤετ  ϦΫΤετ  ੍ޚ৚݅ Λࢀর  ੍ޚ৚݅Λࢀর ɹɹଘࡏ͠ͳ͚Ε͹ॲཧऴྃ  NVUFYΛϩοΫ  MPDL  ϑΝΠϧͷϑϧύεΛΩʔʹ ΠϯΫϦϝϯτ  ΠϯΫϦϝϯτ  ΋੍͠ݶ͕༗ޮͳ࣌ؒଳͰಉ ࣌઀ଓ਺੍ݶΛ௒ա͍ͯ͠Ε͹ ΤϥʔΛฦ͢
  12. ࢖͍ํ IUUQEDPOG LoadModule mruby_module modules/mod_mruby.so <IfModule mod_mruby.c> # Apacheͷϓϩηε͕ىಈͨ࣌͠ʹϑοΫ͞ΕΔ #

    http-access-limiterͷΫϥεΛఆٛɺ࣍ʹىಈ͢ΔWorker͕ࢀরͰ͖ΔΑ͏ʹ͢Δɻ mrubyPostConfigMiddle /etc/httpd/conf.d/access_limiter/access_limiter_init.rb cache <FilesMatch ^.*\.php$> # ΞΫηε͕ൃੜͨ͠ͱ͖ʹϑοΫ͞ΕΔ # ಉ࣌઀ଓ਺Χ΢ϯλΛΠϯΫϦϝϯτ͢Δ # ͞Βʹɺ࠷େಉ࣌઀ଓ਺Λ௒աͨ͠৔߹ʹ503ΤϥʔΛฦ͢ͳͲͷΞΫγϣϯΛهड़͢Δɻ mrubyAccessCheckerMiddle /etc/httpd/conf.d/access_limiter/access_limiter.rb cache # ίϯςϯπͷॲཧ͕ऴΘͬͨͱ͖ʹϑοΫ͞ΕΔ # ಉ࣌઀ଓ਺Χ΢ϯλΛσΫϦϝϯτ͢Δ mrubyLogTransactionMiddle /etc/httpd/conf.d/access_limiter/access_limiter_end.rb cache </FilesMatch> </IfModule> 
  13. ։ൃதͷ໰୊఺  ਌ NSVCZ 8PSLFS NSVCZ 8PSLFS NSVCZ IUUQE ڞ༗ϝϞϦ

    global mutex ಉ࣌઀ଓ਺ Χ΢ϯλʔ KVS  ϦΫΤετ  ϦΫΤετ  NVUFYΛϩοΫ  MPDL  ΠϯΫϦϝϯτ  ΠϯΫϦϝϯτ  ίϯςϯπͷॲཧ 4FHNFOUBUJPO'BVMU 8PSLFSϓϩηε͕ҟৗऴྃ͠ɺ Ҏ߱ͷσΫϦϝϯτͷॲཧ͕ ߦΘΕͳ͘ͳΔɻ
  14. ໰୊఺ͷղܾ ಉ࣌઀ଓ਺ΛΧ΢ϯτ͢ΔKVSͷσʔλͷ࣋ͪํΛมߋͨ͠ɻ มߋલͷΧ΢ϯλʔ มߋޙͷΧ΢ϯλʔ KEY VALUE KEY VALUE /path/to/hoge.php 2

    /path/to/hoge.php 2 create_time_/path/to/hoge.php 1477303672 Χ΢ϯλʔ͕ʹͳͬͨ࣌ؒΛه࿥ͯ͠ɺҰఆ࣌ؒΧ΢ϯλʔ্͕͕Γͬͺͳ͠ʹ ͳ͍ͬͯͨΒɺҰ౓ʹ໭͢ͱ͍͏ॲཧΛೖΕΔ͜ͱͰղܾͨ͠ɻ 
  15. ύϑΥʔϚϯεςετ݁Ռ abΛ࢖ͬͯύϑΥʔϚϯεΛଌఆ͠·ͨ͠ɻ ςετύλʔϯ ྼԽ཰ httpd 0% httpd + http-access-limiter 3%

    httpd + http-access-limiter (੍ݶର৅) 5% WordPress΁ͷΞΫηε 10ສϦΫΤετ100ଟॏ / CPU24ίΞɾRAM32GB ςετύλʔϯ ྼԽ཰ httpd 0% httpd + http-access-limiter 3% httpd + http-access-limiter (੍ݶର৅) 30% phpinfo()΁ͷΞΫηε 
  16. ύϑΥʔϚϯε޲্ͷ޻෉  ਌ NSVCZ 8PSLFS NSVCZ 8PSLFS NSVCZ 8PSLFS NSVCZ

    8PSLFS NSVCZ KVS͔Β৘ใΛऔಘ͢Δͱ͖ KVS ϦΫΤετ ϦΫΤετ ϦΫΤετ ϦΫΤετ PQFO PQFO PQFO PQFO ϦΫΤετຖʹKVSΛOpen͢Δͱޮ཰͕ѱ͍
  17. ύϑΥʔϚϯε޲্ͷ޻෉  ਌ NSVCZ KVSʹΞΫηε͢Δͱ͖ KVS 8PSLFS NSVCZ 8PSLFS NSVCZ

    8PSLFS NSVCZ 8PSLFS NSVCZ ϦΫΤετ ϦΫΤετ ϦΫΤετ ϦΫΤετ ڞ༗ϝϞϦ KVS PQFO ΦϒδΣΫτΛ֨ೲ
  18. ύϑΥʔϚϯε޲্ͷ޻෉ mruby-userdataͱ͍͏mgemΛར༻͢Δɻ # mrubyPostConfigMiddle(ϓϩηεىಈ࣌) Userdata.new.shared_kvs = Cache.new :filename => "store.lmc"

    # mrubyAccessCheckerMiddle(ΞΫηε࣌) cache = Userdata.new.shared_kvs ɹɹɹɹ # ڞ༗ϝϞϦΛࢀর͢Δ p cache.get["hoge"]  ଞʹ΋MySQL΍RedisͳͲʹ઀ଓ͢ΔΑ͏ͳ৔߹ʹ΋༗ޮͳखஈ
  19. ෛՙΛ͔͚ͯύϑΥʔϚϯεΛଌఆ͢Δʹ͸ʁ abίϚϯυ  # ab -c 100 -n 100000 -k

    http://localhost/phpinfo.php : Requests per second: 1699.53 [#/sec] (mean) Time per request: 58.840 [ms] (mean) Time per request: 0.588 [ms] (mean, across all concurrent requests) Transfer rate: 73499.65 [Kbytes/sec] received ෛՙΛ͔͚ͨ݁Ռɺ3FDTFD΍Ϩεϙϯείʔυ͕ ҙਤͨ͠΋ͷͩͬͨͷ͔Λ؆୯ʹ֬ೝ͍ͨ͠ʂ
  20. BCNSVCZͷ࢖͍ํ ҎԼͷΑ͏ʹίϚϯυΛ࣮ߦ͠·͢ɻ ˌab-mruby -m config.rb -M suite.rb http://hoge.jp/phpinfo.php ҎԼͷΑ͏ʹςετͷઃఆ͠·͢ɻ add_config(

    "TotalRequests" => 100000, "Concurrency" => 100, "KeepAlive" => true, ) test_suite do "CompleteRequests".should_be 100000 "RequestPerSecond".should_be_over 1000 "Non2xxResponses".should_be 0 end config.rb suite.rb ςετͷઃఆΛهड़ ςετ݁Ռͷ͋Δ΂͖ ঢ়ଶΛهड़ 
  21. Mac IUUQBDDFTTMJNJUFSͰ͸͜͏͍ͯ͠Δ ςετ؀ڥ͸DockerͰίϯςφΛ্ཱͪ͛ͯߏங͢Δɻ ab-mrubyΛ࢖ͬͯabͷ݁ՌΛςετ͢Δɻ WEB Client httpd mod-mruby ab-mruby Docker

    ςετύλʔϯ͸ httpd httpd + access-limiter httpd + access-limiter(੍ݶ͋Γ) ύϑΥʔϚϯεͷਪҠΛ֬ೝͰ͖ΔΑ͏ʹ͠ ͯͲ͕͜ϘτϧωοΫʹͳ͍ͬͯΔ͔Λ෼͔ ΔΑ͏ʹ͍ͯ͠·͢ɻ  BCʹΑΔෛՙ
  22. IUUQBDDFTTMJNJUFSͰ͸͜͏͍ͯ͠Δ ςετ࣮ߦ͸ҎԼͷΑ͏ʹ͠·͢ɻ ύϑΥʔϚϯεࢼݧ͸සൟʹߦ͏ͷͰɺΦϖϨʔγϣϯΛ؆୯ʹ͢ΔͨΊʹɺશͯ ͷςετύλʔϯΛrakeίϚϯυ1ൃͰͰ͖ΔΑ͏ʹ͍ͯ͠·͢ɻ ˌrake e2e:test >> >> performance test

    >> : Finished 100000 requests [TEST CASE] [true] CompleteRequests (100000) should be 100000 [TEST CASE] [true] RequestPerSecond (1024.9543902983) should be over 1000 [TEST CASE] [true] Non2xxResponses (0) should be 0 test suites: [true]