21
Writing Application Code for MySQL High Availability Jay Janssen September 10th, 2015

for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

  • Upload
    others

  • View
    16

  • Download
    0

Embed Size (px)

Citation preview

Page 1: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Writing Application Codefor MySQL High Availability

Jay Janssen September 10th, 2015

Page 2: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

EXAMPLE APPLICATIONSWriting Application Code for MySQL High Availability

2

Page 3: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Our Application

• Based on Sakila MySQL sample database • Summary table about film rentals data • "Cronjob" to update the summaries • Webservice to report data about movie

titles • Runs on master / 2 slaves with MHA

3

Page 4: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Cronjob Barebones

• Points directly to a single server • Not smart enough to deal with longer

failures • Doesn't notice read_only issues • Can't deal with results set going away

4

Page 5: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Webservice Barebones

• Clients timeout and get no server error • General freakout on MySQL down • Services requests, but errors on writes

with no log warnings • Log writes are synchronous to the client

request, adding latency

5

Page 6: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

DEALING WITH ERRORSWriting Application Code for MySQL High Availability

6

Page 7: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Types of Database Errors

• Database not available • Database disconnected • Read-only for Writes • Deadlocks and Replication conflicts (Galera) • Very slow responses • Max Connections • etc.

7

Page 8: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Dealing with those errors

• Timeouts • Give up (with Grace) • Continue anyway • Retry (how many times) • Operational vs Application errors • Service is down vs Deadlock error

8

Page 9: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Thinking about our Cronjob

• Retry on any operational errors • Prevent multi-instances somehow • Monitor the last successful run • Summaries based on a consistent view? • Writer for inserting the summary • Reads otherwise?

9

Page 10: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Cronjob Improved

• Error checking on all database interaction • Recursive retries baked in • Concurrency included • Missing: • Consistent read view • Split reads/writes • Any checking for multi-instances

10

Page 11: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Thinking about our Webservice

• Clients are intolerant of latency • quick errors vs slow answers

• Some operations are less critical • access logging vs returning an answer • Writer low priority

• High concurrency essential • Reads can be distributed across read pool

11

Page 12: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Webservice Improved

• Errors return as http 50* codes quickly • Tolerates mysql down • Access log is async and ok to fail • Missing: • Split reads/writes • Better concurrency on many results

12

Page 13: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

QUIRKS OF REPLICATIONWriting Application Code for MySQL High Availability

13

Page 14: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Asynchronous Replication

• Assume replication has small lag • Ops: Monitor for large amounts

• A pool of slaves is great for • Read capacity • Availability

14

Page 15: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Most Common Solutions for Lag

• Don't worry about it so much • Use the master when reads are critical • Rely on another datastore for high-volume

read/write critical data

15

Page 16: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Monitoring replication lag in the App

• while !slave->has ( $some_data ); • then #read • Extra round trips • Slower response • Useful with expensive critical reads

16

Page 17: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Galera Replication

• Read/Write on any node • Replication conflicts == Deadlocks • handle those anyway and retry • hotspots cause lots of conflicts

• wsrep_sync_wait for critical reads • or just use the same server to read

17

Page 18: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

READ WRITE SPLITTINGWriting Application Code for MySQL High Availability

18

Page 19: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Concerns

• Replication lag • Simplistic splitting • $query =~ m/^select/ -> slaves • Transactions? Critical reads?

• Balancing traffic well • Capacity after failure

19

Page 20: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Proxies

• Adds latency, scalability snags, operational costs • 95%+ apps split within the code • TCP (L4) proxies only work with App splits

• Haven't seen a smart L7 hardware proxy • L7 Software proxies • Try: ScaleArc($), MaxScale • Avoid: MySQL Proxy. Suspect all others

20

Page 21: for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous Replication • Assume replication has small lag • Ops: Monitor for large amounts

Conclusion

• Plan for service problems from the start • Tailor the reaction to problems based on

the type of application • Watch out for the "shortcuts" to problems

like HA and read/write splitting • https://github.com/jayjanssen/

app_mysql_ha

21