Top Banner
MySQL Replication Evolution From Simple to Group Replication ConFoo Montreal & Vancouver 2017 Dave Stokes -- MySQL Community Manager [email protected] @stoker slideshare.net/davidmstokes Elephantanddolphin.blogspot.com & opensourcedba.wordpress.com 1
56

ConFoo MySQL Replication Evolution : From Simple to Group Replication

Jan 28, 2018

Download

Internet

Dave Stokes
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

MySQL Replication EvolutionFrom Simple to Group ReplicationConFoo Montreal & Vancouver 2017Dave Stokes -- MySQL Community Manager

[email protected]@stokerslideshare.net/davidmstokesElephantanddolphin.blogspot.com & opensourcedba.wordpress.com

1

Page 2: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Safe Harbor 2

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 DECISIONS. THE DEVELOPMENT,

RELEASE, AND TIMING OF ANY FEATURES OR

FUNCTIONALITY DESCRIBED FOR ORACLE'S

PRODUCTS REMAINS AT THE SOLE DISCRETION OF

ORACLE.

Page 3: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

21 Years OldMySQL has been part of Oracle’s family of databases for six years.

MySQL 8MySQl 5.7 is the current release but the next version will be MySQL 8. Big feature is real time data dictionary

Group ReplicationActive master-master replication.

JSONA new native JSON datatype to store documents in a column of a table

Document StoreProgrammers not know SQL but need a database? X Devapi allows them to use RDMS from language of choice

EncryptionUse Oracle Key Vault to encrypt your data at rest.

3

Page 4: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Replication

Past

Present

Future

4

Page 5: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Basic Premise Behind Replication

1. Copy all the data on one server and copy onto another.

2. Setup Replication.

3. Log any changes on the first server to a log file, apply

that logfile to the second server.

5

Page 6: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Imagine Your Data as a Painting:Make copy of Mona Lisa

6

Page 7: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Make copy of changes to Mona Lisa:Apply changes to copy

7

Page 8: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Keep making copy of changes to Mona Lisa:Apply changes made on master to slave

8

Page 9: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Architecture 10,000’

Binary Log on master

Slave Attaches

I/O Thread Grabs Data

Data copied to slave

Applier thread changes slave’s data

9

Page 10: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Graphic overview of replication

10

Page 11: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

But what are we replicating?

11

Page 12: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Replicating changes to tables and data

SBR: When using statement-based binary logging,

the master writes SQL statements to the binary log.

Replication of the master to the slave works by

executing the SQL statements on the slave. This is

called statement-based replication (often abbreviated

as SBR), which corresponds to the standard MySQL

statement-based binary logging format. Replication

capabilities in MySQL version 5.1.4 and earlier used

this format exclusively.

What is sent: Structured Query Language (SQL), your

query

RBR: When using row-based logging, the master

writes events to the binary log that indicate how

individual table rows are changed. Replication of the

master to the slave works by copying the events

representing the changes to the table rows to the

slave. This is called row-based replication (often

abbreviated as RBR).

What is sent: The Delta, the results of your query

12

Page 13: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Or

Bo

th

MBR: You can also configure MySQL to use a mix of both

statement-based and row-based logging, depending on which

is most appropriate for the change to be logged. This is called

mixed-format logging. When using mixed-format logging, a

statement-based log is used by default. Depending on certain

statements, and also the storage engine being used, the log is

automatically switched to row-based in particular cases.

Replication using the mixed format is often referred to as

mixed-based replication or mixed-format replication.

13

Page 14: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Notes for the future

With MySQL.5.6 RBR started sending over only the

primary key and the changed data (not sending

unchanged data) which can drastically cut the amount

of data sent to slave servers. This can be huge!!

Many future products will work better with RBR as it

more deterministic. So plan accordingly.

14

Page 15: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Threading

Before 5.6 MySQL Replication is SINGLE threaded – Airline

boarding example

MySQL 5.6 is multi-threaded at the database level

MySQL 5.7 is multi-threaded at the table level

15

Page 16: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Synchronicity

16

Page 17: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Async and Semi Synchronous

Semi Synchronous replication -- a commit

performed on the master blocks before

returning to the session that performed the

transaction until at least one slave

acknowledges that it has received and

logged the events for the transaction (Note

not written to table, just recorded for

future).

Asynchronous replication -- slave servers

retrieve data, master unaware of slave’s

consumption.

17

Page 18: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

18

Page 19: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Topologies -- Before 5.7

19

Page 20: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Common - Read / Write Split

20

Page 21: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Multi-source Replication -- MySQL 5.7

21

Page 22: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Group Repilcation -- Labs.MySQL.Com for evaluation

22

Page 23: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Multi-Master

Lots of folks want TWO active

masters and this can be done

but not recommended, You need

to have a sharp crew and plan

for conflicts.

Not generally recommended

before Group Replication

23

Page 24: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Multi-Master MySQL Cluster

You can run active-active

master-master with MySQL

Cluster, even between data

centers.

This can be very expensive and

MySQl Cluster is not a full

featured version of the MySQL

Server.

24

Page 25: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Galera Cluster

Layer separate from MySQL that is

mainly for high availability (not high

performance).

Claims to have snapshot isolation on

transactions but watch out for ‘first

committer wins’ and prepare for

rollbacks.

Not low latency

25

Page 26: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

How to setupMySQL

Replication26

Page 27: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Two types of replication w/ & w/o GTIDs

A global transaction identifier (GTID) is a unique

identifier created and associated with each

transaction committed on the server of origin

(master). This identifier is unique not only to the

server on which it originated, but is unique across

all servers in a given replication setup. There is a 1-

to-1 mapping between all transactions and all

GTIDs.

3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5

Note the 1-5 is a group of

transactions

27

Page 28: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Binlog & ID

Enable Binary Log on

Master, Unique ID

number

Create User

Create user for

replication

Binlog Offset

Get Master’s Binary

Log coordinates

Snapshot

Snapshot data, copy

onto slave

SLAVE running

CHANGE MASTER

command and START

SLAVE

Before GTIDs (MySQL 5.5 and before) 28

Page 29: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Enable Binary Log & Unique ID on Master

Edit my.cnf file[mysqld]

log-bin=mysql-bin

server-id=1

29

Page 30: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Create replication user

mysql> CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY

'slavepass';

mysql> GRANT REPLICATION SLAVE ON *.* TO

'repl'@'%.mydomain.com';

30

Page 31: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Get binary log position

mysql> FLUSH TABLES WITH READ LOCK;

mysql > SHOW MASTER STATUS;

+------------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000003 | 73 | test | manual,mysql |

+------------------+----------+--------------+------------------+31

Page 32: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Unlock tables mysql> UNLOCK TABLES;

32

Page 33: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Config slave & load data

No config thee slave

server. Remember

server-id must be

unique

[mysqld]

server-id=2

shell> mysql -h master

< fulldb.dump

33

Page 34: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Change Master & Start Slave

mysql> CHANGE MASTER TO

-> MASTER_HOST='master_host_name',

-> MASTER_USER='replication_user_name',

-> MASTER_PASSWORD='replication_password',

-> MASTER_LOG_FILE='recorded_log_file_name',

-> MASTER_LOG_POS=recorded_log_position;

mysql> START SLAVE; 34

Page 35: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Binlog & ID

Enable Binary Log on

Master, Unique ID

number

Create User

Create user for

replication

Snapshot

Snapshot data, copy

onto slave

SLAVErunning

CHANGE MASTER

command and START

SLAVE

SLAVE running

GTIDs make it

much easier to

automate many

functions

With GTIDs (MySQL 5.6 & Later) 35

Page 36: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Replication Setup with GTIDs

mysql>mysqladmin -uusername -p shutdownshell> mysqld --gtid-mode=ON --enforce-gtid-consistency &mysql> CHANGE MASTER TO

> MASTER_HOST = host,> MASTER_PORT = port,> MASTER_USER = user,> MASTER_PASSWORD = password,> MASTER_AUTO_POSITION = 1;

mysql> START SLAVE;

36

Page 37: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

MySQL InnoDBCluster

37

Page 38: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

MySQL InnoDB Cluster

38

MySQL InnoDB cluster is a collection of products that work together to provide

a high availability solution. A group of MySQL servers can be configured to

create a cluster using MySQL Shell. The cluster of servers has a single master,

called the primary, which acts as the read-write master. Multiple secondary

servers are replicas of the master. A minimum of three servers are required to

create a high availability cluster. A client application is connected to the

primary via MySQL Router. If the primary fails, a secondary is automatically

promoted to the role of primary, and MySQL Router routes requests to the new

primary.

Page 39: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Components

MySQL Shell 1.0.8 or higher. Includes the AdminAPI, which enables you to create and administer an

InnoDB cluster, using either JavaScript or Python scripting. MySQL Shell also requires Python 2.7 and

above to run cluster provisioning scripts.

MySQL Router 2.1.2 or higher. Caches the metadata of the InnoDB cluster and performs high availability

routing to the MySQL Server instances which make up the cluster. If the primary instance becomes

unavailable, MySQL Router automatically routes client requests to a promoted secondary (the new

primary).

MySQL Server 5.7.17 or higher. This provides the Group Replication mechanism to allow data to be

replicated from the primary to the secondaries in the cluster.

39

Page 40: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

40

Page 41: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

41

MySQL Router

Connection routing is the ability to permit the

redirection of connections sent to the router to an

available MySQL server. Connection routing is

simply the redirection of the MySQL packets in their

entirety without inspection.

This means you can set up your application to

connect to the router and should the current MySQL

server fail, retry the connection and the router will

select a new MySQL server to redirect the

connection.

So check you return codes, retry on failure

Page 42: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Configuration

[routing:simple_redirect]

bind_port = 7002

mode = read-write

destinations =

localhost:3306,localhost:3307,localhost:3308

42

Page 43: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Group Replication

MySQL Group Replication provides distributed state machine replication with

strong coordination between servers. Servers coordinate themselves

automatically when they are part of the same group. The group can operate in a

single-primary mode with automatic primary election, where only one server

accepts updates at a time. Alternatively, for more advanced users the group

can be deployed in multi-primary mode, where all servers can accept updates,

even if they are issued concurrently. This power comes at the expense of

applications having to work around the limitations imposed by such

deployments.43

Page 44: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Group Replication

There is a built-in group membership service that keeps the view of the group

consistent and available for all servers at any given point in time. Servers can

leave and join the group and the view is updated accordingly. Sometimes

servers can leave the group unexpectedly, in which case the failure detection

mechanism detects this and notifies the group that the view has changed. This

is all automatic.

44

Page 45: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Group Replication

For a transaction to commit, the majority of the group have to agree on the

order of a given transaction in the global sequence of transactions. Deciding to

commit or abort a transaction is done by each server individually, but all

servers make the same decision. If there is a network partition, resulting in a

split where members are unable to reach agreement, then the system does not

progress until this issue is resolved. Hence there is also a built-in, automatic,

split-brain protection mechanism.

45

Page 46: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Group Replication

All of this is powered by the provided group communication protocols. These

provide a failure detection mechanism, a group membership service, and safe

and completely ordered message delivery. All these properties are key to

creating a system which ensures that data is consistently replicated across the

group of servers. At the very core of this technology lies an implementation of

the Paxos algorithm. It acts as the group communication systems engine.

46

Page 47: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Group Replication

All read-write (RW) transactions commit only after they have been approved by the group. Read-only (RO) transactions need no coordination within the group and thus commit immediately. For any RW transaction the group needs to decide whether it commits or not, thus the commit operation is not a unilateral decision from the originating server. When a transaction is ready to commit at the originating server, the server atomically broadcasts the write values (rows changed) and the correspondent write set (unique identifiers of the rows that were updated). Then a global total order is established for that transaction. Ultimately, this means that all servers receive the same set of transactions in the same order. As a consequence, all servers apply the same set of changes in the same order, therefore they remain consistent within the group. 47

Page 48: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

48

Page 49: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

InnoDB Cluster How-to

49

http://lefred.be/content/mysql-innodb-cluster-mysql-shell-starter-guide/

Page 50: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

30 Minutes!!!

Can’t Cover all of MySQL Replication in ~60 minutes!!!!! 50Or can I?????

Page 51: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

https://github.com/datacharmer

Giuseppe Maxia has lot of great code

for getting used to replication -- see

~/mysql-replication-sample

51

Great Place to Find examples & MySQL Sandbox

Page 52: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

MySQL Utilities

FREE Scripts written in Python, used with MySQL

Workbench or stand alone

1. Copy, diff databases

2. Disk usage, grants, copy users

3. Search for processed and kill ‘em

4. Setup replication and failover

52

Page 53: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Mysqlrplcheck -- check replication setup

shell> mysqlrplcheck --master=root@host1:3310 --slave=root@host2:3311

# master on host1: ... connected.

# slave on host2: ... connected.

Test Description Status

------------------------------------------------------------------------

Checking for binary logging on master [pass]

Are there binlog exceptions? [pass]

Replication user exists? [pass]

Checking server_id values [pass]

Is slave connected to master? [pass]

Check master information file [pass]

Checking InnoDB compatibility [pass]

Checking storage engines compatibility [pass]

Checking lower_case_table_names settings [pass]

Checking slave delay (seconds behind master) [pass]

# ...done.

53

Page 54: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Mysqlrplcheck -- replication checker

shell> mysqlrplsync --master=user:pass@localhost:3310 \

--slaves=rpl:pass@localhost:3311,rpl:pass@localhost:3312

#

# GTID differences between Master and Slaves:

# - Slave 'localhost@3311' is 15 transactions behind Master.

# - Slave 'localhost@3312' is 12 transactions behind Master.

#

# Checking data consistency.

#

# Using Master 'localhost@3310' as base server for comparison.

# Checking 'test_rplsync_db' database...

# - Checking 't0' table data...

# [OK] `test_rplsync_db`.`t0` checksum for server 'localhost@3311'.

# [OK] `test_rplsync_db`.`t0` checksum for server 'localhost@3312'.

# - Checking 't1' table data...

# [OK] `test_rplsync_db`.`t1` checksum for server 'localhost@3311'.

# [OK] `test_rplsync_db`.`t1` checksum for server 'localhost@3312'.

# Checking 'test_db' database... 54

Page 55: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

Mysqlslavetrx -- skip bad transactions

shell> mysqlslavetrx --gtid-set=af6b22ee-7b0b-11e4-aa8d-606720440b68:7-9 \

--slaves=user:pass@localhost:3311,user:pass@localhost:3312

WARNING: Using a password on the command line interface can be insecure.

#

# GTID set to be skipped for each server:

# - localhost@3311: af6b22ee-7b0b-11e4-aa8d-606720440b68:7-9

# - localhost@3312: af6b22ee-7b0b-11e4-aa8d-606720440b68:7-9

#

# Injecting empty transactions for 'localhost:3311'...

# Injecting empty transactions for 'localhost:3312'...

#

#...done.

55

Page 56: ConFoo  MySQL Replication Evolution : From Simple to Group Replication

MySQL Replication

Q/A

[email protected]@stokerslideshare.net/davidmstokes Elephantanddolphin.blogspt.com & opensourcedba.wordpress.com

56