Slide 1

Slide 1 text

ΞϓϦΛࢧ͑ΔFluentd +MongoDBΛ࢖ͬͨେن໛ ϩάղੳ 2013/03/25

Slide 2

Slide 2 text

ࣗݾ঺հ • ాத ༐ี(@csouls) • ϋοΧʔLv.3ʢϗΠϛ͕࢖͑ΔΑ͏ʹͳͬ ͨʣ • 8ϲ݄͘Β͍લʹϢʔβܥSIer→Webۀք΁ స৬

Slide 3

Slide 3 text

มԽΛળͱ͢ΔจԽ • స৬ͯ͠Ұ൪มΘͬͨ͜ͱ͸ɺपΓͷਓͷٕ ज़มԽʹର͢ΔՁ஋؍ͷج४͕ѱ→ળʹͳͬ ͨ͜ͱ • ఀ଺͸ΏΔ΍͔ͳࢮɻ͔͠͠ɺมԽ͢Δํ޲ Λؒҧ͑ଓ͚Δͱ͙͢ʹࢮ͵

Slide 4

Slide 4 text

෼ੳ • มԽͷํ޲ΛܾΊΔಓඪ • ෼ੳج൫΋มԽ(ൃల)͠ଓ͚Δ

Slide 5

Slide 5 text

ϩά෼ੳج൫ • fluentͰϩάΛूΊͯMongoDBͰूܭͯ͠ Ruby on Rails(+Highcharts)Ͱग़ྗ

Slide 6

Slide 6 text

ߏ੒ log aggregate Mithra

Slide 7

Slide 7 text

Fluentd • @frsyukiʹΑΔΠϕϯτϩάऩूπʔϧ • ʮখ͍͞ίΞػೳͱϓϥάΠϯʹΑΔ֦ுʯ ͷΞʔΩςΫνϟ͕࠷ߴʹඒ͍͠

Slide 8

Slide 8 text

Fluentd • tsvσʔλͷ਺஋߲໨ΛIntegerͰMongoDBʹ ೖΕ͍ͨ → in_tailϓϥάΠϯΛ֦ு • https://github.com/yusuket/fluent-plugins

Slide 9

Slide 9 text

ઃఆ [APαʔόଆ]    type  tail_ex    format  tsv    path  /media/ephemeral0/bigdata/payment.log    keys  amount,item_num,(...লུ)    int  item_num    float  amount    tag  app.payment    pos_file  /var/log/td-­‐agent/payment.log.pos

Slide 10

Slide 10 text

Fluentd • URLͷϖʔδͱΫΤϦύϥϝʔλΛ MongoDBʹಥͬࠐΈ͍ͨ • kentaro / fluent-plugin-extract_query_params ϓϥάΠϯΛ֦ு • https://github.com/yusuket/fluent-plugin- extract_query_params

Slide 11

Slide 11 text

ઃఆ [APαʔόଆ]    type  tail    format  tsv    path  /media/ephemeral0/bigdata/access.log    keys  log_time,url,...(লུ)    tag  app.access    pos_file  /var/log/td-­‐agent/access.log.pos      type  forward    flush_interval  5s            host  xxxxxxx        port  xxxx     [ूܭαʔόଆ]    type  extract_query_params    add_tag_suffix  .extracted    key            url    only          ab    add_path  page    type  mongo    host  localhost    database  xxxxxxxx    collection  log.accesses    capped    capped_size  100m    flush_interval  10s

Slide 12

Slide 12 text

Fluentd • 120Λ௒͑ΔϓϥάΠϯͰɺ΍Γ͍ͨ͜ͱ͸ ݁ߏग़དྷΔ • ͪΐͬͱػೳ͕଍Βͳͯ͘΋ɺ ϓϥάΠϯ ֦ு͕؆୯ʹग़དྷΔΑ͏ʹ࡞ΒΕ͍ͯΔ • ໺ྑϓϥάΠϯ͸/etc/td-agent/plugin͔/etc/ fluent/plugin΁

Slide 13

Slide 13 text

ͳͥMongoDB͔ʁ • εΩʔϚϨε • ϩάͷܗ͕ࣜมΘͬͯ΋ɺFluentdͷઃఆ ϑΝΠϧΛม͑Δ͚ͩͰྑ͍ • ͱΓ͋͑ͣಥͬࠐΉʢॲཧํ๏͸ޙͰߟ͑ Δʣͱ͍͏͜ͱ͕ग़དྷΔ

Slide 14

Slide 14 text

ͳͥMongoDB͔ʁ • εέʔϧΞ΢τ͠΍͍͢ • Map-Reduceͷଘࡏ • ϨϓϦέʔγϣϯɾγϟʔσΟϯάΛϛυ ϧ΢ΣΞͰαϙʔτ͍ͯ͠Δͷ͸خ͍͠

Slide 15

Slide 15 text

ूܭ • ϦΞϧλΠϜ • ΞΫηεϩά • ೔࣍/݄࣍όον • ՝ۚ/Πϯετʔϧϩά

Slide 16

Slide 16 text

ϦΞϧλΠϜ෼ੳྫ • ϖʔδผͷUUΛݟ͍ͨ

Slide 17

Slide 17 text

ूܭ • xxxηάϝϯτผͷxxxΛ෼ੳ͍ͨ͠

Slide 18

Slide 18 text

MongoDBͰͷूܭ • ूܭ͸MongoDB + Ruby • ੜϩάΛஷΊΔ log εΩʔϚͱɺϨϙʔτ༻ ͷ aggregated εΩʔϚ

Slide 19

Slide 19 text

MongoDBͷεΩʔϚσβΠϯ • @doryokujin͞ΜͷεϥΠυ͕෼Γқ͗ͯ͢ Կ΋࿩͢͜ͱແ͍ͷͰɺCapped-Collectionʹ ͍ͭͯ http://www.slideshare.net/doryokujin/ mongodb-uimongodb

Slide 20

Slide 20 text

ΞΫηεϩά • 500ສPV/೔͘Β͍ • Google Analytics࢖͍͍͚ͨͲɺ1000ສ PV/݄·Ͱ ϓϨϛΞ͸10ԯ/݄͚ͩͲɺ100ສԁ/݄ ͸ߴ͗͢ • MongoDBͷCapped-CollectionΛར༻

Slide 21

Slide 21 text

Capped-Collection • ݻఆ௕ͷίϨΫγϣϯɻݹ͍ϩά͸ফ͑Δ • ΠϯσοΫεΛషΒͳ͍ͷͰɺॻ͖ࠐΈ͕଎ ͍ • AWS m1.medium + EBS(IOPSΦϓγϣϯແ ͠)Ͱ500ສPV/1೔Λ༨༟Ͱ͞͹͚͍ͯΔ

Slide 22

Slide 22 text

• Capped-CollectionʹΞΫηεϩάΛྲྀ͜͠Μ ͰɺΧʔιϧΛॱ࣍ॲཧͯ͠Page-ViewίϨ ΫγϣϯΛߋ৽ • UU͸countͰɺPV͸pvଐੑͷ૯ܭͰදݱ Capped-Collection _id:              #{yyyymmddhh}  +  ":"  +  #{page}  +  ":"  +  #{user_id} date_hour:  Time page:            String user_id:      Integer pv:                Integer

Slide 23

Slide 23 text

Capped-Collection࣮૷ྫ • ॲཧ͕தஅ͞Εͨͱ͖ͷͨΊʹɺ࠷ޙͷߋ৽ ࣌ؒΛӬଓԽ͢Δ • Χʔιϧ͕Close͢Δ͜ͱ͕͋ΔͷͰɺ࠶։͢ Δ༷ʹ͢Δ

Slide 24

Slide 24 text

#  ӬଓԽ͓͍ͯͨ͠࠷ޙͷߋ৽࣌ؒ processed_time  =  Tmp::PagePosition.first.processed_time loop  do    #  Χʔιϧ͕ด͡ΒΕͨ࣌ʹ࠶։͢Δ    cursor  =  Mongo::Cursor.new('log.accesses',  selector:  {'log_time'  =>  {'$gt'  =>  processed_time}},                                                            timeout:  false,  tailable:  true,  order:  [['$natural',  1]])    loop  do        break  if  cursor.closed?        begin            document  =  cursor.next_document            unless  document  then                sleep(0.1)                next            end              <ϖʔδϏϡʔίϨΫγϣϯͷߋ৽ॲཧ>              if  document["log_time"]  >  processed_time  then                processed_time  =  log_time                Tmp::PagePosition.update_processed_time(processed_time)            end        rescue  =>  e            <Τϥʔग़ྗ>            cursor.close            break        end    end end

Slide 25

Slide 25 text

Capped-Collection࣮૷ྫ • 2^32 = ໿42ԯυΩϡϝϯτ্͕ݶɻ࣮࣭ࠔΔ ͜ͱ͸ͳ͍ɻ্ݶ100ສίϨΫγϣϯͰ΋ɺ ଎౓௿Լ͸ݟΒΕͳ͔ͬͨ • େྔσʔλΛϦΞϧλΠϜ෼ੳ͢Δ༻్ʹ࠷ ద

Slide 26

Slide 26 text

MongoDBͷ೉͍͠ͱ͜Ζ • Join͕࢖͑ͳ͍ɻʮࠓճͷΠϕϯτͷࢀՃ ऀ্Ґ100໊ͷΞΠςϜ࢖༻ঢ়گʯΛग़͢ ͨΊʹ͸1ͭͷίϨΫγϣϯʹΠϕϯτϥ ϯΩϯάଐੑͱΞΠςϜ࢖༻ঢ়گͷଐੑ͕ ඞཁ • Map-Reduce͸SQLΑΓϋʔυϧ͕ߴ͍

Slide 27

Slide 27 text

ݱࡏͷߏ੒ log aggregate Mithra

Slide 28

Slide 28 text

ཧ૝ͷߏ੒ log aggregate Mithra ˍ

Slide 29

Slide 29 text

·ͱΊ • Fluentd͸ϩάΛ࿈ܞ͢Δ্Ͱ࠷ߴͷϓϩμ Ϋτ • MongoDB͚ͩͰूܭ͢ΔΑΓ΋ɺMySQLͱ ͏·͘૊Έ߹Θͤͯूܭ͢Δํ͕ɺޮ཰͕ྑ ͍ • Treasure Data͞ΜͺͶ͐ͬ͢

Slide 30

Slide 30 text

·ͱΊ • ৽͍͠ϓϩμΫτ΁௅ઓ͢Δ͜ͱͰɺ৽͍͠ ஌ࣝΛಘΔ͚ͩͰ͸ͳ͘ɺطଘͷٕज़ͷྑ͞ ΋࠶ೝࣝग़དྷΔ • มԽΛڪΕͣνϟϨϯδ͠ଓ͚Δ͜ͱ͕࠷େ ͷϦεΫ΁ͷରԠ