Download - Riak at ideeli

Transcript
Page 1: Riak at ideeli

riak@ideeli

Aaron Brown, Lead Systems [email protected]@aaronbbrown777

Thursday, February 14, 13

Page 2: Riak at ideeli

What is an ideeli?

Thursday, February 14, 13

Page 3: Riak at ideeli

Flash Saleshttp://www.flickr.com/photos/moonlightbulb/4064060773/

Thursday, February 14, 13

Page 4: Riak at ideeli

Flash SalesThursday, February 14, 13

Page 5: Riak at ideeli

Flash SalesThursday, February 14, 13

Page 6: Riak at ideeli

Flash SalesThursday, February 14, 13

Page 7: Riak at ideeli

Flash SalesThursday, February 14, 13

Page 8: Riak at ideeli

Obligatory Stats

• 2,000,000 visitors/week

• 80,000 front end requests/minute

• 120 production servers

• 300 deploys a year

• 40ms front end response time

Thursday, February 14, 13

Page 9: Riak at ideeli

Obligatory Riak Stats

• 1.2MM keys

• 4 virtualized nodes

• 4ms response

• 40,000 GETs/min

• 2,000 PUTs/min

Thursday, February 14, 13

Page 10: Riak at ideeli

The SpikeThursday, February 14, 13

Page 11: Riak at ideeli

The StackThursday, February 14, 13

Page 12: Riak at ideeli

New Toys Are Fun(9AM - 5PM)

Thursday, February 14, 13

Page 13: Riak at ideeli

What Counts1AM - 7AM

Thursday, February 14, 13

Page 14: Riak at ideeli

K.I.S.S.Keep It Simple Stupid

Thursday, February 14, 13

Page 15: Riak at ideeli

K.I.S.S.Keep It Simple Stupid

Kan It Sell Shoes?

Thursday, February 14, 13

Page 16: Riak at ideeli

3 Uses for Riak

• Cache Warming

Thursday, February 14, 13

Page 17: Riak at ideeli

3 Uses for Riak

• Cache Warming

• Feature Testing (LABS)

Thursday, February 14, 13

Page 18: Riak at ideeli

3 Uses for Riak

• Cache Warming

• Feature Testing (LABS)

• User Favorites

Thursday, February 14, 13

Page 19: Riak at ideeli

Cache Warming

Thursday, February 14, 13

Page 20: Riak at ideeli

The SpikeThursday, February 14, 13

Page 21: Riak at ideeli

Cache WarmingPseudo-code:

every.30.minutes do  all_urls.each do |url|    curl "#{url}?force_cache=true"  endend

Thursday, February 14, 13

Page 22: Riak at ideeli

Cache WarmingThursday, February 14, 13

Page 23: Riak at ideeli

Response timesThursday, February 14, 13

Page 24: Riak at ideeli

History

Thursday, February 14, 13

Page 25: Riak at ideeli

memcached

Thursday, February 14, 13

Page 26: Riak at ideeli

memcached~40ms

Thursday, February 14, 13

Page 27: Riak at ideeli

memcached5/6 requests ~ 40ms

1/6 requests ~ 3000ms=

~500ms average

Thursday, February 14, 13

Page 28: Riak at ideeli

Domino Effecthttp://www.flickr.com/photos/soham_pablo/309379628/

Thursday, February 14, 13

Page 29: Riak at ideeli

Manual InterventionThursday, February 14, 13

Page 30: Riak at ideeli

membase(couchbase)

Thursday, February 14, 13

Page 31: Riak at ideeli

RiakAll requests ~40ms

Thursday, February 14, 13

Page 32: Riak at ideeli

RiakAll requests ~40ms

Thursday, February 14, 13

Page 33: Riak at ideeli

LABS

• Feature Testing Framework

• Key based on user id

• Value YAML string w/ list of experiments

Thursday, February 14, 13

Page 34: Riak at ideeli

FavoritesThursday, February 14, 13

Page 35: Riak at ideeli

FavoritesThursday, February 14, 13

Page 36: Riak at ideeli

Favorites

• Partially normalized

• user_#{id} → array of productsproduct_#{id} → metadata about product

Thursday, February 14, 13

Page 37: Riak at ideeli

Rails Integration

• Modified riak-client gem for Rails 2.3

• Load balancing built in

• Multiple primary and secondary servers

• Custom ActiveSupport::Cache store

Thursday, February 14, 13

Page 38: Riak at ideeli

Rails Integrationmodule ActiveSupport  module Cache    class RailsStore < Store

      def read      end

      def write      end

      def delete      end  endend

config.after_initialize do  ActionController::Base.cache_store = Rails.rails_store.fragmentsend

Thursday, February 14, 13

Page 39: Riak at ideeli

MonitoringThursday, February 14, 13

Page 40: Riak at ideeli

GraphiteThursday, February 14, 13

Page 41: Riak at ideeli

New RelicThursday, February 14, 13

Page 42: Riak at ideeli

Alerting

• Compute random string

• PUT value into Riak

• GET value out of Riak

• alert if value_in != value_out

• alert if operation took too long

Thursday, February 14, 13

Page 43: Riak at ideeli

Tuning

Thursday, February 14, 13

Page 44: Riak at ideeli

Bitcask Merges

Thursday, February 14, 13

Page 45: Riak at ideeli

Disk UsageThursday, February 14, 13

Page 46: Riak at ideeli

Heavy I/OThursday, February 14, 13

Page 47: Riak at ideeli

expiry_grace_timeThursday, February 14, 13

Page 48: Riak at ideeli

Offset Merge WindowsThursday, February 14, 13

Page 49: Riak at ideeli

Puppetclass ideeli_riak ( $merge_window_start, $merge_window_end ) {... file { '/etc/riak/app.config' : content => template("ideeli_riak/app.config.erb"), }...}

class riak-node { $merge_window_start = inline_template( ‘<%= (scope.function_fqdn_rand([6]).to_i + 20) % 23 %>' )

class { 'ideeli_riak' : merge_window_start => $merge_window_start, merge_window_end => 6 }}

Thursday, February 14, 13

Page 50: Riak at ideeli

Riak Loves Disk

Thursday, February 14, 13

Page 51: Riak at ideeli

New Disk ArrayThursday, February 14, 13

Page 52: Riak at ideeli

New Disk ArrayThursday, February 14, 13

Page 53: Riak at ideeli

Improvement!Thursday, February 14, 13

Page 54: Riak at ideeli

We’re Hiringhttp://ideelicareers.com/

Thursday, February 14, 13

Page 55: Riak at ideeli

Questions?

Thursday, February 14, 13