57
Can Rails (finally) scale? Experience at Ask.fm Tuesday, September 24, 13

Can railsscale

  • View
    301

  • Download
    0

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Can railsscale

Can Rails (finally) scale?Experience at Ask.fm

Tuesday, September 24, 13

Page 2: Can railsscale

CanRailsScale.com

Tuesday, September 24, 13

Page 3: Can railsscale

Ask.fm

• 80M registered users

• 200M monthly unique users

• 400M page-views a day

• ~1M users online

Tuesday, September 24, 13

Page 4: Can railsscale

Ask.fm

• 600 questions a second

• 20k requests / second

• 50k likes / minute

Tuesday, September 24, 13

Page 5: Can railsscale

Ask.fm

• ~300 ruby on rails nodes

• 16 Cores

• 16Gb RAM

• 24 passengers

Tuesday, September 24, 13

Page 6: Can railsscale

Team

10 developers2 Ruby developers

Tuesday, September 24, 13

Page 7: Can railsscale

Proposed topics

• Persistence Layer

• Application Layer

• Infrastructure

• Code scalability

• Rails Tools Scalability

• Misc

Tuesday, September 24, 13

Page 8: Can railsscale

Proposed topics

• Persistence Layer

• Application Layer

• Infrastructure

• Code scalability

• Rails Tools Scalability

• Misc

Tuesday, September 24, 13

Page 9: Can railsscale

Persistence Layer

Tuesday, September 24, 13

Page 10: Can railsscale

Persistence Layer Issues

• Connection pooling

• Datasource switching

• High-Availability

• Redis

Tuesday, September 24, 13

Page 11: Can railsscale

Persistence Layer Issues

• Connection pooling

• Datasource switching

• High-Availability

• Redis

Tuesday, September 24, 13

Page 12: Can railsscale

Connection Pool

Tuesday, September 24, 13

Page 13: Can railsscale

Connection Pool

Tuesday, September 24, 13

Page 14: Can railsscale

Connection Pool

Tuesday, September 24, 13

Page 15: Can railsscale

Connection Pool

Tuesday, September 24, 13

Page 16: Can railsscale

Persistence Layer Issues

• Connection pooling

• Datasource switching

• High-Availability

• Redis

Tuesday, September 24, 13

Page 17: Can railsscale

Datasource switching

Database

ActiveRecord

db_charmer*

Data Access Logic

Business Logic

* https://github.com/kovyrin/db-charmerTuesday, September 24, 13

Page 18: Can railsscale

Example

production: bar: adapter: mysql username: blah host: blah.local database: blah

foo: adapter: mysql username: foo host: foo.local database: foo

class Foo < ActiveRecord::Base db_magic :connection => :fooend

class Bar < ActiveRecord::Base db_magic :connection => :bar, :slave => :bar_slaveend

Tuesday, September 24, 13

Page 19: Can railsscale

Persistence Layer Issues

• Connection pooling

• Datasource switching

• High-Availability

• Redis

Tuesday, September 24, 13

Page 20: Can railsscale

High-Availability

Database

ActiveRecord

db_charmer*

Data Access Logic

Business Logic

* https://github.com/kovyrin/db-charmerTuesday, September 24, 13

Page 21: Can railsscale

• Multiple datasources

• Master - Slave

• Sharding

• High-Availability

• Read & Write

• Read

• None

High-Availability

Tuesday, September 24, 13

Page 22: Can railsscale

Sharding types

• Modulo function

• Data-dictionary

Tuesday, September 24, 13

Page 23: Can railsscale

Example (1)

question_shard_244_247: <<: *question_shard_host_base_srvb71 database: shard244_247 shards: 244..247

question_shard_248_251: <<: *question_shard_host_base_srvb71 database: shard248_251 shards: 248..251

Tuesday, September 24, 13

Page 24: Can railsscale

Example (2)

class User < ActiveRecord::Base

def questions(access_mode=:read) on_question_shard(self, access_mode) end

end

user.questions().answered.latest

user.questions(:read_write).build({...})

Tuesday, September 24, 13

Page 25: Can railsscale

Example (3)def on_question_shard(access_mode=:read_write, &block) accessor = shard_accessor(access_mode)

question_data_source.shard_for(accessor, nil, &block)end

def shard_for_key(accessor) raise ShardAccessError, 'accessor missing' unless accessor

raise ShardAccessError, 'access denied' unless @shard_access.shard_accessible?(accessor.key, accessor.access_mode)

shard_connection_config( data_source_name(accessor.key) )end

Tuesday, September 24, 13

Page 26: Can railsscale

Persistence Layer Issues

• Connection pooling

• Datasource switching

• High-Availability

• Redis

Tuesday, September 24, 13

Page 27: Can railsscale

Redis Sharding

• ShardMap

• HashRing

• DataDictionary

Tuesday, September 24, 13

Page 28: Can railsscale

Proposed topics

• Persistence Layer

• Application Layer

• Infrastructure

• Code scalability

• Rails Tools Scalability

• Misc

Tuesday, September 24, 13

Page 29: Can railsscale

Application Layer

• Ruby threads

• Configuration

• Queue

• Uploads

• Production Log

• Statistics

Tuesday, September 24, 13

Page 30: Can railsscale

Application Layer

• Ruby threads

• Configuration

• Queue

• Uploads

• Production Log

• Statistics

Tuesday, September 24, 13

Page 31: Can railsscale

Ruby threads

• Multithreading in Ruby sucks :)

Tuesday, September 24, 13

Page 32: Can railsscale

Ruby threads

• Parallel DB calls

• Third-party services

• Any service :)

Tuesday, September 24, 13

Page 33: Can railsscale

Application Layer

• Ruby threads

• Configuration

• Queue

• Uploads

• Production Log

• Statistics

Tuesday, September 24, 13

Page 34: Can railsscale

Configuration

• database.yml

• email.yml

• redis.yml

• ...

• system.yml

• ...

Tuesday, September 24, 13

Page 35: Can railsscale

Centralized configuration

Tuesday, September 24, 13

Page 36: Can railsscale

Centralized configuration

if defined?(PhusionPassenger) PhusionPassenger.on_event(:starting_worker_process) do |forked| if forked Rlt::Configuration::UpdateWatcher::start(askfm_config.store) else end endelse Rlt::Configuration::UpdateWatcher::start(askfm_config.store)end

Tuesday, September 24, 13

Page 37: Can railsscale

Application Layer

• Ruby threads

• Configuration

• Queue

• Uploads

• Production Log

• Statistics

Tuesday, September 24, 13

Page 38: Can railsscale

Queue

• Resque

Tuesday, September 24, 13

Page 39: Can railsscale

Application Layer

• Ruby threads

• Configuration

• Queue

• Uploads

• Production Log

• Statistics

Tuesday, September 24, 13

Page 40: Can railsscale

Upload

• Goliath* application (non-blocking ruby web server)

• 4 servers

• 2.5M Uploads a day

* https://github.com/postrank-labs/goliath/

Tuesday, September 24, 13

Page 41: Can railsscale

Application Layer

• Ruby threads

• Configuration

• Queue

• Uploads

• Production Log

• Statistics

Tuesday, September 24, 13

Page 42: Can railsscale

Graylog

Tuesday, September 24, 13

Page 43: Can railsscale

Application Layer

• Ruby threads

• Configuration

• Queue

• Uploads

• Production Log

• Statistics

Tuesday, September 24, 13

Page 44: Can railsscale

Statistics

• Business metrics

• Application metrics

• Performance metrics

• Errors

Tuesday, September 24, 13

Page 45: Can railsscale

Statistics

Tuesday, September 24, 13

Page 46: Can railsscale

Statistics

Tuesday, September 24, 13

Page 47: Can railsscale

Proposed topics

• Persistence Layer

• Application Layer

• Infrastructure

• Code scalability

• Rails Tools Scalability

• Misc

Tuesday, September 24, 13

Page 48: Can railsscale

Infrastructure

• Memory leaks

• Timeout

Tuesday, September 24, 13

Page 49: Can railsscale

Proposed topics

• Persistence Layer

• Application Layer

• Infrastructure

• Code scalability

• Rails Tools Scalability

• Misc

Tuesday, September 24, 13

Page 50: Can railsscale

Code scalability

• MVC

• ActiveRecord

• Tests

• DB Migrations

Tuesday, September 24, 13

Page 51: Can railsscale

Proposed topics

• Persistence Layer

• Application Layer

• Infrastructure

• Code scalability

• Rails Tools Scalability

• Misc

Tuesday, September 24, 13

Page 52: Can railsscale

Rails tools scalability

• NewRelic

• Exceptional.io

• Google Analytics

• Capistrano

Tuesday, September 24, 13

Page 53: Can railsscale

Proposed topics

• Persistence Layer

• Application Layer

• Infrastructure

• Code scalability

• Rails Tools Scalability

• Misc

Tuesday, September 24, 13

Page 54: Can railsscale

GC Tunning

Tuesday, September 24, 13

Page 55: Can railsscale

Ruby 2.0

Tuesday, September 24, 13

Page 56: Can railsscale

jRuby

Tuesday, September 24, 13

Page 57: Can railsscale

Event Machine

Tuesday, September 24, 13