At GitHub they use MySQL as their main datastore. The setup is a typical “single-writer-multiple-readers” design. They loadbalance between server pools using HAProxy, with some cleverness built in:
Instead [of checking whether a MySQL server is live with
mysql-check
], we make our HAProxy pools context aware. We let the backend MySQL hosts make an informed decision: “should I be included in a pool or should I not?”
The HAProxy config contains all known hosts. The hosts themselves can answer to checks running with either HTTP 200
(OK), HTTP 503
(Not OK), or HTTP 404
(Maintenance). Based upon those answers HAProxy will assess if there are enough hosts in the main mysql_ro_main
pool to handle the load, and automatically switch to the failover mysql_ro_backup
pool if need be.
frontend mysql_ro
...
acl mysql_not_enough_capacity nbsrv(mysql_ro_main) lt 3
use_backend mysql_ro_backup if mysql_not_enough_capacity
default_backend mysql_ro_main
Clever.
As an extra, they’ve also integrated it all into their chatops.