MySQL Fabric:

Easy Management of MySQL Servers
Mats Kindahl (mats.kindahl@oracle.com)
Alfranio Correia (alfranio.correia@oracle.com)
Narayanan Venkateswaran (v.narayanan@oracle.com)

1Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
Safe Harbor Statement
The following is intended to outline our general product direction. It is intended
for information purposes only, and may not be incorporated into any contract.
It is not a commitment to deliver any material, code, or functionality, and
should not be relied upon in making purchasing decision. The development,
release, and timing of any features or functionality described for Oracle’s
products remains at the sole discretion of Oracle.

2

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Presentation Outline
 Introducing MySQL Fabric
 High-Availability
 Scaling
 Managing
 Connecting

3

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
MySQL Fabric
An extensible and easy-to-use
framework for managing a farm
of MySQL server supporting
high-availability and sharding

4

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Insert Picture Here
MySQL Fabric: What is it?

“Farm” Management System
●

●

●

Written in Python

●

●

Early alpha

Distributed Framework

Procedure Execution
●

●

Farm Management
●

●

Extensible
●
●
●

●
●
●

●

5

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Open Source
●

Extensions are first-class
High-Availability Groups
“Semi-Automatic” Sharding

Long road ahead
You can participate
Suggest features
Report bugs
Contribute patches

MySQL 5.6 is focus
MySQL Fabric: Goals & Features
●

Connector API Extensions
●
●

●

●
●

●

Read-Write Split
Distribute transactions

Global Updates
●
●

6

●

Global tables
Schema updates

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

●

●

Using same key

Sharding Functions
●

Reducing network load

Load Balancing

Shard Multiple Tables
●

Decision logic in connector
●

●

Support Transactions
Support full SQL

●

Range
(Consistent) Hash

Shard Operations
●
●
●

Using built-in executor
Shard move
Shard split
Transaction Handling
Hmm... looks like
a read transaction

Sharding key?

Ah, there it is!
Session state?

BEGIN;
SELECT salary INTO @s FROM salaries WHERE emp_no = 20101;
SET @s = 1.1 * @s;
What does this
INSERT INTO salaries VALUES (20101, @s);
procedure update?
COMMIT;
Oops.. it was a
BEGIN;
write transaction!
CALL update_salary(20202, @s); 
COMMIT;
Transaction done!

Clear session state?
What about connection pools?
New transaction! Different connection?
Application error?
What about the session state?
7

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Transaction Handling

●

Routing Transactions
●
●
●

●

Pre-declare properties of transactions
Detecting transaction boundaries
Push as much as possible to server

What about
crashes?

Managing Session State
●

●

8

Where do I store
the session state?

Move session state between servers
– Easy to use
– Expensive and error prone
Reset state after each transaction
– Transactions start with default session state

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

What Session
State Change?
Routing Transactions
Contain decision logic
for routing queries
QUERY
KEY

Shard #2
Switch
SHARD#

QUERY

KEY

Contain information
about location of shards

State
Store
9

Shard #1

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Shard #3

Executor
Deployment for Routing Transactions
Network hop!
Performance?
Protocol?

Single Points
of Failure!

Shard #1

Shard #2
Switch
Shard #3

State
Store
10

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Executor
Deployment for Routing Transactions
Deployed with application
(e.g., inside connector)

Shard #1

Shard #2
Switch
API simple to add
Caches can be
used to avoid
performance impact

11

Shard #3

State
Store

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Executor
Introducing MySQL Fabric
Insert Picture Here

12

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Birds-eye View

Operator

Application

Connector

XML-RPC

Connector

Connector

SQL

MySQL
Fabric
Node

SQL
High Availability Groups
(Shards)
13

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
High-Level Components
Application
●

●

●

In High-Availability Groups
Managing the data

MySQL
Fabric
Node

MySQL Fabric Node
●
●
●

14

Connector

Python, PHP, and Java
Extended Connector API

MySQL Servers
●

●

Connector

Fabric-aware Connectors
●

●

Connector

Maintain Meta-Information
Information Interfaces
Execute Procedures

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

High Availability Group
MySQL Fabric Node Architecture
Protocols
Connector

Connector

?

?

AMQP

MySQL

XML-RPC

Connector

Sh
MySQL Fabric
Framework

Executor

15

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

State Store
(Persister)

Extensions

HA

?

MySQL

Backing
Store
MySQL Fabric: Prerequisites

●

MySQL Servers (version 5.6.10 or later)
●
●

●

Python 2.6 or 2.7
●

●

No support for 3.x yet

MySQL Utilities 1.4.0
●

16

Server for meta-data backing store
Servers being managed

Available at http://labs.mysql.com/

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
MySQL Fabric: Configuration
●

Backing Store
●
●
●

●

Protocol
●
●

●

Address where node will be
Currently only XML-RPC

Logging
●
●
●

17

MySQL server
Persistent storage for state
Storage engine-agnostic

Chatty: INFO (default)
Moderate: WARNING
URL for rotating log

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

[storage]
address = localhost:3306
user = fabric
password = 
database = fabric
connection_timeout = 6
[protocol.xmlrpc]
address = localhost:8080
threads = 5
[logging]
level = INFO
url = file:///var/log/fabric.log
MySQL Fabric: Setup and Teardown

●

Create the necessary tables in backing store
mysqlfabric manage setup

●

Remove the tables from backing store
mysqlfabric manage teardown

●

Connect to database server in “storage” section
●

18

Ensure that you have the necessary users and privileges

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
MySQL Fabric: Starting and Stopping

●

Start MySQL Fabric node in foreground – print log to terminal
mysqlfabric manage start

●

Start MySQL Fabric node in background – print log to file
mysqlfabric manage start ­­daemonize 

●

Stop MySQL Fabric node
mysqlfabric manage stop

19

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Architecture for
High-Availability

20

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Insert Picture Here
High-Availability Concepts

●

Redundancy
●

●

Monitoring
●
●

●

Detecting failing components
Monitor load

Procedure
●
●

21

Duplicate critical components

Activate backups
Distribute load

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
High-Availability Group Concept

●

Group of servers
●
●

●

Generic Concept
●
●

●

Implementation-independent
Self-managed or externally managed

Different Types
●
●
●

22

Hardware redundancy
Data redundancy

Primary-Backup (Master-Slave)
Shared or Replicated Storage
MySQL Cluster

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

n
Do

e!
High-Availability Group Concept

●

Abstract Concept
●
●

●

Connector Attributes
●
●
●

●

Connection information
Mode: read-only, read-write, ...
Weight: distribute load

Management Attributes
●

23

Set of servers
Server attributes

State: state/role of the server

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

State:
Mode:
Host:

Primary
Read-Write
server-1.example.com
MySQL Fabric: Create Groups and add Servers

●

Define a group
mysqlfabric group create my_group

●

Add servers to group

User + Password
(Likely to go away)

mysqlfabric group add my_group server1.example.com 
  mats xyzzy
mysqlfabric group add my_group server2.example.com 
  mats xyzzy

24

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
MySQL Fabric: Create Groups and add Servers

●

Promote one server to be primary
mysqlfabric group promote my_group

●

Tell failure detector to monitor group
mysqlfabric group activate my_group

25

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Connecting to a
MySQL Fabric Farm

26

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Insert Picture Here
Fabric-aware Connector API

●

Connector API Extensions
●
●

●

Reducing network load

●

Read-Write Split
Distribute transactions

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Fabric-aware Connectors
●
●
●

●

●

●

Connector/J
Connector/Python
Connector/PHP

Fabric-aware Frameworks
●

Load Balancing
●

27

Support Transactions
Support full SQL

Decision logic in connector
●

●

●

Doctrine
Hibernate

Focus on Connector/Python
Fabric-aware Connector API

●

Establish a “virtual” connection
●

●

Real server connection established lazily

Provide connection information for the Fabric node
●

Fabric node will provide information about real servers

import mysql.connector.fabric as connector
conn = connector.MySQLFabricConnection(
    fabric={"host": "fabric.example.com", "port" : 8080},
    user='mats', database="employees")

28

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Connector API: Executing a Transaction

●

Provide group name
●
●

Property: group
Fabric will compute candidate
servers

●

Provide transaction type
●
●

Property: type
Fabric will pick server in right
mode

conn.set_property(group='my_group', type=TYPE_READWRITE)
cur = conn.cursor()
cur.execute("INSERT INTO employees VALUES (%s,%s,%s)",
            (emp_no, first_name, last_name))
cur.execute("INSERT INTO titles(emp_no,title,from_date)"
            “ VALUES (%s,%s,CURDATE())",
            (emp_no, 'Intern'));
conn.commit()
Transactions work fine!
29

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Architecture for
Sharding

30

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Insert Picture Here
Benefits of Sharding

●

Write scalability
●

●

Large data set
●
●

●

Database too large
Does not fit on single server

Improved performance
●
●
●

31

Can handle more writes

Smaller index size
Smaller working set
Improve performance

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

UID 10000-20000

UID 20001-40000
MySQL Fabric: Sharding Goals & Features
●

Connector API Extensions
●
●

●

●

Using same key

Global Updates
●
●

32

Reducing network load

Shard Multiple Tables
●

●

Support Transactions
Support full SQL

Decision logic in connector
●

●

Global tables
Schema updates

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Sharding Functions
●
●

●

Range
(Consistent) Hash

Shard Operations
●
●
●

Using built-in executor
Shard move
Shard split
Mapping the Sharding Key

What is a sharding key?
●
●

How is the key transformed?
●
●
●

33

Hash
Range
User-defined

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Compute
Shard#

Shard#

●

Single column
Multi column
– Same table?
– Different tables?

Key

●

(X)
(X,Y,...)

RANGE
HASH
Something else
Sharded Tables

Table
salaries

Foreign keys

Rows
284 404 700

titles

44 330 800

employees

30 002 400

dept_emp

In desperate need
of sharding!

33 160 300

dept_manager
departments

34

2 400
900

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Multi-table Query with Sharded Tables

SELECT first_name, last_name, salary
FROM salaries JOIN employees USING (emp_no)
WHERE emp_no = 21012
AND CURRENT_DATE BETWEEN from_date AND to_date;

●

Referential Integrity Constraint
●
●

●

JOIN normally based on equality
●

35

Example query joining salaries and employees
Same key, same shard: co-locate rows for same user
Using non-equality defeats purpose of foreign key

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Global Tables

Table
salaries

Rows
284 404 700

titles

44 330 800

employees

30 002 400

dept_emp

33 160 300

dept_manager
departments

2 400
900
Do not really need
to be sharded

36

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Multi-table Query with Global Tables

SELECT first_name, last_name, GROUP_CONCAT(dept_name)
FROM employees JOIN dept_emp USING (emp_no)
JOIN departments USING (dept_no)
WHERE emp_no = 21012 GROUP BY emp_no;

●

JOIN with departments table
●
●

●

37

Has no employee number, hence no sharding key
Table need to be present on all shards

How do we update global tables?

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Sharding Architecture
MySQL
Fabric Node

Global
Group
Global Updates
Connector

Replication

Connector

Application
Connector

Shard
Updates

Shards

38

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Support global update
for off-line shards
MySQL Fabric: Sharding Setup

●

Set up some groups
●
●
●

●

Create a shard mapping
●
●
●

●

39

my_global – for global updates
my_group.* – for the shards
Add servers to the groups
A “distributed database”
Mapping keys to shards
Give information on what tables are sharded

Add shards

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
MySQL Fabric: Set up Shard Mapping
Per-mapping Global Group
(Likely to go away)
●

Define shard mapping

Will show the shard map
identifier (a number)

mysqlfabric sharding define hash my_global
●

Add tables that should be sharded
mysqlfabric sharding add_mapping 1 
  employees.employees emp_no
mysqlfabric sharding add_mapping 1 
  employees.salaries emp_no

●

40

Tables not added are global

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Shard map identifier
MySQL Fabric: Add Shards

●

Add shards to shard mapping

Shard map identifier

mysqlfabric sharding add_shard 1 my_group.1 enabled
    .
    .
    .
mysqlfabric sharding add_shard 1 my_group.N enabled

41

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
MySQL Fabric: Moving and Splitting Shards

●

Moving a shard from one group to another
mysqlfabric sharding move 5 my_group.5

●

Splitting a shard into two pieces (hash)
mysqlfabric sharding split 5 my_group.6

42

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Shard ID
Digression: Computing Shards

●

●

●

Compute
Shard#

Extra properties passed out-of-band

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

Shard#

Tables + sharding key

Extended Connector API
●

43

Which mapping to use?
Application don't care
… but know tables in transaction
Currently only one mapping

Computing shard requires
●

●

Key

Multiple Mappings
●

●

Compute
Map#

Map#

Tables
Connector API: Shard Specific Query

●

Provide tables in query
●
●

Property: tables
Fabric will compute map

●

Provide sharding key
●
●

Property: key
Fabric will compute shard

conn.set_property(tables=['employees.employees', 'employees.titles'],
                  key=emp_no)
cur = conn.cursor()
cur.execute("INSERT INTO employees VALUES (%s,%s,%s)",
            (emp_no, first_name, last_name))
cur.execute("INSERT INTO titles(emp_no, title, from_date)"
            “ VALUES (%s, %s, CURDATE())",
            (emp_no, 'Intern'));
conn.commit()
Transactions work fine!
44

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Connector API: Shard Specific Query

●

Provide tables in query
●
●

Property: tables
Fabric will compute map

●

Provide sharding key
●
●

Property: key
Fabric will compute shard

conn.set_property(tables=['employees.employees', 'employees.titles'],
                  key=emp_no)
cur = conn.cursor()
Join queries are sent to correct
cur.execute(
    "SELECT first_name, last_name, title"
shard and executed there
    "  FROM employees JOIN titles USING (emp_no)"
    " WHERE emp_no = %d", (emp_no,))
for row in cur:
    print row[0], row[1], “,“, row[2]

45

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Connector API: Global Update

●

Provide tables in query
●
●
●

Property: tables
Fabric will compute map
(Likely to not be needed)

●

Set global scope
●
●

Property: scope
Query goes to global group

conn.set_property(tables=['employees.titles'], scope='GLOBAL')
cur = conn.cursor()
cur.execute("ALTER TABLE employees.titles ADD nickname VARCHAR(64)")

46

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Closing Remarks
Insert Picture Here

47

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
What do we have now?
●

MySQL Farm Management
●
●

●

Enhanced Connectors
●

High-Availability
Sharding

●
●

●

High-Availability
●
●
●

Group Concept
Simple failure detector
Slave promotion

●

Sharding
●
●
●

●

Connector APIs
●
●

48

Transaction properties
“Logical” connection
management

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

●

Connector/Python
Connector/PHP
Connector/J
Range and hash sharding
Shard move and shard split
Global tables and updates

Command-line Interface
●
●

Easy setup and management
XML-RPC Interfaces
Thoughts for the Future

●

Connector multi-cast
●
●
●

●

●

●

●

Improving usability
Focus on ease-of-use

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

MySQL-RPC Protocol?
AMQP?

●

More frameworks?

●

More HA group types
●
●

Command-line interface
●

49

Improve extension support
Improve procedures support

More protocols
●

Internal interfaces
●

●

Scatter-gather
UNION of result sets
More complex operations?

●

●

DRBD
MySQL Cluster

Fabric-unaware connectors?
Thoughts for the Future

●

“More transparent” sharding
●
●

●

Independent tables

Multi-way shard split
●
●

50

Single-query transactions
Cross-shard join is a problem

Efficient initial sharding
Better use of resources

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

High-availability executor
●
●
●

Multiple shard mappings
●

●

●

●

Node failure stop execution
Replicated State Machine
Fail over to other Fabric node

Distributed failure detector
●
●

Connectors report failures
Custom failure detectors
Want to contribute?

●

Check it
… and send us use-case and feature suggestions

●

Test it
… and send comments to the forum

●

Break it
… and send in bugs to http://bugs.mysql.com

51

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Reading for the Interested

●

MySQL Forum: Fabric, Sharding, HA, Utilities
http://forums.mysql.com/list.php?144

●

A Brief Introduction to MySQL Fabric

http://mysqlmusings.blogspot.com/2013/09/brief-introduction-to-mysql-fabric.html

●

MySQL Fabric – Sharding – Introduction

http://vnwrites.blogspot.com/2013/09/mysqlfabric-sharding-introduction.html

●

Writing a Fault-tolerant Database Application using MySQL Fabric

http://alfranio-distributed.blogspot.se/2013/09/writing-fault-tolerant-database.html

52

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Keeping in Touch

Mats Kindahl

Twitter: @mkindahl
Blog: http://mysqlmusings.blogspot.com

Alfranio Correia

Twitter: @alfranio
Blog: http://alfranio-distributed.blogspot.com

Narayanan Venkateswaran

Twitter: @vn_tweets
Blog: http://vnwrites.blogspot.com

53

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
Thank you!

54

Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |

MySQL Fabric: Easy Management of MySQL Servers

  • 1.
    MySQL Fabric: Easy Managementof MySQL Servers Mats Kindahl (mats.kindahl@oracle.com) Alfranio Correia (alfranio.correia@oracle.com) Narayanan Venkateswaran (v.narayanan@oracle.com) 1Copyright © 2013, Oracle and/or its affiliates. All rights reserved.
  • 2.
    Safe Harbor Statement Thefollowing is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decision. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. 2 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 3.
    Presentation Outline  IntroducingMySQL Fabric  High-Availability  Scaling  Managing  Connecting 3 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 4.
    MySQL Fabric An extensibleand easy-to-use framework for managing a farm of MySQL server supporting high-availability and sharding 4 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Insert Picture Here
  • 5.
    MySQL Fabric: Whatis it? “Farm” Management System ● ● ● Written in Python ● ● Early alpha Distributed Framework Procedure Execution ● ● Farm Management ● ● Extensible ● ● ● ● ● ● ● 5 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Open Source ● Extensions are first-class High-Availability Groups “Semi-Automatic” Sharding Long road ahead You can participate Suggest features Report bugs Contribute patches MySQL 5.6 is focus
  • 6.
    MySQL Fabric: Goals& Features ● Connector API Extensions ● ● ● ● ● ● Read-Write Split Distribute transactions Global Updates ● ● 6 ● Global tables Schema updates Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | ● ● Using same key Sharding Functions ● Reducing network load Load Balancing Shard Multiple Tables ● Decision logic in connector ● ● Support Transactions Support full SQL ● Range (Consistent) Hash Shard Operations ● ● ● Using built-in executor Shard move Shard split
  • 7.
    Transaction Handling Hmm... lookslike a read transaction Sharding key? Ah, there it is! Session state? BEGIN; SELECT salary INTO @s FROM salaries WHERE emp_no = 20101; SET @s = 1.1 * @s; What does this INSERT INTO salaries VALUES (20101, @s); procedure update? COMMIT; Oops.. it was a BEGIN; write transaction! CALL update_salary(20202, @s);  COMMIT; Transaction done! Clear session state? What about connection pools? New transaction! Different connection? Application error? What about the session state? 7 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 8.
    Transaction Handling ● Routing Transactions ● ● ● ● Pre-declareproperties of transactions Detecting transaction boundaries Push as much as possible to server What about crashes? Managing Session State ● ● 8 Where do I store the session state? Move session state between servers – Easy to use – Expensive and error prone Reset state after each transaction – Transactions start with default session state Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | What Session State Change?
  • 9.
    Routing Transactions Contain decisionlogic for routing queries QUERY KEY Shard #2 Switch SHARD# QUERY KEY Contain information about location of shards State Store 9 Shard #1 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Shard #3 Executor
  • 10.
    Deployment for RoutingTransactions Network hop! Performance? Protocol? Single Points of Failure! Shard #1 Shard #2 Switch Shard #3 State Store 10 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Executor
  • 11.
    Deployment for RoutingTransactions Deployed with application (e.g., inside connector) Shard #1 Shard #2 Switch API simple to add Caches can be used to avoid performance impact 11 Shard #3 State Store Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Executor
  • 12.
    Introducing MySQL Fabric InsertPicture Here 12 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 13.
    Birds-eye View Operator Application Connector XML-RPC Connector Connector SQL MySQL Fabric Node SQL High AvailabilityGroups (Shards) 13 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 14.
    High-Level Components Application ● ● ● In High-AvailabilityGroups Managing the data MySQL Fabric Node MySQL Fabric Node ● ● ● 14 Connector Python, PHP, and Java Extended Connector API MySQL Servers ● ● Connector Fabric-aware Connectors ● ● Connector Maintain Meta-Information Information Interfaces Execute Procedures Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | High Availability Group
  • 15.
    MySQL Fabric NodeArchitecture Protocols Connector Connector ? ? AMQP MySQL XML-RPC Connector Sh MySQL Fabric Framework Executor 15 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | State Store (Persister) Extensions HA ? MySQL Backing Store
  • 16.
    MySQL Fabric: Prerequisites ● MySQLServers (version 5.6.10 or later) ● ● ● Python 2.6 or 2.7 ● ● No support for 3.x yet MySQL Utilities 1.4.0 ● 16 Server for meta-data backing store Servers being managed Available at http://labs.mysql.com/ Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 17.
    MySQL Fabric: Configuration ● BackingStore ● ● ● ● Protocol ● ● ● Address where node will be Currently only XML-RPC Logging ● ● ● 17 MySQL server Persistent storage for state Storage engine-agnostic Chatty: INFO (default) Moderate: WARNING URL for rotating log Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | [storage] address = localhost:3306 user = fabric password =  database = fabric connection_timeout = 6 [protocol.xmlrpc] address = localhost:8080 threads = 5 [logging] level = INFO url = file:///var/log/fabric.log
  • 18.
    MySQL Fabric: Setupand Teardown ● Create the necessary tables in backing store mysqlfabric manage setup ● Remove the tables from backing store mysqlfabric manage teardown ● Connect to database server in “storage” section ● 18 Ensure that you have the necessary users and privileges Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 19.
    MySQL Fabric: Startingand Stopping ● Start MySQL Fabric node in foreground – print log to terminal mysqlfabric manage start ● Start MySQL Fabric node in background – print log to file mysqlfabric manage start ­­daemonize  ● Stop MySQL Fabric node mysqlfabric manage stop 19 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 20.
    Architecture for High-Availability 20 Copyright ©2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Insert Picture Here
  • 21.
    High-Availability Concepts ● Redundancy ● ● Monitoring ● ● ● Detecting failingcomponents Monitor load Procedure ● ● 21 Duplicate critical components Activate backups Distribute load Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 22.
    High-Availability Group Concept ● Groupof servers ● ● ● Generic Concept ● ● ● Implementation-independent Self-managed or externally managed Different Types ● ● ● 22 Hardware redundancy Data redundancy Primary-Backup (Master-Slave) Shared or Replicated Storage MySQL Cluster Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | n Do e!
  • 23.
    High-Availability Group Concept ● AbstractConcept ● ● ● Connector Attributes ● ● ● ● Connection information Mode: read-only, read-write, ... Weight: distribute load Management Attributes ● 23 Set of servers Server attributes State: state/role of the server Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | State: Mode: Host: Primary Read-Write server-1.example.com
  • 24.
    MySQL Fabric: CreateGroups and add Servers ● Define a group mysqlfabric group create my_group ● Add servers to group User + Password (Likely to go away) mysqlfabric group add my_group server1.example.com    mats xyzzy mysqlfabric group add my_group server2.example.com    mats xyzzy 24 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 25.
    MySQL Fabric: CreateGroups and add Servers ● Promote one server to be primary mysqlfabric group promote my_group ● Tell failure detector to monitor group mysqlfabric group activate my_group 25 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 26.
    Connecting to a MySQLFabric Farm 26 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Insert Picture Here
  • 27.
    Fabric-aware Connector API ● ConnectorAPI Extensions ● ● ● Reducing network load ● Read-Write Split Distribute transactions Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Fabric-aware Connectors ● ● ● ● ● ● Connector/J Connector/Python Connector/PHP Fabric-aware Frameworks ● Load Balancing ● 27 Support Transactions Support full SQL Decision logic in connector ● ● ● Doctrine Hibernate Focus on Connector/Python
  • 28.
    Fabric-aware Connector API ● Establisha “virtual” connection ● ● Real server connection established lazily Provide connection information for the Fabric node ● Fabric node will provide information about real servers import mysql.connector.fabric as connector conn = connector.MySQLFabricConnection(     fabric={"host": "fabric.example.com", "port" : 8080},     user='mats', database="employees") 28 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 29.
    Connector API: Executinga Transaction ● Provide group name ● ● Property: group Fabric will compute candidate servers ● Provide transaction type ● ● Property: type Fabric will pick server in right mode conn.set_property(group='my_group', type=TYPE_READWRITE) cur = conn.cursor() cur.execute("INSERT INTO employees VALUES (%s,%s,%s)",             (emp_no, first_name, last_name)) cur.execute("INSERT INTO titles(emp_no,title,from_date)"             “ VALUES (%s,%s,CURDATE())",             (emp_no, 'Intern')); conn.commit() Transactions work fine! 29 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 30.
    Architecture for Sharding 30 Copyright ©2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Insert Picture Here
  • 31.
    Benefits of Sharding ● Writescalability ● ● Large data set ● ● ● Database too large Does not fit on single server Improved performance ● ● ● 31 Can handle more writes Smaller index size Smaller working set Improve performance Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | UID 10000-20000 UID 20001-40000
  • 32.
    MySQL Fabric: ShardingGoals & Features ● Connector API Extensions ● ● ● ● Using same key Global Updates ● ● 32 Reducing network load Shard Multiple Tables ● ● Support Transactions Support full SQL Decision logic in connector ● ● Global tables Schema updates Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Sharding Functions ● ● ● Range (Consistent) Hash Shard Operations ● ● ● Using built-in executor Shard move Shard split
  • 33.
    Mapping the ShardingKey What is a sharding key? ● ● How is the key transformed? ● ● ● 33 Hash Range User-defined Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Compute Shard# Shard# ● Single column Multi column – Same table? – Different tables? Key ● (X) (X,Y,...) RANGE HASH Something else
  • 34.
    Sharded Tables Table salaries Foreign keys Rows 284404 700 titles 44 330 800 employees 30 002 400 dept_emp In desperate need of sharding! 33 160 300 dept_manager departments 34 2 400 900 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 35.
    Multi-table Query withSharded Tables SELECT first_name, last_name, salary FROM salaries JOIN employees USING (emp_no) WHERE emp_no = 21012 AND CURRENT_DATE BETWEEN from_date AND to_date; ● Referential Integrity Constraint ● ● ● JOIN normally based on equality ● 35 Example query joining salaries and employees Same key, same shard: co-locate rows for same user Using non-equality defeats purpose of foreign key Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 36.
    Global Tables Table salaries Rows 284 404700 titles 44 330 800 employees 30 002 400 dept_emp 33 160 300 dept_manager departments 2 400 900 Do not really need to be sharded 36 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 37.
    Multi-table Query withGlobal Tables SELECT first_name, last_name, GROUP_CONCAT(dept_name) FROM employees JOIN dept_emp USING (emp_no) JOIN departments USING (dept_no) WHERE emp_no = 21012 GROUP BY emp_no; ● JOIN with departments table ● ● ● 37 Has no employee number, hence no sharding key Table need to be present on all shards How do we update global tables? Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 38.
    Sharding Architecture MySQL Fabric Node Global Group GlobalUpdates Connector Replication Connector Application Connector Shard Updates Shards 38 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Support global update for off-line shards
  • 39.
    MySQL Fabric: ShardingSetup ● Set up some groups ● ● ● ● Create a shard mapping ● ● ● ● 39 my_global – for global updates my_group.* – for the shards Add servers to the groups A “distributed database” Mapping keys to shards Give information on what tables are sharded Add shards Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 40.
    MySQL Fabric: Setup Shard Mapping Per-mapping Global Group (Likely to go away) ● Define shard mapping Will show the shard map identifier (a number) mysqlfabric sharding define hash my_global ● Add tables that should be sharded mysqlfabric sharding add_mapping 1    employees.employees emp_no mysqlfabric sharding add_mapping 1    employees.salaries emp_no ● 40 Tables not added are global Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Shard map identifier
  • 41.
    MySQL Fabric: AddShards ● Add shards to shard mapping Shard map identifier mysqlfabric sharding add_shard 1 my_group.1 enabled     .     .     . mysqlfabric sharding add_shard 1 my_group.N enabled 41 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 42.
    MySQL Fabric: Movingand Splitting Shards ● Moving a shard from one group to another mysqlfabric sharding move 5 my_group.5 ● Splitting a shard into two pieces (hash) mysqlfabric sharding split 5 my_group.6 42 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Shard ID
  • 43.
    Digression: Computing Shards ● ● ● Compute Shard# Extraproperties passed out-of-band Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | Shard# Tables + sharding key Extended Connector API ● 43 Which mapping to use? Application don't care … but know tables in transaction Currently only one mapping Computing shard requires ● ● Key Multiple Mappings ● ● Compute Map# Map# Tables
  • 44.
    Connector API: ShardSpecific Query ● Provide tables in query ● ● Property: tables Fabric will compute map ● Provide sharding key ● ● Property: key Fabric will compute shard conn.set_property(tables=['employees.employees', 'employees.titles'],                   key=emp_no) cur = conn.cursor() cur.execute("INSERT INTO employees VALUES (%s,%s,%s)",             (emp_no, first_name, last_name)) cur.execute("INSERT INTO titles(emp_no, title, from_date)"             “ VALUES (%s, %s, CURDATE())",             (emp_no, 'Intern')); conn.commit() Transactions work fine! 44 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 45.
    Connector API: ShardSpecific Query ● Provide tables in query ● ● Property: tables Fabric will compute map ● Provide sharding key ● ● Property: key Fabric will compute shard conn.set_property(tables=['employees.employees', 'employees.titles'],                   key=emp_no) cur = conn.cursor() Join queries are sent to correct cur.execute(     "SELECT first_name, last_name, title" shard and executed there     "  FROM employees JOIN titles USING (emp_no)"     " WHERE emp_no = %d", (emp_no,)) for row in cur:     print row[0], row[1], “,“, row[2] 45 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 46.
    Connector API: GlobalUpdate ● Provide tables in query ● ● ● Property: tables Fabric will compute map (Likely to not be needed) ● Set global scope ● ● Property: scope Query goes to global group conn.set_property(tables=['employees.titles'], scope='GLOBAL') cur = conn.cursor() cur.execute("ALTER TABLE employees.titles ADD nickname VARCHAR(64)") 46 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 47.
    Closing Remarks Insert PictureHere 47 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 48.
    What do wehave now? ● MySQL Farm Management ● ● ● Enhanced Connectors ● High-Availability Sharding ● ● ● High-Availability ● ● ● Group Concept Simple failure detector Slave promotion ● Sharding ● ● ● ● Connector APIs ● ● 48 Transaction properties “Logical” connection management Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | ● Connector/Python Connector/PHP Connector/J Range and hash sharding Shard move and shard split Global tables and updates Command-line Interface ● ● Easy setup and management XML-RPC Interfaces
  • 49.
    Thoughts for theFuture ● Connector multi-cast ● ● ● ● ● ● ● Improving usability Focus on ease-of-use Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | MySQL-RPC Protocol? AMQP? ● More frameworks? ● More HA group types ● ● Command-line interface ● 49 Improve extension support Improve procedures support More protocols ● Internal interfaces ● ● Scatter-gather UNION of result sets More complex operations? ● ● DRBD MySQL Cluster Fabric-unaware connectors?
  • 50.
    Thoughts for theFuture ● “More transparent” sharding ● ● ● Independent tables Multi-way shard split ● ● 50 Single-query transactions Cross-shard join is a problem Efficient initial sharding Better use of resources Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 | High-availability executor ● ● ● Multiple shard mappings ● ● ● ● Node failure stop execution Replicated State Machine Fail over to other Fabric node Distributed failure detector ● ● Connectors report failures Custom failure detectors
  • 51.
    Want to contribute? ● Checkit … and send us use-case and feature suggestions ● Test it … and send comments to the forum ● Break it … and send in bugs to http://bugs.mysql.com 51 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 52.
    Reading for theInterested ● MySQL Forum: Fabric, Sharding, HA, Utilities http://forums.mysql.com/list.php?144 ● A Brief Introduction to MySQL Fabric http://mysqlmusings.blogspot.com/2013/09/brief-introduction-to-mysql-fabric.html ● MySQL Fabric – Sharding – Introduction http://vnwrites.blogspot.com/2013/09/mysqlfabric-sharding-introduction.html ● Writing a Fault-tolerant Database Application using MySQL Fabric http://alfranio-distributed.blogspot.se/2013/09/writing-fault-tolerant-database.html 52 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 53.
    Keeping in Touch MatsKindahl Twitter: @mkindahl Blog: http://mysqlmusings.blogspot.com Alfranio Correia Twitter: @alfranio Blog: http://alfranio-distributed.blogspot.com Narayanan Venkateswaran Twitter: @vn_tweets Blog: http://vnwrites.blogspot.com 53 Copyright © 2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |
  • 54.
    Thank you! 54 Copyright ©2013, Oracle and/or its affiliates. All rights reserved.| Percona Live | London, UK, November 12th 2013 |