Slide 1

Slide 1 text

Scaling Memcache at Facebook Rajesh Nishtala, Hans Fugal, Steven Grimm, Marc Kwiatkowski, Herman Lee, Harry C. Li, Ryan McElroy, Mike Paleczny, Daniel Peek, Paul Saab, David Stafford, Tony Tung, Venkateshwaran Venkataramani JEZ@VVLJ ࿦จྠಡձ NSDI 13 In Proceedings of the 10th USENIX conference on Networked Systems Design and Implementation

Slide 2

Slide 2 text

Infrastructure Requirements • ϦΞϧλΠϜʹ͍ۙίϛϡχέʔγϣϯ • ෳ਺ͷσʔλιʔε͔ΒίϯςϯπΛଋͶΔ • ਓؾͷ͋ΔγΣΞ͞ΕͨίϯςϯπΛࢀর/ߋ৽ Ͱ͖Δ • ຖඵ਺ेԯϦΫΤετ·Ͱεέʔϧ͢Δ

Slide 3

Slide 3 text

Design Requirements • ඇৗʹॏ͍ read ෛՙͷαϙʔτ • over 1 G read per second • όοΫΤϯυαʔϏεΛॏ͍ read ͔Βִ཭ • ஍ཧతͳ෼ࢄ • ఆظతͳϓϩμΫτͷ૑ग़ • ༷ʑͳϢʔεέʔεʹରͯ͠ϑϨΩγϒϧ • ৽ػೳͷߴ଎։ൃαϙʔτ • Ӭଓ૚ͱΩϟογϡ૚ͷ෼཭

Slide 4

Slide 4 text

memcached • Facebook ͷ෼ࢄKVSͷجຊ୯Ґ • Trillions of items • Billions of requests / second • ωοτϫʔΫΞΫηεͰ͖ΔΠϯϝϞϦϋογϡ ςʔϒϧ • LRUͰϝϞϦ͔Β௥͍ग़͠

Slide 5

Slide 5 text

Roadmap 1. ୯ҰϑϩϯτΤϯυΫϥελ - ॏ͍ read ϫʔΫϩʔυ - Wide fanout - ϦΫΤετࣦഊͷϋϯυϦϯά 2. ෳ਺ϑϩϯτΤϯυΫϥελ - σʔλϨϓϦέʔγϣϯ - σʔλͷҰ؏ੑ 3. ෳ਺Ϧʔδϣϯ - σʔλͷҰ؏ੑ ࠷ऴܗ

Slide 6

Slide 6 text

memcache scale steps NFNDBDIFEαʔόͳ͠ ਺୆ͷNFNDBDIFEαʔό γϯάϧΫϥελ ϚϧνΫϥελ ஍ཧత෼ࢄΫϥελ

Slide 7

Slide 7 text

Query Cache (1) • 1. memcache ʹ get ϦΫΤετ • 2. Ωϟογϡϛεͨ͠ΒɺDB ʹ ΫΤϦΛ౤͛Δ • 3. memcache ʹΫΤϦ݁ՌΛ Ωϟογϡ • ී௨ͷϑϩʔ

Slide 8

Slide 8 text

Query Cache (2) • DBʹߋ৽͕͋ͬͨͱ͖Ωϟο γϡΛ”ແޮԽ”(invalidation)͢Δ ඞཁ͕͋Δ • ΩϟογϡΛߋ৽͢ΔΑΓ࡟আ • ࡟আ͸ႈ౳ੑ͕͋Δ • “demand-filled look-aside cache”

Slide 9

Slide 9 text

The problem of look-aside cache • ෳ਺ͷWebαʔό͕ set͢Δͱ͖ෆ੔߹ ͕ى͖Δ • ҟͳΔ஋Λฒྻʹset͠Α͏ͱ͢Δ • memcache ϓϩτίϧ֦ு “leases” • Ωϟογϡϛε࣌ʹτʔΫϯ(lease)Λ ൃߦ • Ωϟογϡϛεͨ͠ਓ͕set͢Δ • delete ࣌ʹτʔΫϯΛແޮԽ • τʔΫϯͷೝূʹࣦഊ͢ΔͱɺsetෆՄ TUBMFTFUT SFGIUUQTXXXVTFOJYPSHTJUFTEFGBVMUpMFTDPOGFSFODFQSPUFDUFEpMFTOJTIUBMB@OTEJ@TMJEFTQEG

Slide 10

Slide 10 text

The problem of look-aside cache • ಛఆͷΩʔ͕ແޮԽ → DBʹ Ұ੪ϑΥʔϧόοΫ • “leases”Λগ͠मਖ਼ • Ωϟογϡϛε࣌ʹsetΛ଴ͭ or ݹ͍ΩϟογϡΛࢀর͢Δ • ݹ͍ΩϟογϡΛઐ༻ͷσʔ λߏ଄ʹूΊ͓ͯ͘ 5IVOEFSJOH)FSET SFGIUUQTXXXVTFOJYPSHTJUFTEFGBVMUpMFTDPOGFSFODFQSPUFDUFEpMFTOJTIUBMB@OTEJ@TMJEFTQEG

Slide 11

Slide 11 text

memcache scaling steps NFNDBDIFEαʔόͳ͠ ਺୆ͷNFNDBDIFEαʔό γϯάϧΫϥελ ϚϧνΫϥελ ஍ཧత෼ࢄΫϥελ

Slide 12

Slide 12 text

Many memcached servers • Ωʔʹର͢Δ consistent-hashing Ͱ෼ࢄ • Ұ෦ͷΩʔ͚ͩΞΫηεස౓͕ߴ͍ • ϨϓϦέʔγϣϯͩͱϝϞϦޮ཰ѱ͍ • શWebαʔόͱmemcachedαʔό͕ଟରଟͰ௨৴ • hundreads of memcache gets per user request (eg. avg 521 fetches)

Slide 13

Slide 13 text

The problem of Consistent-Hashing 1BDLFU%SPQ • શ Web αʔό͔Βશ memcached ʹόʔετΞΫηε • ωοτϫʔΫεΠονͷόοϑΝ͕ᷓΕͯύέοτϩε • ᫔᫓੍ޚʹΑΓ TCP ίωΫγϣϯͷεϧʔϓοτ௿Լ • εϥΠσΟϯά΢Οϯυ΢Ͱಉ࣌ϦΫΤετ਺Λ੍ޚ • Ϩεϙϯε͕ฦ͖ͬͯͨΒ࣍ͷϦΫΤετΛ౤͛Δ • ϦΫΤετ੒ޭ਺ʹԠͯ͡΢Οϯυ΢αΠζΛখ͘͢͞Δ 5$1*ODBTU$POHFTUJPO

Slide 14

Slide 14 text

memcache scaling steps NFNDBDIFEαʔόͳ͠ ਺୆ͷNFNDBDIFEαʔό γϯάϧΫϥελ ϚϧνΫϥελ ஍ཧత෼ࢄΫϥελ

Slide 15

Slide 15 text

Multiple Clusters • ୆਺૿΍͚ͩ͢ͷεέʔϦϯ άͩͱ͖ͼ͍͠ • ෳ਺ͷϑϩϯτΤϯυΫϥε λ + ετϨʔδΫϥελ • ඞཁͳ͜ͱ • ֤ΫϥελؒͰҰ؏ੑͷҡ ࣋ • σʔλϨϓϦέʔγϣϯ

Slide 16

Slide 16 text

DB invalidate caches • DBߋ৽ޙɺ֤ϑϩϯτΤϯυΫϥελͷΩϟο γϡΛແޮԽ͠ͳ͚Ε͹ͳΒͳ͍ • MySQL ίϛοτϩάΛ tail ͯ͠ શ memcached ͷ ΩϟογϡΛແޮԽ͢ΔσʔϞϯʢMcSqueal) • ͋Β͔͡ΊɺແޮԽ͢΂͖ΩʔΛSQLʹຒΊࠐΉ

Slide 17

Slide 17 text

invalidate pipeline • memcached ͱ McSquealͷଟର ଟ௨৴ͰύέοτϨʔτ͕໰୊ʹ • ઐ༻ͷϧʔλʢmcrouter)ΛڬΉ • deleteཁٻͷѹॖ΋ • ύέοτ͋ͨΓͷdelete਺͕18ഒ 5PPNBOZQBDLFUT

Slide 18

Slide 18 text

memcache scaling steps NFNDBDIFEαʔόͳ͠ ਺୆ͷNFNDBDIFEαʔό γϯάϧΫϥελ ϚϧνΫϥελ ஍ཧత෼ࢄΫϥελ

Slide 19

Slide 19 text

Geographically distributed clusters • ϨϓϦΧ = ෳ਺ϑϩϯτΤϯυΫϥελ + ετ ϨʔδΫϥελ • ϨϓϦΧΛ֤Ϧʔδϣϯʹ഑ஔ • ϚελϨϓϦΧ • ϚελετϨʔδΫϥελΛ΋ͭϨϓϦΧ • ॻ͖ࠐΈ͸ϚελϨϓϦΧʹ

Slide 20

Slide 20 text

Writes in non-master replica • εϨʔϒϨϓϦΧ͔ΒϚελDB΁ͷॻ͖ࠐΈ • ϨϓϦ஗Ԇ͍ͯ͠ΔؒʹɺผίϯςΩετͰ Ωϟογϡϛε → Ωϟογϡ஋ set • ϚελDBʹ௥͍͍ͭͯͳ͍ͳ͍εϨʔϒDBͷ ஋͕Ωϟογϡ͞Εͯ͠·͏

Slide 21

Slide 21 text

Remote Markers • εϨʔϒϨϓϦ͔ΒϚελ΁ͷॻ͖ࠐΈ࣌ʹ͸ɺ ϚʔΧʔΛ͚ͭΔ • ϚʔΧʔ͕͍͍ͭͯͨΒɺϚελDB͔Β read • ϚʔΧʔ͕͍ͭͯͳ͔ͬͨΒɺεϨʔϒDB͔ Β read

Slide 22

Slide 22 text

Conclusion • Facbeookͷ੒௕ʹ͋ΘͤͯͲ͏΍ͬͯMemcache Λεέʔϧͤ͞Δ͔ • ΤϯδχΞϦϯάϦιʔεͷόϥϯεΛͱΕΔΑ͏ʹɺݱ࣮ʹଇͨ͠ ΍Γํ 1. ΩϟογϡͱӬଓετϨʔδΛ෼཭ͯ͠ɺಠཱͯ͠εέʔϧͤ͞Δ 2. ϞχλϦϯάɺσόοΪϯάɺΦϖϨʔγϣϯޮ཰Λվળ͢Δػೳ͸ ύϑΥʔϚϯεͱಉ͘͡Β͍ॏཁ 3. ϩδοΫ͸ stateless ͳΫϥΠΞϯτʹஔ͘΄͏͕ࠞཚ͠ͳ͍ 4. γεςϜ͸৽ػೳͷஈ֊తͳϩʔϧΞ΢τͱϩʔϧόοΫΛαϙʔτ ͠ͳ͚Ε͹ͳΒͳ͍ 5. Simplicity is vital.

Slide 23

Slide 23 text

ٙ໰ • ϨϓϦέʔγϣϯͷ࣮૷͸ʁ • memcached ͸ϨϓϦέʔγϣϯͷػೳͳ͍ • ΫϥΠΞϯτϥΠϒϥϦͷ࣮૷͸ʁ • Ͳ͜·ͰΞϓϦͷϩδοΫͱ෼཭͍ͯ͠Δͷ͔