Slide 1

Slide 1 text

Redis at Heroku Harold Giménez @hgmnz redisconf 2015 +

Slide 2

Slide 2 text

Redis at Heroku git deployment

Slide 3

Slide 3 text

proxy git push heroku master worker worker worker build service repos git push user

Slide 4

Slide 4 text

proxy git push heroku master worker worker worker build service repos build app breezing-swiftly-152 user

Slide 5

Slide 5 text

proxy git push heroku master worker worker worker build service repos I got this user

Slide 6

Slide 6 text

proxy git push heroku master worker worker worker build service repos user

Slide 7

Slide 7 text

proxy git push heroku master worker worker worker build service repos here’s my hostname and port user

Slide 8

Slide 8 text

proxy git push heroku master worker worker worker build service repos user

Slide 9

Slide 9 text

Redis at Heroku Logs

Slide 10

Slide 10 text

heroku logs --tail -a hgmnz 2010-09-16T15:13:46.677020+00:00 app[web.1]: Processing PostController#list (for 208.39.138.12 at 2010-09-16 15:13:46) [GET] 2010-09-16T15:13:46.677023+00:00 app[web.1]: Rendering template within layouts/application 2010-09-16T15:13:46.698234+00:00 app[web.1]: Completed in 74ms (View: 31, DB: 40) | 200 OK [http:// myapp.heroku.com/] 2010-09-16T15:13:46.723498+00:00 heroku[router]: at=info method=GET path="/posts" host=myapp.herokuapp.com" fwd="204.204.204.204" dyno=web.1 connect=1ms service=18ms status=200 bytes=975 2010-09-16T15:13:47.893472+00:00 app[worker.1]: 2 jobs processed at 16.6761 j/s, 0 failed ... $

Slide 11

Slide 11 text

app dyno 1 dyno 2 dyno 3 postgres primary postgres follower redis logplex config heroku logs --tail Logplex app log messages

Slide 12

Slide 12 text

Logplex canaries msg producer msg producer msg producer msg producer logging pipeline msg set message loss? latency?

Slide 13

Slide 13 text

Redis at Heroku Orchestration

Slide 14

Slide 14 text

Process orchestration Scaling web dynos... done, now running 10 Scaling worker dynos... done, now running 5 $ $ heroku ps:scale web=10 worker=5 -a demo-app process manager Messages sent to any Redis to boot,
 kill, restart processes dynos

Slide 15

Slide 15 text

Web dyno idling heroku router cluster keys with a 1h expiry HTTP traffic process manager which apps have had
 HTTP traffic
 in the last 24h?

Slide 16

Slide 16 text

Redis at Heroku Database Lifecycle

Slide 17

Slide 17 text

observe environment finite state machine

Slide 18

Slide 18 text

available creating uncertain unavailable deprovisioning deprovisioned

Slide 19

Slide 19 text

class Resource def feel observations.create( Feeler.new(self).current_environment ) end end class Feeler def current_environment { services_available?: service_available?, connections: connections, row_count: row_count, table_count: table_count, seq_scans: seq_scans, index_scans: index_scans } end end

Slide 20

Slide 20 text

class Resource include Stateful state :available do unless service_available? transition :uncertain end end end resource = Resource.find resource.transition :available resource.fetch_observation resource.tick puts resource.state # => :uncertain

Slide 21

Slide 21 text

module Stateful def self.included(base) base.extend ClassMethods end module ClassMethods def state(name, &block) state[name] = block end def states; @states ||={}; end end def tick self.instance_eval( &self.class.states[self.state.to_sym] ) end def transition(state); end end

Slide 22

Slide 22 text

resource.fetch_observation resource.tick Need to do this all the time

Slide 23

Slide 23 text

db1 db2 db3 db4 db5 db6 db7 db8 dbn W orkers db1.fetch_observation
 db1.tick

Slide 24

Slide 24 text

db db3 db2 db1 dbn Enqueue

Slide 25

Slide 25 text

Redis at Heroku Database Monitoring

Slide 26

Slide 26 text

Database Observations and Monitoring supervisor worker 1 worker 2 worker 3 worker 4 worker N I’m available for work

Slide 27

Slide 27 text

supervisor worker 1 worker 2 worker 3 worker 4 worker N Worker 1 monitor this DB Database Observations and Monitoring

Slide 28

Slide 28 text

supervisor worker 1 worker 2 worker 3 worker 4 worker N Database Observations and Monitoring monitor

Slide 29

Slide 29 text

supervisor worker 1 worker 2 worker 3 worker 4 worker N Database Observations and Monitoring

Slide 30

Slide 30 text

supervisor worker 1 worker 2 worker 3 worker 4 worker N I can’t reach this DB Database Observations and Monitoring

Slide 31

Slide 31 text

supervisor worker 1 worker 2 worker 3 worker 4 worker N Worker 4 monitor this DB Database Observations and Monitoring

Slide 32

Slide 32 text

supervisor worker 1 worker 2 worker 3 worker 4 worker N Database Observations and Monitoring monitor

Slide 33

Slide 33 text

worker Database Monitoring Last Observation cache postgres Heroku Postgres automation service GET /last_observation HSET db1 db_size 4213 HSET db1 cache_hit_rate 98

Slide 34

Slide 34 text

Redis at Heroku Other use cases

Slide 35

Slide 35 text

Router stats router node router node router node router node router node router node router node requests errors

Slide 36

Slide 36 text

pubsub + websockets dyno 1 dyno 2 dyno 3 pubsub browser websockets

Slide 37

Slide 37 text

I asked: what’s good and bad about Redis?

Slide 38

Slide 38 text

good bad •Fast •Simple •Powerful primitives •Expires on any data type •Many use cases, single infra •replication protocol is “surprisingly elegant” •No SSL support •Rotating creds is a pain •SPOF •Single threaded(ish)

Slide 39

Slide 39 text

Thanks! @hgmnz +