HomePhabricator

Automatically sever databases after prolonged unreachability

Description

Automatically sever databases after prolonged unreachability

Summary:
Ref T4571. When a database goes down briefly, we fall back to replicas.

However, this fallback is slow (not good for users) and keeps sending a lot of traffic to the master (might be bad if the root cause is load-related).

Keep track of recent connections and fully degrade into "severed" mode if we see a sequence of failures over a reasonable period of time. In this mode, we send much less traffic to the master (faster for users; less load for the database).

We do send a little bit of traffic still, and if the master recovers we'll recover back into normal mode seeing several connections in a row succeed.

This is similar to what most load balancers do when pulling web servers in and out of pools.

For now, the specific numbers are:

  • We do at most one health check every 3 seconds.
  • If 5 checks in a row fail or succeed, we sever or un-sever the database (so it takes about 15 seconds to switch modes).
  • If the database is currently marked unhealthy, we reduce timeouts and retries when connecting to it.

Test Plan:

  • Configured a bad master.
  • Browsed around for a bit, initially saw "unrechable master" errors.
  • After about 15 seconds, saw "major interruption" errors instead.
  • Fixed the config for master.
  • Browsed around for a while longer.
  • After about 15 seconds, things recovered.
  • Used "Cluster Databases" console to keep an eye on health checks: it now shows how many recent health checks were good:

Screen Shot 2016-04-10 at 2.50.41 PM.png (136×658 px, 25 KB)

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T4571

Differential Revision: https://secure.phabricator.com/D15677