How to Upgrade a Legacy Heroku Database - without downtime
blog.sendhub.com
blog.sendhub.com
We've moved some stuff off Heroku but not because of cost, most recently we discovered they have a tight max on scala apps and it was cheaper for us to put it on aws directly, rather than code around it on Heroku.
Let's say we have 5 engineers and that kind of training costs us 1 hour per eng/per week. That's 20 hours a month, which is easily more than $1k/month and the cost grows as the team expands. This is before you account for the losses of having your own engineers on call for issues and setting up early warning systems specific to the database etc.
Hardware aside - thats largely moot on both Heroku and AWS - the 5x cost of the server will very quickly outstrip the cost of a good developer/operations guy. It seems like a good idea - I initially just throw money at a problem too! - but at some point it does not make financial sense, which is what I was getting at.
Note that we don't have every engineer on staff capable of bringing up a new server/rebuild a damaged mysql replication setup, but we do have engineers that can:
- ssh (or attempt to ssh onto) a dead instance
- tail a log
- check disk space, memory usage and cpu load
- check if something is running
- restart something that just randomly stopped
All that stuff is pretty basic, and will get you 80% of the way there - the other 20% being experience. I guess at some point you are paying for the experience of working with a datastore, so there it makes sense.As far as early warning etc., that does take time, but it's not the big deal it appears to be.
EDIT: I can't math, and 80 + 10 = 90, not 100. Good thing I'm not a data scientist :)
EDIT: munin does also ship monitoring plugins for MySQL but since I have never used them I cannot vouch for them. The general health monitoring (disk usage, CPU usage, SMART status, inode usage, ...) of the machines provided by munin is also probably more valuable than the database specific monitoring.
We are measuring it by issuing a `hr pg:info -asendhug` command which includes a field called "Data Size".
e.g.:
=== HEROKU_POSTGRESQL_GOLD (DATABASE_URL) Plan: Ika Status: available Data Size: 2.00 GB Tables: 76 PG Version: 9.1.4 Fork/Follow: Available Created: 2012-08-16 04:09 UTC Followers: HEROKU_POSTGRESQL_TANGERINE Maintenance: not required
As for whether this is the "working set/cache", it is not clear where the "Data Size" number comes from. This is an interesting question, I'll ask Heroku for more information and report back.
> Cache utilization talks about the working set size, yes.
>
> The database size typically means just the result of
> pg_database_size() on your database (you can use the
> current_database() function as a shortcut). Note that this
> does include dead tuple bloat that is regularly cleaned
> up by Postgres autovacuum, so it's more of an estimate than
> a hard number.
I'll ping them again and ask if they've found a good way to measure this. It seems like this is the most important number to look at when scaling a heroku/postgres project.
Let us know if you're in the unfortunate position of having to use it. We'd love to know if it works out for you.