- # HAProxy configuration - haproxy-db.cfg
- ##
- ## FRONTEND ##
- ##
- # Load-balanced IPs for DB writes and reads
- #
- frontend db_write
- bind 172.16.0.50:3306
- default_backend cluster_db_write
- frontend db_read
- bind 172.16.0.51:3306
- default_backend cluster_db_read
- # Monitor DB server availability
- #
- frontend monitor_db01
- #
- # set db01_backup to 'up' or 'down'
- #
- bind 127.0.0.1:9301
- mode http
- #option nolinger
- acl no_repl_db01 nbsrv(db01_replication) eq 0
- acl no_repl_db02 nbsrv(db02_replication) eq 0
- acl no_db01 nbsrv(db01_status) eq 0
- acl no_db02 nbsrv(db02_status) eq 0
- monitor-uri /dbs
- monitor fail unless no_repl_db01 no_repl_db02 no_db02
- monitor fail if no_db01 no_db02
- frontend monitor_db02
- #
- # set db02_backup to 'up' or 'down'
- #
- bind 127.0.0.1:9302
- mode http
- #option nolinger
- acl no_repl_db01 nbsrv(db01_replication) eq 0
- acl no_repl_db02 nbsrv(db02_replication) eq 0
- acl no_db01 nbsrv(db01_status) eq 0
- acl no_db02 nbsrv(db02_status) eq 0
- monitor-uri /dbs
- monitor fail unless no_repl_db01 no_repl_db02 no_db01
- monitor fail if no_db01 no_db02
- frontend monitor_db03
- #
- # set db03 read-only slave to 'down'
- #
- bind 127.0.0.1:9303
- mode http
- #option nolinger
- acl no_repl_db03 nbsrv(db03_replication) eq 0
- acl no_repl_db01 nbsrv(db01_replication) eq 0
- acl db02 nbsrv(db02_status) eq 1
- monitor-uri /dbs
- monitor fail if no_repl_db03
- monitor fail if no_repl_db01 db02
- frontend monitor_db04
- #
- # set db04 read-only slave to 'down'
- #
- bind 127.0.0.1:9304
- mode http
- #option nolinger
- acl no_repl_db04 nbsrv(db04_replication) eq 0
- acl no_repl_db01 nbsrv(db01_replication) eq 0
- acl db02 nbsrv(db02_status) eq 1
- monitor-uri /dbs
- monitor fail if no_repl_db04
- monitor fail if no_repl_db01 db02
- frontend monitor_db05
- #
- # set db05 read-only slave to 'down'
- #
- bind 127.0.0.1:9305
- mode http
- #option nolinger
- acl no_repl_db05 nbsrv(db05_replication) eq 0
- acl no_repl_db02 nbsrv(db02_replication) eq 0
- acl db01 nbsrv(db01_status) eq 1
- monitor-uri /dbs
- monitor fail if no_repl_db05
- monitor fail if no_repl_db02 db01
- # Monitor for split-brain syndrome
- #
- frontend monitor_splitbrain
- #
- # set db01_splitbrain and db02_splitbrain to 'up'
- #
- bind 127.0.0.1:9300
- mode http
- #option nolinger
- acl no_repl01 nbsrv(db01_replication) eq 0
- acl no_repl02 nbsrv(db02_replication) eq 0
- acl db01 nbsrv(db01_status) eq 1
- acl db02 nbsrv(db02_status) eq 1
- monitor-uri /dbs
- monitor fail unless no_repl01 no_repl02 db01 db02
- ##
- ## BACKEND ##
- ##
- # Check every DB server replication status
- # - perform an http check on port 9201 (replication status)
- # - set to 'down' if response is '503 Service Unavailable'
- # - set to 'up' if response is '200 OK'
- #
- backend db01_replication
- mode tcp
- balance roundrobin
- option tcpka
- option httpchk
- server db01 172.16.0.60:3306 check port 9201 inter 1s rise 1 fall 1
- backend db02_replication
- mode tcp
- balance roundrobin
- option tcpka
- option httpchk
- server db02 172.16.0.61:3306 check port 9201 inter 1s rise 1 fall 1
- backend db03_replication
- mode tcp
- balance roundrobin
- option tcpka
- option httpchk
- server db03 172.16.0.63:3306 check port 9201 inter 1s rise 1 fall 1
- backend db04_replication
- mode tcp
- balance roundrobin
- option tcpka
- option httpchk
- server db04 172.16.0.64:3306 check port 9201 inter 1s rise 1 fall 1
- backend db05_replication
- mode tcp
- balance roundrobin
- option tcpka
- option httpchk
- server db05 172.16.0.65:3306 check port 9201 inter 1s rise 1 fall 1
- # Check Master DB server mysql status
- # - perform an http check on port 9200 (mysql status)
- # - set to 'down' if response is '503 Service Unavailable'
- # - set to 'up' if response is '200 OK'
- #
- backend db01_status
- mode tcp
- balance roundrobin
- option tcpka
- option httpchk
- server db01 172.16.0.60:3306 check port 9200 inter 1s rise 2 fall 2
- backend db02_status
- mode tcp
- balance roundrobin
- option tcpka
- option httpchk
- server db02 172.16.0.61:3306 check port 9200 inter 1s rise 2 fall 2
- # DB write cluster
- # Failure scenarios:
- # - replication 'up' on db01 & db02 = writes to db01
- # - replication 'down' on db02 = writes to db01
- # - replication 'down' on db01 = writes to db02
- # - replication 'down' on db01 & db02 = go nowhere, split-brain, cluster FAIL!
- # - mysql 'down' on db02 = writes to db01_backup
- # - mysql 'down' on db01 = writes to db02_backup
- # - mysql 'down' on db01 & db02 = go nowhere, cluster FAIL!
- #
- backend cluster_db_write
- #
- # - max 1 db server available at all times
- # - db01 is preferred (top of list)
- # - db_backups set their 'up' or 'down' based on results from monitor_dbs
- #
- mode tcp
- option tcpka
- balance roundrobin
- option httpchk GET /dbs
- server db01 172.16.0.60:3306 weight 1 check port 9201 inter 1s rise 2 fall 1
- server db02 172.16.0.61:3306 weight 1 check port 9201 inter 1s rise 2 fall 1 backup
- server db01_backup 172.16.0.60:3306 weight 1 check port 9301 inter 1s rise 2 fall 2 addr 127.0.0.1 backup
- server db02_backup 172.16.0.61:3306 weight 1 check port 9302 inter 1s rise 2 fall 2 addr 127.0.0.1 backup
- # DB read cluster
- # Failure scenarios
- # - replication 'up' on db01 & db02 = reads on db01, db02, all db_slaves
- # - replication 'down' on db02 = reads on db01, slaves of db01
- # - replication 'down' on db01 = reads on db02, slaves of db02
- # - replication 'down' on db01 & db02 = reads on db01_splitbrain and db01_splitbrain only
- # - mysql 'down' on db02 = reads on db01_backup, slaves of db01
- # - mysql 'down' on db01 = reads on db02_backup, slaves of db02
- # - mysql 'down' on db01 & db02 = go nowhere, cluster FAIL!
- #
- backend cluster_db_read
- #
- # - max 2 master db servers available at all times
- # - max N slave db servers available at all times except during split-brain
- # - dbs track 'up' and 'down' of dbs in the cluster_db_write
- # - db_backups track 'up' and 'down' of db_backups in the cluster_db_write
- # - db_splitbrains set their 'up' or 'down' based on results from monitor_splitbrain
- #
- mode tcp
- option tcpka
- balance roundrobin
- option httpchk GET /dbs
- server db01 172.16.0.60:3306 weight 1 track cluster_db_write/db01
- server db02 172.16.0.61:3306 weight 1 track cluster_db_write/db02
- server db01_backup 172.16.0.60:3306 weight 1 track cluster_db_write/db01_backup
- server db02_backup 172.16.0.61:3306 weight 1 track cluster_db_write/db02_backup
- server db01_splitbrain 172.16.0.60:3306 weight 1 check port 9300 inter 1s rise 1 fall 2 addr 127.0.0.1
- server db02_splitbrain 172.16.0.61:3306 weight 1 check port 9300 inter 1s rise 1 fall 2 addr 127.0.0.1
- #
- # Scaling & redundancy options
- # - db_slaves set their 'up' or 'down' based on results from monitor_dbs
- # - db_slaves should take longer to rise
- #
- server db03_slave 172.16.0.63:3306 weight 1 check port 9303 inter 1s rise 5 fall 1 addr 127.0.0.1
- server db04_slave 172.16.0.64:3306 weight 1 check port 9304 inter 1s rise 5 fall 1 addr 127.0.0.1
- server db05_slave 172.16.0.65:3306 weight 1 check port 9305 inter 1s rise 5 fall 1 addr 127.0.0.1