memcached code camp 2009

118
memcached scaling your website with memcached by: steve yen

Upload: northscale

Post on 15-Jan-2015

3.960 views

Category:

Technology


4 download

DESCRIPTION

memcached best practices presentation at Silicon Valley Code Camp 2009,

TRANSCRIPT

Page 1: Memcached Code Camp 2009

memcached

scaling your website

with memcached

by: steve yen

Page 2: Memcached Code Camp 2009

about me

• Steve Yen

• NorthScale

• Escalate Software

• Kiva Software

Page 3: Memcached Code Camp 2009

what you’ll learn

• what, where, why, when

• how

• especially, best practices

Page 4: Memcached Code Camp 2009

“mem cache dee”

• latest version1.4.1

• http://code.google.com/p/memcached

Page 5: Memcached Code Camp 2009

open source

Page 6: Memcached Code Camp 2009

distributed cache

Page 7: Memcached Code Camp 2009

livejournal

Page 8: Memcached Code Camp 2009

helps your websites run fast

Page 9: Memcached Code Camp 2009

popular

Page 10: Memcached Code Camp 2009

simple

Page 11: Memcached Code Camp 2009

KISS

Page 12: Memcached Code Camp 2009

easy

Page 13: Memcached Code Camp 2009

small bite-sized steps

• not a huge, forklift replacement rearchitecture / reengineering project

Page 14: Memcached Code Camp 2009

fast

Page 15: Memcached Code Camp 2009

“i only block for memcached”

Page 16: Memcached Code Camp 2009

scalable

Page 17: Memcached Code Camp 2009

many client libraries

• might be TOO many

• the hit list...

• Java ==> spymemcached

• C ==> libmemcached

• Python, Ruby, etc ==>

• libmemcached wrappers

Page 18: Memcached Code Camp 2009

frameworks

• rails

• django

• spring / hibernate

• cakephp, symphony, etc

Page 19: Memcached Code Camp 2009

applications

• drupal

• wordpress

• mediawiki

• etc

Page 20: Memcached Code Camp 2009

it works

it promises to solve performance problems

it delivers!

Page 21: Memcached Code Camp 2009

problem?

Page 22: Memcached Code Camp 2009

your website is too slow

Page 23: Memcached Code Camp 2009

RDBMS melting down

Page 24: Memcached Code Camp 2009

urgent! emergency

Page 25: Memcached Code Camp 2009

one server

web app + RDBMS

Page 26: Memcached Code Camp 2009

1 + 1 servers

web app

RDBMS

Page 27: Memcached Code Camp 2009

N + 1 servers

web app, web app, web app, web app

RDBMS

Page 28: Memcached Code Camp 2009

RDBMS

Page 29: Memcached Code Camp 2009

EXPLAIN PLAN?

Page 30: Memcached Code Camp 2009

buy a bigger box

Page 31: Memcached Code Camp 2009

buy better disks

Page 32: Memcached Code Camp 2009

master write DB + multiple read DB?

Page 33: Memcached Code Camp 2009

vertical partitioning?

Page 34: Memcached Code Camp 2009

sharding?

Page 35: Memcached Code Camp 2009

uh oh, big reengineering

• risky!

• touch every line of code, every query!!

Page 36: Memcached Code Camp 2009

and, it’s 2AM

Page 37: Memcached Code Camp 2009

you need a band-aid

Page 38: Memcached Code Camp 2009

a simple band-aid now

Page 39: Memcached Code Camp 2009

use a cache

Page 40: Memcached Code Camp 2009

keep things in memory!

Page 41: Memcached Code Camp 2009

don’t hit disk

Page 42: Memcached Code Camp 2009

distributed cache

• to avoid wasting memory

Page 43: Memcached Code Camp 2009

don’t write one of these yourself

Page 44: Memcached Code Camp 2009

memcached

Page 45: Memcached Code Camp 2009

simple API

• hash-table-ish

Page 46: Memcached Code Camp 2009

your code before

v = db.query( SOME SLOW QUERY )

Page 47: Memcached Code Camp 2009

your code after

v = memcachedClient.get(key)

if (!v) {

v = db.query( SOME SLOW QUERY )

memcachedClient.set(key, v)

}

Page 48: Memcached Code Camp 2009

cache read-heavy stuff

Page 49: Memcached Code Camp 2009

invalidate when writing

• db.execute(“UPDATE foo WHERE ...”)

• memcachedClient.delete(...)

Page 50: Memcached Code Camp 2009

and, repeat

• each day...

• look for the next slowest operations

• add code to cache a few more things

Page 51: Memcached Code Camp 2009

your life gets better

Page 52: Memcached Code Camp 2009

thank you memcached!

Page 53: Memcached Code Camp 2009

no magic

Page 54: Memcached Code Camp 2009

you are in control

Page 55: Memcached Code Camp 2009

now for the decisions

Page 56: Memcached Code Camp 2009

memcached adoption

• first, start using memcached

• poorly

• but you can breathe again

Page 57: Memcached Code Camp 2009

memcached adoption

• next, start using memcached correctly

Page 58: Memcached Code Camp 2009

memcached adoption

• later

• queueing

• persistence

• replication

• ...

Page 59: Memcached Code Camp 2009

an early question

Page 60: Memcached Code Camp 2009

where to run servers?

Page 61: Memcached Code Camp 2009

answer 1

• right on your web servers

• a great place to start, if you have extra memory

Page 62: Memcached Code Camp 2009

servers

web app web app web app web appmemcached memcached memcached, memcached

RDBMS

Page 63: Memcached Code Camp 2009

add up your memory usage!

• having memcached server swap == bad!

Page 64: Memcached Code Camp 2009

answer 2

• run memcached right on your database server?

• WRONG!

Page 65: Memcached Code Camp 2009

answer 3

• run memcached on separate dedicated memcached servers

• congratulations!

• you either have enough money

• or enough traffic that it matters

Page 66: Memcached Code Camp 2009

running a server

• daemonize

• don’t be root!

• no security

Page 67: Memcached Code Camp 2009

server lists

• mc-server1:11211

• mc-server2:11211

• mc-server3:11211

Page 68: Memcached Code Camp 2009

consistent hashing

source: http://www.spiteful.com/2008/03/17/programmers-toolbox-part-3-consistent-hashing/

Page 69: Memcached Code Camp 2009

client-side intelligence

• no “server master” bottleneck

Page 70: Memcached Code Camp 2009

libmemcached

• fast C memcached client

• supports consistent hashing

• many wrappers to your favorite languages

Page 71: Memcached Code Camp 2009

updating server lists

• push out new configs and restart?

• moxi

• memcached + integrated proxy

Page 72: Memcached Code Camp 2009

keys

• no whitespace

• 250 char limit

• use short prefixes

Page 73: Memcached Code Camp 2009

keys & MD5

• don’t

• stats become useless

Page 74: Memcached Code Camp 2009

values

• any binary object

• 1MB limit

• change #define & recompile if you want more

• and you’re probably doing something wrong if you want more

Page 75: Memcached Code Camp 2009

values

• query resultset

•serialized object

•page fragment

•pages• etc

Page 76: Memcached Code Camp 2009

nginx + memcached

Page 77: Memcached Code Camp 2009

>1 language?

• JSON

• protocol buffers

• XML

Page 78: Memcached Code Camp 2009

memcached is lossy

• memcached WILL lose data

Page 79: Memcached Code Camp 2009

that’s a good thing

remember, it’s a CACHE

Page 80: Memcached Code Camp 2009

why is memcached lossy?

Page 81: Memcached Code Camp 2009

memcached node dies

Page 82: Memcached Code Camp 2009

when node restarts...

• you just get a bunch of cache misses

(and a short RDBMS spike)

Page 83: Memcached Code Camp 2009

eviction

more disappearing data!

Page 84: Memcached Code Camp 2009

LRU

• can config memcached to not evict

• but, you’re probably doing something wrong if you do this

Page 85: Memcached Code Camp 2009

remember, it forgets

• it’s just a CACHE

Page 86: Memcached Code Camp 2009

expiration

• aka, timeouts

• memcached.set(key, value, timeout)

Page 87: Memcached Code Camp 2009

use expirations or not?

Page 88: Memcached Code Camp 2009

1st school of thought

• expirations hide bugs

• you should be doing proper invalidations

• (aka, deletes)

• coherency!

Page 89: Memcached Code Camp 2009

school 2

• it’s 3AM and I can’t think anymore

• business guy:

• “sessions should auto-logout after 30 minutes due to bank security policy”

Page 90: Memcached Code Camp 2009

put sessionsin memcached?

• just a config change

• eg, Ruby on Rails

Page 91: Memcached Code Camp 2009

good

• can load-balance requests to any web host

• don’t touch the RDBMS on every web request

Page 92: Memcached Code Camp 2009

bad

• could lose a user’s session

Page 93: Memcached Code Camp 2009

solution

• save sessions to memcached

• the first time, also save to RDBMS

• ideally, asynchronously

• on cache miss, restore from RDBMS

Page 94: Memcached Code Camp 2009

solution

• save sessions to memcached

• the first time, also save to RDBMS

• ideally, asynchronously

• on cache miss, restore from RDBMS

Page 95: Memcached Code Camp 2009

in the background...

• have a job querying the RDBMS

• cron job?

• the job queries for “old” looking session records in the sessions table

• refresh old session records from memcached

Page 96: Memcached Code Camp 2009

add vs replace vs set

Page 97: Memcached Code Camp 2009

append vs prepend

Page 98: Memcached Code Camp 2009

CAS

• compare - and - swap

Page 99: Memcached Code Camp 2009

incr and decr

• no negative numbers

Page 100: Memcached Code Camp 2009

queueing

• “hey, with those primitives, I could build a queue!”

Page 101: Memcached Code Camp 2009

don’t

• memcached is lossy

• protocol is incorrect for a queue

• instead

• gearman

• beanstalkd

• etc

Page 102: Memcached Code Camp 2009

cache stampedes

• gearman job-unique-id

• encode a timestamp in your values

• one app node randomly decides to refresh slightly early

Page 103: Memcached Code Camp 2009

coherency

Page 104: Memcached Code Camp 2009

denormalization

• or copies of data

Page 105: Memcached Code Camp 2009

example: changing a product price

Page 106: Memcached Code Camp 2009

memcached UDF’s

• another great tool in your toolbox

• on a database trigger, delete stuff from memcached

Page 107: Memcached Code Camp 2009

memcached UDF’s

• works even if you do UPDATES with fancy WHERE clauses

Page 108: Memcached Code Camp 2009

multigets

• they are your friend

• memcached is fast, but...

• imagine 1ms for a get request

• 200 serial gets ==> 200ms

Page 109: Memcached Code Camp 2009

a resultset loop

foreach product in resultset

c = memcached.get(product.category_id)

do something with c

Page 110: Memcached Code Camp 2009

2 loops

for product in resultset

multiget_request.append(product.category_id)

multiget_response = memcachedClient.multiget(

multiget_request)

for c in multiget_response

do something with c

Page 111: Memcached Code Camp 2009

memcached slabber

• allocates memory into slabs

• it might “learn” the wrong slab sizes

• watch eviction stats

Page 112: Memcached Code Camp 2009

losing a node

• means your RDBMS gets hit

Page 113: Memcached Code Camp 2009

replication

• simple replication in libmemcached

• >= 2x memory cost

• only simple verbs

• set, get, delete

• doesn’t handle flapping nodes

Page 114: Memcached Code Camp 2009

persistence

Page 115: Memcached Code Camp 2009

things that speak memcached

• tokyo tyrant

• memcachedb

• moxi

Page 116: Memcached Code Camp 2009

another day

• monitoring & statistics

• near caching

• moxi

Page 117: Memcached Code Camp 2009

thanks!!!

• love any feedback

• your memcached war stories

• your memcached wishlist

[email protected]