MySQL Cluster 7.5 inside and out - Mikael Ronström - E-Book

MySQL Cluster 7.5 inside and out E-Book

Mikael Ronström

0,0

Beschreibung

MySQL Cluster has been developed for more than 20 years. The amount of innovative ideas in the product deserves a thorough description. This book covers the reasons why NDB was developed, the initial requirements and what applications it is used in. Covers internal algorithms and how they interact with external APIs and configuration. Contains a thorough description of how you configure both NDB and Linux for optimal performance and availability. Covers the NDB APIs, the replication between clusters, how to use MySQL Cluster with Docker, how to use NDB in the Cloud. You will learn how to use the benchmark tool dbt2-0.37.50.15 that is heavily used to benchmark MySQL Cluster.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern

Seitenzahl: 1207

Veröffentlichungsjahr: 2018

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



CONTENTS

A

BOUT

M

Y

SQL

C

LUSTER

7.5

0.1 About the author Mikael Ronstrőm

0.2 Purpose of the book

W

HEN

TO

USE

M

Y

SQL

C

LUSTER

1

W

HAT

IS

SPECIAL

WITH

M

Y

SQL

C

LUSTER

1.1 AlwaysOn for reads and writes

1.2 Global solution for replication

1.3 Consistency of data in large clusters

1.4 High read and write Scalability

1.5 Predictable response time

1.6 Base platform for data storage

1.7 Multi-dimensional scaling

1.8 Non-blocking 2PC transaction protocol

1.9 Global checkpoints

1.10 Automatically Parallelised and Distributed Queries

2

R

ATIONALE

FOR

M

Y

SQL

C

LUSTER

2.1 Separation of Data Server and Query Server

2.2 Predictable response time requirements

2.3 MySQL Cluster and multi-core architectures

2.4 Shared nothing architecture

2.5 MySQL Cluster and the CAP theorem

2.6 OLTP, OLAP and relational models

2.7 Data storage requirements

3

U

SE

CASES

FOR

M

Y

SQL

C

LUSTER

3.1 Networking applications

3.2 Telecom servers

3.3 Gaming systems

3.4 Financial applications

3.5 Fraud Detection

3.6 Web applications

3.7 Soft real-time applications

3.8 Oracle OpenStack

3.9 GE

3.10 Hadoop File Server

3.11 LDAP Server

3.12 NoSQL Applications

3.13 Conclusion

4

NDB

AND

I

NNO

DB

4.1 Differences between NDB and InnoDB

4.2 Consistency Model differences

4.3 Foreign Key differences

4.4 Differences in Online Change

4.5 Challenges in replacing InnoDB

5

M

Y

SQL

C

LUSTER

AND

I

NNO

DB

C

LUSTER

5.1 Comparison to Galera Cluster

5.2 Group Replication

5.3 Differences between MySQL clustering solutions

5.4 Differences in query execution

5.5 Differences in recovery

5.6 Differences in handling node failures

5.7 Sharding differences

5.8 Multi-master differences

5.9 Detailed differences

5.10 What clustering solution to select

I

NTRODUCTION

TO

DATABASE

CONCEPTS

6

R

ELATION

M

ODEL

6.1 Basic concepts

6.2 Distributed Relational Model

6.3 Replicated Relational Model

6.4 Hashmaps

6.5 Read backup replica tables

6.6 Fully replicated tables

7

T

RANSACTIONAL

M

ODEL

7.1 Basic transaction theory

7.2 Locking theory

7.3 Distributed transactions

8

C

OMPUTER

M

ODEL

8.1 CPU Core

8.2 CPU Socket

8.3 Computer

8.4 Computer network

8.5 Distributed Data Centers

I

NTRODUCTION

TO

M

Y

SQL

C

LUSTER

9

M

Y

SQL

C

LUSTER

A

RCHITECTURE

9.1 Node group concept (Shards)

9.2 Program types

10

M

Y

SQL

C

LUSTER

API

S

10.1 MySQL APIs

10.2 Direct NDB APIs

10.3 memcached

10.4 OpenLDAP

G

ETTING

S

TARTED

11

G

ETTING

S

TARTED

FOR

D

EVELOPERS

11.1 Getting Started on Mac OS X

11.2 Getting Started on Windows

11.3 Using MySQL Cluster Configurator for development

12

I

NSTALLING

M

Y

SQL

C

LUSTER

12.1 Installing using

yum

12.2 Installing using

apt

12.3 Installing using

Zypper

on Suse

12.4 MySQL Cluster packages

12.5 Install using an RPM package

12.6 Installing on Debian

12.7 Installing tarballs on Linux

12.8 Installing on Solaris

12.9 Preparing to run MySQL Cluster on Linux

12.10 Installing on FreeBSD

13

S

TARTING

P

ROGRAMS

13.1 Order of starting

13.2 Starting

ndb_mgmd

13.3 Starting

ndbmtd

13.4 Starting a MySQL Server (

mysqld

)

13.5 Starting

ndb_mgm

13.6 Starting

mcmd

14

M

Y

SQL

C

LUSTER

CONFIGURATION

FILES

14.1 General rules for MySQL configuration files

14.2 Cluster configuration file

14.3 MySQL configuration file

15

M

Y

SQL

C

LUSTER

AND

D

OCKER

15.1 Using Docker to avoid installation problems

15.2 Using Docker on a single host

15.3 Using Docker overlay network

15.4 Using Docker Swarm

15.5 Setting the password on MySQL Server container

15.6 Running the NDB management client

15.7 Using Docker to limit memory resources

15.8 Using Docker to limit CPU resources

15.9 Using Docker and cgroups to control CPU and memory

16

B

UILDING

M

Y

SQL

C

LUSTER

16.1 Linux

16.2 Solaris

16.3 FreeBSD

16.4 Mac OS X

16.5 Windows

17

H

W

SETUPS

FOR

M

Y

SQL

C

LUSTER

17.1 Single host setup

17.2 NDB as an In-memory storage engine for MySQL

17.3 Minimum configuration for AlwaysOn

17.4 Setting up MySQL Cluster for secure operation

17.5 Scaling out from the simple HA setup

17.6 Set up of MySQL Cluster for multi-cluster apps

M

Y

SQL

C

LUSTER

AS

A

SQL

E

NGINE

18

B

ASIC

SQL

STATEMENTS

18.1 Create a table

18.2 Altering a table

18.3 Querying a table

18.4 Writing to a table

18.5 Transactions

18.6 Drop/Truncate Table

18.7 Indexes

18.8 Foreign Keys

18.9 Optimize/Analyze Table

18.10 BLOBs

18.11 Row format of NDB tables

18.12 Disk Data Columns

18.13 MySQL Replication of NDB tables

19

NDB

R

OW

D

ATA

STRUCTURE

19.1 Row format

19.2 Fixed row format

19.3 Dynamic row format

20

F

OREIGN

K

EY

HANDLING

20.1 Foreign key considerations

21

B

LOB

HANDLING

22

D

ISK

COLUMNS

22.1 Row format for disk columns

22.2 Tablespaces

22.3 UNDO log

22.4 Syntax for disk data

22.5 Page Manager

22.6 Considerations for disk data tables

23

T

ABLE

OPTIONS

23.1 Read Backup feature

23.2 Fully replicated tables

23.3 Partitioning of tables

23.4 Considerations for selecting number of partitions

23.5 Partition Balance

23.6 Setting explicit number of partitions

23.7 No REDO logging

23.8 Schema Considerations

24

M

Y

SQL

C

ONCEPTS

IN

NDB

STORAGE

ENGINE

24.1 MySQL Queries

24.2 MySQL Databases

24.3 MySQL Triggers

24.4 MySQL Views

24.5 MySQL Events

24.6 MySQL Stored Procedures

24.7 MySQL Functions

24.8 MySQL User Management

24.9 MySQL Transactions

24.10 Savepoints

24.11 MySQL Prepared Statements

24.12 MySQL Explain statements

24.13 Table locks

24.14 XA support

25

A

LTERING

A

T

ABLE

25.1 Online meta data operations

25.2 Online Add Column

25.3 Online Create Tablespace

25.4 Online Create Logfile group

25.5 Online Add Node

25.6 Optimize Table

25.7 Reorganise Table

25.8 Offline meta data operations

C

ONCEPTS

IN

M

Y

SQL

C

LUSTER

26

N

ON

-

BLOCKING

2PC

26.1 Idea behind new two-phase commit protocol

26.2 Achieving a non-blocking commit protocol

26.3 Global checkpoint protocol

26.4 Handling cluster crash

26.5 Impact of Read Backup feature

26.6 Conclusions

27

R

OUTING

OF

READS

AND

WRITES

27.1 Choosing the MySQL Server

27.2 Choosing the node of the transaction coordinator

27.3 Choosing the

tc

thread

27.4 Choosing the data node for reading

27.5 Choosing the

ldm

thread

27.6 Choosing the data nodes for writing

28

C

ONCURRENCY

C

ONTROL

28.1 Row locking

28.2 Consistency Models

28.3 Read Committed mode

28.4 Locking and Unique indexes

28.5 Locking and BLOB tables

29

P

ARALLEL

Q

UERY

29.1 Full table scan in NDB

29.2 Range scan in NDB

29.3 Partition pruned range scans

29.4 Pushdown joins

29.5 Condition pushdown

30

S

PECIALISED

M

Y

SQL

S

ERVERS

T

OOLS

TO

IMPORT

AND

EXPORT

DATA

31

IMPORT

DATA

31.1

ndb_restore

using Backups

31.2 Importing from mysqldump files

31.3 Alter Table

31.4

mysqlimport

32

E

XPORT

DATA

32.1

mysqldump

32.2 SELECT INTO OUTFILE

33

B

ACKUP

33.1 Backup algorithm

33.2 The START BACKUP command

33.3 Aborting a backup

33.4 Backup file placement

33.5 Backup configuration

33.6 Backup file management

33.7 Backing up metadata in MySQL Cluster

34

R

ESTORE

34.1 Restoring metadata

34.2 Partial restore

34.3 Restore for upgrade

34.4 Restore as part of MySQL Cluster Replication

34.5 Restoring Distributed Privileges

34.6 Various other use cases for

ndb_restore

34.7 Special parameters for

ndb_restore

V

III

M

Y

SQL

C

LUSTER

API

S

35

C

++

NDB

API

35.1 Meta data operations

35.2 Initialising the NDB API and MySQL client API

35.3 Concurrency in the NDB API

35.4 Ndb cluster connection

35.5 Ndb object

35.6 Setting up a row

35.7 Transactions

35.8 Key operations

35.9 Scan operations

35.10 Options

35.11 Scan partitioning info

35.12 Interpreter commands as part of NDB API operations

35.13 Scan example

35.14 NDB Event API

35.15 Pushdown Join

35.16 Asynchronous API

35.17

flexAsynch

Architecture

36

C

LUSTERJ,

API

FOR

J

AVA

AND

SCALA

36.1 Installing ClusterJ

36.2 Compiling ClusterJ applications

36.3 Executing a ClusterJ application

36.4 ClusterJ annotations

36.5 Startup example code

36.6 Session Object

36.7 Transactions

36.8 Creating a query

36.9 Column type mappings

36.10 ClusterJ reconnect

36.11 Dynamic mapping of rows

37

N

ODE.JS

API

37.1 Installing Database Jones

37.2 Installing

ndb

adapter

37.3 The Tweet sample application

37.4 ConnectionProperties

37.5 Cluster connection object

37.6 Startup example

37.7 Session operations

37.8 Final comments

I

X

G

LOBAL

REPLICATION

38

I

NTERNALS

OF

M

Y

SQL

C

LUSTER

R

EPLICATION

38.1 Data node triggers

38.2 Epochs

38.3 Epoch Buffers

38.4 Send buffers

38.5 MySQL replication server internals

38.6 Limitations of MySQL Cluster Replication

39

M

ULTI

-S

ITE

M

Y

SQL

C

LUSTER

39.1 MySQL Replication

39.2 Architecture of MySQL Cluster Replication

39.3 Tables used by MySQL Cluster Replication

39.4 Epochs

39.5 Setting up a replication channel between two clusters

39.6 Point-in-Time backups

39.7 Read Slave Clusters

39.8 Characteristics of slave applier for NDB

39.9 Purging MySQL Replication files

40

G

LOBAL

F

AIL

-

OVER

A

RCHITECTURE

40.1 Setup for fail-over scenario

40.2 Discovering failure of a replication channel

40.3 Discover failure of a cluster

40.4 Cluster fail over

41

G

LOBALLY

D

ISTRIBUTED

M

Y

SQL

C

LUSTER

41.1

NDB$MAX_DELETE_WIN(column_name)

41.2

NDB$OLD(column_name)

41.3

NDB$EPOCH2

41.4 Conflict detection tables

41.5 Setup for circular replication

41.6

ndb-log-update-as-minimal

41.7 Insert-Insert conflicts

42

E

XTREMELY

A

VAILABLE

S

OLUTIONS

42.1 Setting up transaction-based conflict detection

42.2 Characteristics of this solution

42.3 Conflict handling

42.4 More comments

X

M

ANAGEMENT

OF

M

Y

SQL

C

LUSTER

43

N

DBINFO

T

ABLES

43.1 Reasons to use

ndbinfo

43.2 How ndbinfo works

43.3 Metadata tables

43.4 Connection information

43.5 Configuration information

43.6 Transaction information

43.7 Live transaction information

43.8 Memory information

43.9 Thread statistics

43.10 Node information

43.11 Restart information

43.12 Local checkpoint information

43.13 Disk page cache information

43.14 Communication information

43.15 Status of REDO and UNDO logs

43.16 Fragment statistics

43.17 Error messages

43.18 Summary of

ndbinfo

information

44

NDB

MANAGEMENT

CLIENT

ndb_mgm

44.1 SHOW command

44.2 START/STOP commands

44.3 REPORT command

44.4 STATUS command

44.5 PROMPT command

44.6 ENTER SINGLE USER MODE command

44.7 CLUSTERLOG command

44.8 DUMP command

44.9 EXIT/QUIT command

44.10 CONNECT command

44.11 PURGE STALE SESSIONS

45

C

LUSTER

LOG

AND

NODE

LOGS

45.1 The Cluster log

45.2 Management server node log

45.3 Data node logs

45.4 Summary of logs

46

T

ROUBLESHOOTING

NDB

46.1 Data node crash output

46.2 Debugging MySQL Cluster

47

O

NLINE

CHANGES

OF

C

ONFIGURATION

47.1 Cluster configuration

47.2 Adding nodes to the cluster

47.3 Managing the configuration database

47.4 Procedure to perform online config changes

47.5 Online changes of MySQL Server configuration

47.6 Online add MySQL Server

47.7 Online change of data node configuration

47.8 Online add data node

X

I

R

ECOVERY

IN

M

Y

SQL

C

LUSTER

48

C

RASH

HANDLING

48.1 Replication inside a cluster

48.2 Failures supported from a fully functional cluster

48.3 Arbitrator

48.4 External Arbitrator

48.5 Handling startup and network partitioning

49

NDB

R

ECOVERY

A

RCHITECTURE

49.1 Transaction protocol

49.2 Transaction coordinator failure protocol

49.3 Global Checkpoint protocol

49.4 Local checkpoint protocol

49.5 Schema transaction protocol

49.6 Node registration protocol

49.7 Heartbeat protocol

49.8 Node failure protocol

49.9 Graceful shutdown protocol

49.10 Watchdog handling

49.11 Node restart activities

49.12 Initial node restart activities

50

O

PTIMISING

RESTART

TIMES

50.1 Early phases

50.2 Load data phase

50.3 UNDO log execution

50.4 REDO log execution

50.5 Rebuild ordered indexes

50.6 Rebuild unique indexes

50.7 Copy fragment phase

50.8 Local checkpoint phase

50.9 Initial node restart

50.10 Handling MySQL Replication Servers

50.11 Final words

51

NDB

STARTUP

51.1 Initial start

51.2 Node restart

51.3 System restart

51.4 Initial node restart

51.5 NDB start phases

X

II

I

NTERNALS

OF

NDB

C

LUSTER

52

D

ATA

N

ODE

A

RCHITECTURE

52.1 Block and Signal Architecture

52.2 Receive handling in Data Node

52.3 Send handling in Data Node

52.4 NDB connection setup protocol

52.5 NDB signal header definition

53

API

N

ODE

A

RCHITECTURE

53.1 Cluster connection

53.2 User threads

53.3 NDB API send threads

53.4 NDB API receive threads

53.5 NDB API cluster manager threads

53.6 Blocks in API nodes

54

B

LOCKS

IN

A

D

ATA

N

ODE

54.1 LDM Blocks

54.2 TC blocks

54.3 Main thread blocks

54.4 Rep blocks

54.5 THRMAN

54.6 TRPMAN

55

V

IRTUAL

M

ACHINE

IN

D

ATA

N

ODES

55.1 Thread types in

ndbmtd

55.2 Communication between threads in

ndbmtd

55.3 Scheduler in

ndbmtd

55.4 Single-threaded Data Nodes,

ndbd

56

D

ETAILED

NDB

I

NTERNALS

56.1 Internal triggers in MySQL Cluster

56.2 Transporter Model

56.3 Memory Allocation principles

56.4 Angel process

57

S

IGNAL

FLOWS

IN

NDB

57.1 Key operations

57.2 Table scan operations

57.3 Pushdown joins

57.4 Foreign Keys

57.5 Table Reorganisation

57.6 Meta data operations

57.7 Cluster Manager operations

57.8 Local checkpoint protocol

X

III

C

ONFIGURING

M

Y

SQL

C

LUSTER

58

P

ROCEDURE

TO

DEFINE

CONFIGURATION

58.1 Setting

NoOfReplicas

and

NoOfFragmentLogParts

58.2 Setting up nodes

58.3 Example

config.ini

59

C

ONFIGURING

D

ATA

N

ODES

59.1 Configuring memory resources

59.2 Configuring Transaction resources

59.3 Configuring Schema resources

59.4 Event configuration

59.5 Basic thread configurations

59.6 Restart configuration

59.7 Configuring Deadlock Detection

59.8 Configuring logging

59.9 Diskless configuration

59.10 Watchdog checks

59.11 Configuring index statistics

59.12 Specialized configuration options

59.13 Example

config.ini

60

C

ONFIGURATION

OF

API

AND

MGM

N

ODES

60.1 Configuring send buffers

60.2 Configuring arbitration

60.3 Configuring scan batching

60.4 Connect configuration

60.5

HeartbeatThreadPriority

60.6

DefaultOperationRedoProblemAction

60.7

DefaultHashmapSize

60.8

ApiVerbose

60.9 Management server nodes

60.10 Example configuration

61

C

OMMUNICATION

CONFIGURATION

61.1 Configuring send buffers

61.2

Group

61.3

SendSignalId

61.4

Checksum

61.5

OverloadLimit

61.6

ReceiveBufferMemory

61.7 Configuring OS properties

62

C

ONFIGURING

M

Y

SQL

C

LUSTER

FILE

SYSTEMS

62.1 Directory placement

62.2 Compressed files

62.3 Configuring the REDO log files and local checkpoints

62.4 Configuring backups

62.5 Configuring global checkpoints

62.6 Memory Buffers for disk columns

62.7 New tablespace and undo log files

62.8 File system configurations

62.9 Final words

63

C

ONFIGURING

THE

M

Y

SQL

S

ERVER

63.1 Basic MySQL server options

63.2 Connection options

63.3 Defaults for table creation

63.4 Alter table options

63.5 Execution options

63.6 Optimizer options

63.7 Receive thread configuration

63.8 MySQL Cluster replication setup

63.9

--ndb-show-foreign-key-mock-tables

63.10 Version information

63.11

--core-file

63.12 MySQL Server Status variables

64

A

NALYSIS

OF

HYPERTHREADING

PERFORMANCE

64.1

x86

servers

64.2 SPARC servers

65

A

DVANCED

T

HREAD

C

ONFIGURATIONS

65.1 Setting up ndbd for real-time operation

65.2 Setting up ndbtmd for real-time operations

66

L

INUX

CONFIGURATION

66.1 Linux infrastructure

66.2 Linux receive interrupt handling

66.3 Transmit Packet Steering (XPS)

66.4 Linux CPU isolation

66.5 Conclusion

66.6 Example CPU budget

67

B

ASIC

CONFIGURATION

SETUP

X

IV

V

ARIOUS

TOPICS

68

P

LATFORM

SUPPORT

68.1 MySQL Cluster on x86

68.2 MySQL Cluster on Linux

68.3 MySQL Cluster on Windows

68.4 MySQL Cluster on Solaris

68.5 MySQL Cluster on Mac OS X

68.6 MySQL Cluster on Intel NUC

68.7 MySQL Cluster on FreeBSD

68.8 MySQL Cluster on ARM

68.9 MySQL Cluster on Power

69

M

Y

SQL

C

LUSTER

IN

THE

C

LOUD

69.1 General considerations

69.2 Cloud Architectures

69.3 Cloud instances for MySQL Cluster

69.4 Size of MySQL Servers in the Cloud

69.5 Availability Domains/ Zones

69.6 Azure cloud

70

T

EST

FRAMEWORK

70.1 MTR

70.2 Autotest

70.3 Hugo

70.4 Battery of tests

70.5 Unit tests

70.6 Manual tests

71

DBT2-0.37.50

B

ENCHMARK

SCRIPTS

71.1 How to setup benchmarks on Linux/Solaris/Mac OS X

71.2 Sysbench benchmark

71.3 DBT2 benchmark

71.4 flexAsynch benchmark

71.5 Restart tests

71.6 Advanced configurations

72

H

ISTORY

OF

M

Y

SQL

C

LUSTER

73

M

Y

SQL

C

LUSTER

VERSIONS

73.1 MySQL Cluster 7.5

73.2 MySQL Cluster 7.4

73.3 MySQL Cluster 7.3

73.4 MySQL Cluster 7.2

73.5 MySQL Cluster 6.3

ABOUTMYSQLCLUSTER7.5

MySQL Cluster is a combination of the MySQL Server and the NDB storage engine. NDB is a distributed data server supporting tables with in-memory rows and indexes and non-indexed data stored on disk. MySQL is a query server that can use multiple storage engines beneath. MySQL has a wide variety of interfaces from all possible languages. Being a part of MySQL, NDB has access to all of those interfaces. In addition NDB can be accessed from many other direct interfaces to its data services. Thus MySQL Cluster have a large breadth in how it can be used together with the possibility to have optimised access paths for applications requiring this. We will use the terms MySQL Cluster, NDB Cluster and NDB interchangably in the book.

NDB always uses transactions to change the database content. At any point in time the data is recoverable. One of the key concepts in MySQL Cluster is to support all sorts of management changes while still being fully operational and the database content is available for both read and write.

NDB was designed with telecom databases in mind. Thus both high availability and high performance and predictable response times are very important. The development of HW has led to a tremendous increase in what can be supported by an in-memory database. In addition the disk parts in NDB can be used to build file systems and other storage systems with many petabytes of data in them. HopsFS is an example of such a file system implementing Hadoop HDFS on top of NDB, using NDB for the Name Nodes of HDFS.

The MySQL Cluster 7.5 software have been designed to handle these new computers with a special focus on real-time applications with ALWAYS ON as a keyword. It can support large database sizes with up to a few terabytes per cluster and using disk columns this can increase another tenfold.

MySQL Cluster 7.5 offers a much greater ability to use NDB for web applications that require read scalability more than write scalability. Thus 7.5 has greatly expanded the number of use cases where NDB is a good fit. We hope to expand even further in upcoming versions of MySQL Cluster. MySQL Cluster 7.4 improved restart performance and made a major quality improvement.

We expect that the most important selector for using MySQL Cluster is its very high availability. It is used in applications with billions of users relying on it to always be up and running to use their phones, smart phones, games of all sorts, financial services and even as part of very large storage systems. Most importantly NDB can handle writes when upgrading software, when scaling out the system, when adding new columns to tables, when adding new indexes to tables, when taking backups, when performing various checkpoints.

Applications that require predictable response times is another target category for MySQL Cluster usage. NDB have many parts that are developed in order to be able to deliver a real-time experience although being built on top of standard operating systems such as Linux, Solaris, Windows and Mac OS X. NDB can deliver predictable response times per query down to round about 100 microseconds even in a loaded cluster.

Write intensive applications is a key category of MySQL Cluster. NDB is designed to always support writes through all management operations. All algorithms are designed to handle as much write throughput as read throughput. Applications that do massive amounts of updates is an important use case for MySQL Cluster.

NDB is designed for scalable applications where all application servers always can see the latest view on data, even when running with hundreds of application servers. This is a notable difference to other MySQL clustering solutions that require the application to divide the application into shards that are more or less standalone parts and even within the same shard it is necessary to route write transactions and read transactions differently.

MySQL Cluster is a true distributed database, all applications see the same view of data, independent of which replica and which shard they access and independent of which MySQL Server or API node they use to access the cluster.

Performance is something that NDB shines in as well.

NDB have shown how to handle 200 million reads per second in one cluster already a few years ago. SICS have showed that a Hadoop File Server (HopsFS) can handle more than 1 million file operations even with just 12 data nodes showing scalability going from 2 to 12 data nodes and going from 2 to 60 HDFS name nodes.

For writes NDB have been shown to handle a billion updates per minute in benchmarks. There are users that perform a million updating transactions per second in normal operation.

MySQL Cluster has a number of auto-parallelisation features such that SQL queries can be parallelised automatically by the MySQL Server and the NDB Data servers.

0.1 ABOUTTHEAUTHORMIKAELRONSTRŐM

Mikael Ronstrőm has been working on NDB since he started performing his Ph.D research on databases and mathematics in the early 1990s while working in the Ericsson systems department.

The first demo version of NDB was version 0.3 that was demoed for the swedish telco operator Telia in 1998 where an AXE switch queried NDB for number translations where NDB was running on a pair of Sun SPARC computers interconnected with Dolphin SCI cards and interconnected to the AXE switch using Ethernet. The response time requirement was an essential initial requirement together with the ability to manage switch data from a database API external to the AXE switch. The demo showed off response times in the order of 4 milliseconds from the request made in the CPU of the AXE, transferred over a local network in the AXE to a regional processor that implemented the Ethernet, over Ethernet and TCP/IP over to one of the SPARC computers, from there it requested the data in any of the two SPARC computers over SCI and it was passed the same way back. The telco industry in the 1980s and 1990s was driven by a need to move the data of the telco network into computers that were accessible through standardised interfaces such as SQL, CORBA and many other standard interfaces. At the same time this data needed to be accessible in predictable times which led to requirements of accessing data in milliseconds and performing fairly complex data interactions in this time. The predictable response time requirement led to requirements on a main-memory DBMS. Telco databases will get requests for its data around the clock since there is always someone making a phone call or using some other telecom service. This led to requirements of a highly available DBMS.

Since then the author has been busy continuing this development. From 1999 to 2003 this development happened inside Ericsson Business Innovation, since 2003 this development has been a part of MySQL. Mikael Ronstrőm has also developed many other areas of the MySQL Server such as MySQL Partitioning, the MySQL Thread pool and he led the development to scale the MySQL Server from 4 CPUs to 64 CPUs during 2008 to 2012. He has been involved in early phases of the MySQL Fabric development, assisted the MySQL replication team to scale MySQL replication better. His current assignment at Oracle is as Senior MySQL Architect.

In 2006 he worked as an independent consultant on MySQL matters in MySQL, Dolphin and local swedish companies.

In addition during his days as a consultant he started the development of the benchmark suite that MySQL now releases as dbt2-0.37.50.15. This benchmark tool is presented in this book.

0.2PURPOSEOFTHEBOOK

I have been busy researching and developing NDB for the past 25 years. The last 10 years I have considered writing a book about MySQL Cluster. Until now I always concluded that it was more important to spend my time on developing yet one more feature or improving the performance or fixing some bug.

In 2015 I felt that the time had come to write a book on what has been developed in MySQL Cluster. This insight comes from a number of factors. First the product is becoming more and more general purpose and thus can be used by more and more people. Early users of NDB were advanced users that were willing to spend a considerable effort to understand and make use of the unique characteristics of it.

Another reason is that the product has so many interesting features that is hard to fully grasp unless you describe how the product can be used. The MySQL manual is a good tool to understand details in how MySQL Cluster works, how to set it up, how to configure it and so forth. But this book is intended to explain when it is feasible to use NDB and understand also why all the configuration options exists. It ensures that all concepts are fully explained such that it is possible for students to understand the description of how it works.

This book explains a lot more details on some advanced configuration options that I personally use a lot when setting up MySQL Cluster. It describes use cases for various ways of managing it. It goes to some effort in describing what hardware or cloud configurations that can be efficiently used to run NDB on.

Another reason is simply that it fills a gap, there is no such book describing describing both internals and use of MySQL Cluster.

The purpose is to further the understanding of what MySQL Cluster can do in a world where scalable real-time data servers is becoming more and more important. It has matured in an environment with very high requirements on availability. It has been shown in 15 years to deliver not only 5 9’s of availability but even 6 9’s of availability. This means that in production it has been shown to have less than 30 seconds of downtime per year with a large set of servers making up the statistical population.

If you build infrastructure that depends on high availability data you should read this book about MySQL Cluster 7.5 to see what it can do for you.

The book is targeted towards the specific MySQL Cluster version 7.5, this version is based on the MySQL 5.7 version together with many important improvements of the NDB storage engine. Most of the book is applicable to older versions of NDB. We will provide some information about what has been added in 7.3, 7.4, 7.5.

It is not a book about MySQL InnoDB Cluster. It provides a comparison of MySQL clustering based on NDB compared to MySQL InnoDB Cluster and other similar MySQL clustering solutions, to aid a user in understanding what solution to use. This book is about MySQL clustering based on NDB.

It is not a book about SQL, although some mentioning of SQL statements will be presented, there are other books describing how to use SQL in a much better way. It will primarily mention if there are special things in SQL required to use MySQL Cluster in an efficient manner.

PARTI

WHENTOUSEMYSQLCLUSTER

CHAPTER1

WHATISSPECIALWITHMYSQLCLUSTER

MySQL Cluster is a DBMS (DataBase Management System) that is designed for the most demanding mission-critical applications in the telecom network, in internet infrastructure applications, in financial applications, in storage infrastructure applications, in web applications, in mobile apps and many other applications such as gaming, train control, vehicle control and a lot more you probably can come up with better than me.

It is probably the DBMS with the highest availability statistics surpassing most competitors by more than a magnitude higher availability.

When a transaction in NDB has completed, all replicas have been updated and you will always be able to see your own updates. This is an important feature that makes application development a lot easier compared to when using eventual consistency.

The requirements from the telecom network was that complex transactions have to be completed in ten milliseconds. NDB supports this requirement and this makes NDB useful also in financial applications and many other application categories that require bounded latency on the queries.

It is also known by the names NDB, NDB Cluster and MySQL NDB Cluster where NDB stands for Network DataBase.

It is designed with the following features in mind:

Class 6 Availability (less than 30 seconds downtime per year)

Data consistency in large clusters

High Write Scalability and Read Scalability

Predictable response time

Available with MySQL interface, LDAP interface, file system interfaces

Available with APIs from all modern languages

To reach Class 6 NDB supports online software changes, online schema changes, online add node, global solutions with highly available fail-over cases. It is designed with two levels of replication where the first level is local replication to protect against HW and SW failures. The second level is a global replication level that protects against outages due to conflicts, power issues, earthquakes and so forth. The global replication can also be used to perform more complex changes compared to the local replication level.

In both the local replication and in the global replication level NDB is designed to support multi-master solutions. In the local replication this is completely transparent to the user.

MySQL Cluster was developed in response to the development of Network Databases in the telecom world in the 1980s and 1990s. It was originally developed at Ericsson where I spent 13 years learning telecom and databases and developing real-time systems for switches and databases. It has been a part of MySQL since 2003 and it has been in production at many different mission-critical applications across the world since then.

At the moment there are at least several tens of thousands of clusters running in production and probably a lot more. NDB has proven itself in all the above listed areas and have added a few more unique selling points over time such as a parallel query feature and good read scalability as well as scalable writes that has been there from day one.

Experience have shown that NDB meet Class 6 availability (less than 30 seconds of downtime per year) and for extended periods even Class 8 availability (less than 0.3 seconds of downtime per year).

To get a quick idea if MySQL Cluster is something for your application I will list the unique selling points (USPs) of MySQL Cluster.

1.1ALWAYSONFORREADSANDWRITES

I use the term AlwaysOn here to mean a DBMS that is essentially never down. MySQL Cluster makes it possible to solve most online changes with its set of features.

This includes the following points:

Can survive multiple node crashes in one cluster

Can handle Add Column while writes happen

Can Add/Drop indexes while writes happen

Can Add/Drop foreign keys while writes happen

Can Add new shards while writing

Can reorganise data to use new shards while writing

Can perform software upgrade while writing (multiple version steps)

Automated node failure detection and handling

Automated recovery after node failure

Transactional node failures => Can survive multiple node failures per node group while writes happens

Schema changes are transactional

Support global failover for the most demanding changes

Support global online switch over between clusters in different geographies

One of the base requirement for NDB was to always support both reads and writes. The only acceptable downtime is for a short time when a node fails. It can take up to a few seconds to discover that the node has failed (the time is dependent on the responsiveness of the operating system used). As soon as the failure have been discovered, data is immediately available for reads and writes, the reconfiguration time is measured in microseconds.

There are many other solutions that build on a federation of databases. This means stand-alone DBMSs that replicate to each other at commit time. Given that they are built as stand-alone DBMSs they are not designed to communicate with other systems until it is time to commit the transactions. Thus with large transactions the whole transaction has to applied on the backup replicas before commit if immediate failover has to happen. This technique would in turn stop all other commits since the current replication techniques uses some form of token that is passed around and thus large transactions would block the entire system in that case.

Thus these systems can never provide synchronous replication AND at the same time providing this immediate failover and predictable response time independent of transaction sizes. NDB can deliver this since it is designed as a distributed DBMS where all replicas are involved before committing the transaction. Thus large transactions will block all rows they touch, but all other rows are available for other transactions to concurrently read and write.

NDB was designed from the start to handle as many failures as possible. It is possible e.g. to start with 4 replicas and see one failure at a time and end up with only 1 replica alive and we can still continue to both read and write the database.

Many management operations are possible to perform while the system continues to both read and write. This is a unique feature where NDB is at the forefront. It is possible to add/ drop indexes, add columns, add/ drop foreign keys, upgrade software, add new data nodes and reorganise data to use those new nodes. All failure handling is automated, both failure detection, failure handling and recovery of the nodes involved.

Schema changes are transactional, such that if they fail they can be rolled back. Schema transactions and user transactions cannot be combined in one transaction.

1.2GLOBALSOLUTIONFORREPLICATION

This includes the following points:

Synchronous replication inside one cluster

Asynchronous replication between clusters

Conflict detection when using multiple master clusters

Replication architecture designed for real-world physics

MySQL Cluster has a unique feature in that it supports multiple levels of replication. The base replication is the replication inside the cluster. This replication is synchronous and as soon as you have updated an object you will see the update in all other parts of the cluster.

The next level of replication is asynchronous replication between clusters. This replication takes a set of transactions for the last 100 millisecond period or so and replicates it to the other cluster. Thus the other cluster will see the updates from the updated cluster with a small delay.

These replication modes are independent of each other. It is possible to replicate to/ from InnoDB using this approach.

The asynchronous replication supports multiple master clusters. This requires conflict detection handling and NDB provides APIs to handle conflicts when conflicting updates occur. Several different conflict detection mechanisms are supported. It is possible to create complex replication architecture with things such as circular replication as well.

The replication architecture is designed to handle real-world physics. The default synchronous replication is designed for communication inside a data center where latency is less than 100 microseconds to communicate between nodes and communication paths are wide (nowadays often 10G Ethernet, but normally at least gigabit ethernet). With the development of clouds we have a new level which is availability domains/zones, these normally communicate between each other in less than a millisecond and down to 400 microseconds. Local replication can be used between availability domains.

When communicating between data centers in different regions the latency is normally at least 10 milliseconds and can reach 100 milliseconds if they are very far apart. In this case we provide the asynchronous replication option.

This means that wherever you placed your data in the world, there is a replication solution for that inside MySQL Cluster.

The global replication solution enables continued operation in the presence of earthquakes and other major disturbances. It makes it possible to perform the most demanding changes with small disturbances. There is methods to ensure that switching over applications from one cluster to another can be performed in a completely online fashion using transactional update anywhere logic.

Thus if users want to follow the trends and move their data in MySQL Cluster from on-premise to the cloud, this can be made without any downtime at all.

1.2.1HARDENEDHIGHAVAILABILITY

MySQL Cluster was originally designed for latency in the order of a few milliseconds. It was designed for Class 5 availability (less than 5 minutes of downtime per year). It turns out that we have achieved Class 6 availability in reality (less than 30 seconds of downtime per year).

MySQL Cluster was first put into production in a high availability environment in 2004 using version 3.4 of the product. This user is still operating this cluster and now using a 7 .x version.

Thousands and thousands of clusters have since been put into production usage.

With modern hardware we are now able to deliver response time on the order of 100 microseconds and even faster using specialised communication HW. At the same time the applications creates larger transactions. Thus we still maintain latency of transactions on the order of a few milliseconds.

1.3CONSISTENCYOFDATAINLARGECLUSTERS

This includes the following points:

Fully synchronous transactions with non-blocking two-phase-commit protocol

Data immediately seen after commit from any node in the cluster

Can always read your own updates

Cross-shard transactions and queries

In the MySQL world as well as in the NoSQL world there is a great debate about how to replicate for highest availability. Our design uses fully synchronous transactions.

Most designs have moved towards complex replication protocols since the simple two-phase commit protocol is a blocking protocol. Instead of moving to a complex replication protocol we solved the blocking part. Our two-phase commit protocol is non-blocking since we can rebuild the transaction state after a crash in a new node. Thus independent of how many crashes we experience we will always be able to find a new node to take over the transactions from the failed node (as long as the cluster is still operational, a failed cluster will always require a recovery action, independent of replication protocol).

During this node failure takeover the rows that were involved in the transactions that lost their transaction coordinator remains locked. The remainder of the rows are unaffected, they can immediately be used in new transactions from any alive transaction coordinator. The locked rows will remain locked until we have rebuilt the transaction states and decided the outcome of the transactions that lost their transaction coordinator.

When a transaction have completed, NDB have replicated not only the logs of the changes. NDB have also updated the data in each replica. Thus independent of which replica is read, it will always see the latest changes.

Thus we can handle cross-shard transactions and queries, it means that we make the data available for reads immediately after committing the data.

The requirement to always be able to read your own updates we solve either by always sending reads to the primary replica or through a setting on the table to use the read backup feature in which case the commit acknowledged is delayed shortly to ensure that we can immediately read the backup replicas and see our own update.

1.3.1CLUSTERWITHINONEDATACENTER

NDB was originally designed for clusters that resided within one data center. The latency to send messages within one data center can be anywhere between a few microseconds to below one hundred microseconds for very large data centers. This means that we can complete a transaction within less than a millisecond and that complex transactions with tens of changes can be completed within ten milliseconds.

Using low latency HW the latency in this case can be brought down even further. Dolphin ICS in Norway is a company that have specialised in low latency interconnect technology. Using their SuperSocket drivers it is possible to bring down latency in sending a message from one node to another to less than one microsecond. Actually the first communication technology that worked with NDB was based on Dolphin HW already in the 1990s.

Cluster in one data center

Using SuperSocket HW is equivalent in speed to using RDMA protocols. NDB have supported specialised HW interconnects in the past from OSE Delta and from Dolphin and there has been experimental work on Infiniband transporters. But using SuperSocket driver technology removed the need for specialised transporter technology.

It is possible to use Infiniband technology with NDB using IPoIB (IP over Infiniband). This has great bandwidth, but not any other significant advantages compared to using Ethernet technologies.

1.3.2CLUSTERWITHINONEREGION

In a cloud provider it is customary to bring down entire data centers from time to time. To build a highly available solution in a cloud often requires the use of several data centers in the same region. Most cloud providers have three data centers per region. Most cloud providers promise latency of 1-2 milliseconds between data centers whereas the Oracle cloud provides latency below half a millisecond. Inside a cloud data center the latency is below 100 microseconds.

This setup works fine with NDB and will be covered in more detail in the chapter on MySQL Cluster in the cloud. The main difference is that the latency to communicate is a magnitude higher in this case. Thus not all applications will be a fit for this setup.

1.3.3SEVERALCLUSTERSINDIFFERENTREGIONS

For global replication we use an asynchronous replication protocol that is able to handle many clusters doing updates at the same time and providing conflict detection protocols (more on that below). Thus we use two levels of replication for the highest availability. MySQL Cluster is safe for earthquakes, data center failures and the most complex software and hardware upgrades.

NDB is unique in bringing both the best possible behaviour in a local cluster while at the same time providing support of global replication.

The figure below shows a complex setup that uses two clusters in different regions and each cluster resides in several availability domains (ADs) within one region. MySQL Cluster Replication is used to ensure that an NDB setup with global replication will survive in the presence of an entire region being down.

We will cover this setup in greater detail in the part on Global Replication.

1.4HIGHREADANDWRITESCALABILITY

MySQL Cluster can scale to 48 data nodes and around 200 MySQL Servers. NDB have shown in benchmarks that it can scale up to 20 million write transactions per second and more than 200 million reads per second.

To achieve the optimal scaling the following points are important:

Partition pruned index scans (optimised routing and pruning of queries)

Distribution-aware transaction routing (semi-automatic)

Partitioning schemes

NDB is designed to scale both for reads and writes. NDB implements sharding transparent to the user. It can include up to 24 node groups where data is stored. It is also possible to fully replicate tables within all node groups. The data nodes can be accessed from more than 200 MySQL Servers that all see the same view of the data. This makes it possible to issue tens of millions of SQL queries per second against the same data set using local access thus providing perfect read scalability.

To provide optimal scaling in a distributed system it is still important to provide hints and write code taking account of the partitioning scheme used.

Costs of sending have been and continuos to be one of the main costs in a distributed system. In order to optimise the sending it is a good idea to start the transaction at the node where the data resides. We call this Distribution-aware transaction routing.

When using the NDB API it is possible to explicitly state which node to start the transaction at. For the most part it is easier for the application to state that the transaction should start at the node where the primary replica of a certain record resides.

When using SQL the default mechanism is to place the transaction at the node that the first query is using. If the first query is

then the transaction will be started at the node where the record with primary key column pk equal to 1 is stored. This can be found by using the hash on the primary key (or distribution key if only a part of the primary key is used to distribute the records).

The next problem in a shared nothing database is that the number of partitions grows with the number of nodes and in NDB also with the number of threads used. When scanning the table using some ordered index it is necessary to scan all partitions unless the partition key is fully provided.Thus the cost of scanning using ordered index grows with a growing cluster.

To counter this it is important to use partition pruned index scans as much as possible. A partition pruned index scan is an index scan where the full partition key is provided as part of the index scan. Since the partition key is provided we can limit the search to the partition that the rows with this partition key are stored.

In TPC-C for example it is a good idea to use warehouse id as the distribution key for all tables. This means that any query that accesses only one warehouse only need to be routed to one partition. Thus there is no negative scaling effect.

If it isn’t possible to use partition pruned index scans there is one more method to decrease cost of ordered index scans. By default tables are distributed over all nodes and all ldm threads (ldm stands for Local Database Manager and contains the record storage, hash indexes and ordered indexes and the local recovery logic). It is possible to specify when creating the table to use less partitions in the table. The minimum is to have one partition per node group by using standard partitioning schemes. It is possible to specify the exact number of partitions, but when specifying an exact number of partitions the data will not be evenly spread over the nodes, this requires more understanding of the system and its behaviour. Therefore we have designed options that use less partitions in a balanced manner.

By using these schemes in an efficient manner it is possible to develop scalable applications that can do many millions of complex transactions per second. A good example of an application that have been successful in this is HopsFS. They have developed the meta data layer of Hadoop HDFS using NDB. They use the id of the parent directory as distribution key which gives good use of partitioned pruned index scans for almost all file operations. They have shown that this scaled to at least 12 data nodes and 60 application nodes (they ran out of lab resources to show any bigger clusters).

A presentation of these results in a research paper at the 17th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing won the IEEE Scale Challenge Award in 2017.

1.5PREDICTABLERESPONSETIME

This includes the following points:

Main memory storage for predictable response time

Durable by committing on multiple computers in memory (Network Durable)

CPU cache optimised distributed hash algorithm

CPU cache optimised T-tree index (ordered index)

Application defined partitioning (primary key partitioning by default)

Batched key lookup access

Several levels of piggybacking in network protocols

Maintaining predictable response time while improving throughput

Piggybacking happens in several levels, one level is that we pack many commit messages and some other messages together in special PACKED_SIGNAL messages. The other is that we use one socket for communication between nodes. Given that our internal architecture uses an asynchronous programming model means that we automatically can batch a lot of messages together in one TCP/IP message. We execute a set of messages and collect the responses from these messages in internal buffers until we’re done executing and only then do we send the messages. Finally we execute in many threads in parallel such that when sending we can collect messages from many threads.

The telecom applications, financial applications and gaming applications have strict requirements on the time one is allowed to take before one responds to the set of queries in a transaction. We have demanding users that require complex transactions with tens of interactions with hundreds of rows to complete within a few milliseconds in a system that is loaded to 90% of its capacity.

This is an area where one would probably not expect to find an open source DBMS such as MySQL at the forefront. But in this application area MySQL Cluster comes out at the top. The vendors selecting MySQL Cluster have often tough requirements, up to more than millions of transactions per second, Class 6 availability and at the same time providing 24x7 services and being available to work with users when they have issues.

1.6BASEPLATFORMFORDATASTORAGE

This includes the following points:

MySQL storage engine for SQL access

OpenLDAP backend for LDAP access

HopsFS metadata backend for Hadoop HDFS (100s of PByte data storage)

Prototypes of distributed disk block devices

Integrated into Oracle OpenStack

MySQL Cluster can be used as a base platform for many different types of data. A popular use is SQL access using MySQL. Another popular approach is to use NDB as the backend in an LDAP server. OpenLDAP have a backend storage engine that can use NDB. Some users have developed their own proprietary LDAP servers based on top of NDB (e.g. Juniper).

SICS, a research lab connected to KTH in Stockholm, Sweden, have developed HopsFS, this is a metadata backend to Hadoop HDFS for storing many, many petabytes of data into HDFS and enabling HDFS to handle many millions of file operations per second. HopsFS uses disk data in NDB to store small files that are not efficient to store in HDFS itself.

Personally I have worked on a hobby project, iClaustron, to develop a file system on top of NDB that uses the FUSE API to provide a distributed file system.

Prototypes have been built successfully where NDB was used to store disk blocks to implement a distributed block device.

NDB have been integrated into Oracle OpenStack and a number of other Oracle products.

The list of use cases where it is possible to build advanced data services on top of NDB is long and will hopefully grow longer over the years in the future. One of the main reasons for this is that NDB separates the data server functionality from the query server functionality.

1.7MULTI-DIMENSIONALSCALING

This includes the following points:

Scaling inside a thread

Scaling with many threads

Scaling with many nodes

Scaling with many MySQL Servers

Scaling with many clusters

Built-in Load balancing in NDB API (even in presence of node failures)

MySQL Cluster have always been built for numerous levels of scaling. From the beginning it scaled to a number of different nodes. The user can always scale by using many clusters (some of our users use this approach). Since MySQL Cluster 7.0 there is a multithreaded data node, each successive new version after that have improved our support for multithreading in the data node and in the API nodes. The MySQL Server scales to a significant number of threads. A data node together with a MySQL Server scales to use the largest dual socket x86 servers.

MySQL Cluster have designed a scalable architecture inside each thread that makes good use of the CPU resources inside a node. This architecture has the benefit that the more load the system gets, the more efficient it executes. Thus we get an automatic overload protection.

In the NDB API we have an automatic load balancer built in. This load balancer will automatically pick the most suitable data node to perform the task specified by the application in the NDB API.

1.8NON-BLOCKING 2PC TRANSACTIONPROTOCOL

MySQL Cluster uses a two-phase commit protocol. The research literature talks about this protocol as a blocking protocol. Our variant of this protocol is non-blocking. The problem is that a transaction has a coordinator role. The problem is what to do at crashes of the coordinator role.

NDB have a protocol to take over the transaction coordinator role for a crashed node. The state of the transaction coordinator is rebuilt in the new transaction coordinator by asking the transaction participants about the state of all ongoing transactions. We use this take over protocol to decide on either abort or commit of each transaction that belonged to the crashed node. Thus there is no need to wait for the crashed node to come back.

The protocol is recursive such that the transaction coordinator role can handle multiple node failures until the entire cluster fails.

Thus there are no blocking states in our two-phase commit protocol. Normally a node failure is handled within a second or two or less than this unless large transactions was ongoing at crash time.

1.9GLOBALCHECKPOINTS

NDB uses a method called Network Durable transactions, this means that when a transaction is acknowledged towards the API we know that the transaction is safe on several computers. It is however not yet safe on durable media (e.g. hard drive, SSD, NVMe or persistent memory).

In order to ensure that we recover a consistent point after a cluster crash we create regular consistent commit points. We call those global checkpoints. We actually create two types of global checkpoints. One of them are used for MySQL Cluster Replication. These are created around once per 100 milliseconds. These are called epochs in MySQL Cluster Replication. The epochs are not durable on disk. Each second or two we create a global checkpoint that is durable. When we recover after a complete cluster crash we recover to one of those global checkpoints.

The NDB API provides the global checkpoint identifier of the transaction committed, this makes it possible to wait for this global checkpoint to be durable on disk if this is necessary.

The global checkpoint identifier is heavily used in our recovery protocols. It is a very important building block of NDB.

1.10AUTOMATICALLYPARALLELISEDANDDISTRIBUTEDQUERIES

Any range scan that is scanning more than one partition will be automatically parallelised. As an example we have 4 range scans in the Sysbench OLTP benchmark. Using data nodes with 8 partitions per table will execute those scan queries twice as fast compared to tables with only one partition. This is a case without any filtering in the data nodes. With filtering the improvement will be bigger.

In MySQL Cluster 7.2 a method to execute complex SQL queries was added. This method uses a framework where a multi-table join can be sent as one query to the data nodes. The manner it executes is that it reads one table at a time, each table reads a set of rows and sends the data of these rows back to the API node. At the same time it sends key information onwards to the second table together with information sent in the original request. This query execution is automatically parallelised in the data nodes.

There is still a bottleneck in that only one thread in the MySQL Server will be used to process the query results. Queries where lots of filtering are pushed to the data nodes can be highly parallelised.

There is a number of limitations on this support, the EXPLAIN command in MySQL will give a good idea about what will be used and some reasons why the pushdown of the joins to the data nodes doesn’t work (pushing down joins to data nodes enables the query to be automatically parallelised).

Interestingly the MySQL Server can divide a large join into several parts where one part is pushed to the data node and another part is executed from the MySQL Server using normal single-table reads.