Warm a standby database with some percentage of real production query traffic.
It's common for Heroku customers to have a standby database follower in the event of a primary failure, however if you cutover to that follower and it hasn't yet served any queries you're likely in for a rough time until its SQL and page caches warm up.
Burninator uses a Redis pub/sub channel to broadcast some percentage of query traffic from Rails application servers to a central warming process that will run queries against the follower. It uses the ActiveSupport notifications instrumentation API to listen for queries.
Since your standby is seeing some percentage of real production query traffic, its caches should keep warm and ready for failover.
- Rails application (only tested against 3.2.12)
- Ruby 1.9+
- Redis
$ heroku config:add WARM_TARGET_URL="postgres://..."
gem "burninator"
burninator = Burninator.new($redis)
burninator.broadcast(percentage: 25)
-
If you leave off the
redis
parameter, it will create a new connection using what's configured in the environment asREDIS_URL
. -
percentage
will default to 5%. -
If either
WARM_TARGET_URL
is missing orREDIS_URL
is missing and aredis
parameter is not provided, aBurninator::EnvironmentError
will be raised. -
broadcast
takes an additional parameterignore
which expects a regular expression. Queries which match this regular expression will not be replayed against the standby database.
burninator: rake burninator:warm
$ heroku scale burninator=1
Please see LICENSE.