for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous...

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

Transcript of for MySQL High Availability...Writing Application Code for MySQL High Availability 13 Asynchronous...

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