SlideShare una empresa de Scribd logo
1 de 33
Descargar para leer sin conexión
MySQL5.7
- replication
LEE SAE WOONG
2016.03.26
INDEX
> Multi-Threaded Slave(MTS)
2
Multi-Threaded Slave 3
binary log
Client
Client
Client
MASTER relay log SLAVE
* Before MySQL 5.6 : Single-threaded slave
Bottleneck
Multi-Threaded Slave 4
binary log
Client
Client
Client
MASTER relay log SLAVE
binary log
Client
Client
Client
MASTER relay log
* Before MySQL 5.6 : Single-threaded slave
Bottleneck
* MySQL 5.6 : Multi-threaded slave by database
db1
SLAVE
db2
db3
Multi-Threaded Slave 5
> Multiple execution threads to apply replication events to the slave(s);
> Splits processing between worker threads based on :
- Schema(MySQL 5.6+)
ㆍSET GLOBAL slave_parallel_type = DATABASE;
ㆍMulti-tenant systems friendly;
- Locking-based parallelism(new in MySQL 5.7.2)
ㆍSET GLOBAL slave_parallel_type = LOGICAL_CLOCK;
ㆍIntra-schema parallelization;
ㆍBased on information collected during master’s commit of the
transactons;
> DATABASE : parallelize by database
> LOGICAL_CLOCK : parallelize by master concurrency
6
binary log
Client
Client
Client
MASTER relay log
* MySQL 5.7.2 : Multi-threaded slave by master concurrency
Multi-Threaded Slave
Receiver
thread
relay log
COORDINATOR
Thread db1
Reads &
assigns to worker(s)
Applier
threads
worker1
worker2
worker3
SLAVE
SLAVE
db1
7Multi-Threaded Slave
Configure MTS
> STOP SLAVE;
> SET GLOBAL slave_parallel_type='LOGICAL_CLOCK';
> SET GLOBAL slave_parallel_workers=5;
> START SLAVE;
8
Receiver thread(a.k.a. IO thread)
Coordinator thread
(a.k.a SQL thread)
Applier threads
Show processlist for MTS
Multi-Threaded Slave
ㆍ Waiting for the next event in relay log :
The initial state before Reading event from the relay log.
ㆍ Reading event from the relay log :
The thread has read an event from the relay log so that the event can be processed.
ㆍ Making temp file :
The thread is executing a LOAD DATA INFILE statement and is creating a temporary file
containing the data from which the slave will read rows.
ㆍ Slave has read all relay log; waiting for the slave I/O thread to update it :
The thread has processed all events in the relay log files, and is now waiting for the
I/O thread to write new events to the relay log.
ㆍ Waiting for slave mutex on exit :
A very brief state that occurs as the thread is stopping.
https://dev.mysql.com/doc/refman/5.5/en/slave-sql-thread-states.html
http://dev.mysql.com/doc/refman/5.7/en/replication-options-slave.html
9
Replication Monitoring : P_S Replication Tables
performance_schema > show tables;
+----------------------------------------------------------+
…… |
…… |
| replication_applier_configuration |
| replication_applier_status |
| replication_applier_status_by_coordinator |
| replication_applier_status_by_worker |
| replication_connection_configuration |
| replication_connection_status |
| replication_group_member_stats |
| replication_group_members |
…… |
…… |
+----------------------------------------------------------+
https://dev.mysql.com/doc/mysql-perfschema-excerpt/5.7/en/performance-schema-replication-tables.html
Multi-Threaded Slave
10
> replication_applier_status_by_coordinator
> replication_applier_status_by_worker
Multi-Threaded Slave
The REPLICATION P_S Tables
SHOW SLAVE STATUS
> Do not have information about MTS workers;
11Multi-Threaded Slave
Use case
Case1.
T1. update T set col1 = 2 where col1=3;
T2. update T set col1 = 4 where col1=2;
Case2.
x=1, y=1, z=99
On master we apply T1 and T2 in that order
T1. Update T set x=Read(y)+1 where z = 99;
T2. Update T set y=Read(x)+1 where z = 99;
On the slave however these two transactions commit out out order
T2. Update T set y=Read(x)+1 where z = 99;
T1. Update T set x=Read(y)+1 where z = 99;
12Multi-Threaded Slave
Use case
Case1.
T1. update T set col1 = 2 where col1=3;
T2. update T set col1 = 4 where col1=2;
Case2.
x=1, y=1, z=99
On master we apply T1 and T2 in that order
T1. Update T set x=Read(y)+1 where z = 99;
T2. Update T set y=Read(x)+1 where z = 99;
On the slave however these two transactions commit out out order
T2. Update T set y=Read(x)+1 where z = 99;
T1. Update T set x=Read(y)+1 where z = 99;
x=2 , y=3
X=3, y=2
13Multi-Threaded Slave
> slave_parallel_type= LOGICAL_CLOCK
•Leverage parallelization information obtained from the execution on the master:
–Transactions that prepare on the same “version” of the database, are assigned
the same timestamp;
같은 프리페어 트랜잭션은 같은 시간으로 어사인된다.
> parallelization conditions :
Same commit_parent id ( prepare stage)
> The pseudo code is as follows.
During Prepare
trx.commit_parent= commit_clock.get_timestamp();
During Commit
for every binlog group
commit_clock.step();
Logical clock and commit parent
14Multi-Threaded Slave
Logical clock and commit parent
http://geek.rohitkalhans.com/2013/09/enhancedMTS-deepdive.html
15Multi-Threaded Slave
ORACLE – 2013.11.13 ORACLE – 2014.09.23
OOW - 2015
16Multi-Threaded Slave
transaction_info.h
/*Binlog-specific logical timestamps.*/
/*
Store for the transaction's commit parent sequence_number.
The value specifies this transaction dependency with a"parent"
transaction.
The member is assigned, when the transaction is about to commit
in binlog to a value of the last committed transaction's
sequence_number.
This and last_committed as numbers are kept ever incremented
regardless of binary logs being rotated or when transaction
is logged in multiple pieces.
However the logger to the binary log may convert them
according to its specification.
*/
int64 last_committed;
/*
The transaction's private logical timestamp assigned at the
transaction prepare phase. The timestamp enumerates transactions
in the binary log. The value is gained through incrementing
(stepping)a global clock.
Eventually the value is considered to increase
max_committed_transaction
system clock when the transaction has committed.
*/
int64 sequence_number;
17
Type slave-parallel-type slave_parallel_workers Syntax
master_info_repository
/ relay_log_info_repository
Master - - - FILE/TABLE
Slave 1 LOGICAL_CLOCK 16 (MTS)
STOP SLAVE;
SET GLOBAL slave_parallel_type='LOGICAL_CLOCK';
SET GLOBAL slave_parallel_workers=16;
START SLAVE;
FILE/TABLE
Slave 2 DATABASE 16 (MTS)
STOP SLAVE;
SET GLOBAL slave_parallel_workers=16;
START SLAVE;
FILE/TABLE
Slave 3 - 0 (single thread) - FILE/TABLE
> master_info_repository – introduced 5.6.2 :
The setting of this variable determines whether the slave logs master status and connec
tion information to a FILE (master.info), or to a TABLE (mysql.slave_master_info).
> relay_log_info_repository – introduced 5.6.2 :
This variable determines whether the slave's position in the relay logs is written to a FIL
E (relay-log.info) or to a TABLE (mysql.slave_relay_log_info).
> Changing slave repository :
stop slave;
set global master_info_repository = 'table';
set global relay_log_info_repository = 'table';
start slave;
Multi-Threaded Slave
LOAD TEST
> CPU:2sx4c HT , Mem:32G, Disk:SAS 15Krpm 300G 4EA, Raid1+0 , 1 Master-3 Slaves
18
Type slave-parallel-type slave_parallel_workers Syntax
master_info_repository
/ relay_log_info_repository
Master - - - FILE/TABLE
Slave 1 LOGICAL_CLOCK 16 (MTS)
STOP SLAVE;
SET GLOBAL slave_parallel_type='LOGICAL_CLOCK';
SET GLOBAL slave_parallel_workers=16;
START SLAVE;
FILE/TABLE
Slave 2 DATABASE 16 (MTS)
STOP SLAVE;
SET GLOBAL slave_parallel_workers=16;
START SLAVE;
FILE/TABLE
Slave 3 - 0 (single thread) - FILE/TABLE
sysbench --test='/usr/share/doc/sysbench/tests/db/oltp.lua' --oltp_tables_count=1 
--report-interval=10 --oltp-table-size=3000000 --num-threads=16 --mysql-user=root 
--mysql-password=test --mysql-table-engine=innodb --rand-init=on 
--mysql-socket=/mysql/MyHome/tmp/mysql.sock 
--mysql-host=localhost --mysql-port=20306 --mysql-db=sysbench 
prepare
mysqldump --skip-extended-insert --no-create-info -p'test' sysbench > dumpfile.sql
create database sysbench1;
create database sysbench2;
create database sysbench3;
create database sysbench4;
create table sysbench1.sbtest1 like sysbench.sbtest1;
create table sysbench1.sbtest2 like sysbench.sbtest1;
create table sysbench1.sbtest3 like sysbench.sbtest1;
create table sysbench1.sbtest4 like sysbench.sbtest1;
create table sysbench1.sbtest5 like sysbench.sbtest1;
create table sysbench1.sbtest6 like sysbench.sbtest1;
create table sysbench1.sbtest7 like sysbench.sbtest1;
create table sysbench1.sbtest8 like sysbench.sbtest1;
create table sysbench1.sbtest9 like sysbench.sbtest1;
create table sysbench1.sbtest10 like sysbench.sbtest1;
create table sysbench1.sbtest11 like sysbench.sbtest1;
create table sysbench1.sbtest12 like sysbench.sbtest1;
create table sysbench1.sbtest13 like sysbench.sbtest1;
create table sysbench1.sbtest14 like sysbench.sbtest1;
create table sysbench1.sbtest15 like sysbench.sbtest1;
create table sysbench1.sbtest16 like sysbench.sbtest1;
create table sysbench2.sbtest1 like sysbench.sbtest1;
create table sysbench2.sbtest2 like sysbench.sbtest1;
create table sysbench2.sbtest3 like sysbench.sbtest1;
create table sysbench2.sbtest4 like sysbench.sbtest1;
create table sysbench3.sbtest1 like sysbench.sbtest1;
create table sysbench3.sbtest2 like sysbench.sbtest1;
create table sysbench3.sbtest3 like sysbench.sbtest1;
create table sysbench3.sbtest4 like sysbench.sbtest1;
create table sysbench4.sbtest1 like sysbench.sbtest1;
create table sysbench4.sbtest2 like sysbench.sbtest1;
create table sysbench4.sbtest3 like sysbench.sbtest1;
create table sysbench4.sbtest4 like sysbench.sbtest1;
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest1/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest2/g' | mysql -p'test' &
…
…
…
cat dumpfile.sql | sed -e's/`sbtest4`/sysbench1.sbtest4/g' | mysql -p'test' &
Multi-Threaded Slave
> CPU:2sx4c HT , Mem:32G, Disk:SAS 15Krpm 300G 4EA, Raid1+0 , 1 Master-3 Slaves
LOAD TEST
19Multi-Threaded Slave
LOAD TEST
Thread1 : insert
MASTER
SLAVE 1
(logical_clock)
SLAVE 2
(database)
SLAVE 3
(single thread)
Thread16 : insert
Thread2 : insert
Thread3 : insert
●
●
●
●
●
●
●
Thread4 : insert
Thread5 : insert
Thread6 : insert
20
> Case #1 – 1 database
>> Performing simple insert query in 16 threads (1 database,FILE)
Multi-Threaded Slave
>>> slogical_clock을 설정했을 경우 parallel하게 처리되는 것을 확인 할 수 있다. (slave1)
>>> database가 1개 일때는 worker thread로 parallel 하게 처리가 되지 않는것을 확인 할 수 있다. (slave2)
>>> single thread가 오히려 slave2 보다 QPS가 약간 높게 나왔다. (slave3)
0
5000
10000
15000
20000
25000
master slave1 (logical_clock) slave2 (database) slave3 (single thread)
insertQPS
Case #1 – 1 database,FILE
21
> Case #2 – 4 databases
>> Performing simple insert query in 16 threads on masterDB (4 databases,FILE)
Multi-Threaded Slave
>>> slogical_clock을 설정했을 경우 parallel하게 처리되는 것을 확인 할 수 있다. (slave1)
>>> database가 4개 일때 worker thread로 parallel 하게 처리되는 것을 확인 할 수 있다. (slave2)
>>> single thread 처리는 database가 1개 일때와 동일한 결과를 가져온다. (slave3)
0
5000
10000
15000
20000
25000
master slave1 (logical_clock) slave2 (database) slave3 (single thread)
insertQPS
Case #2 – 4 database,FILE
22
> Case #3 – 1 database
>> Performing simple insert query in 16 threads (1 database, TABLE)
Multi-Threaded Slave
>>> slogical_clock을 설정했을 경우 parallel하게 처리되는 것을 확인 할 수 있다. (slave1)
>>> database가 1개 일때는 worker thread로 parallel 하게 처리가 되지 않는것 을 확인 할 수 있다. (slave2)
>>> single thread가 오히려 slave2 보다 QPS가 약간 높게 나왔다. (slave3)
0
5000
10000
15000
20000
25000
master slave1 (logical_clock) slave2 (database) slave3 (single thread)
insertQPS
Case #3 – 1 database,TABLE
23
> Case #4 – 4 databases
>> Performing simple insert query in 16 threads on masterDB (4 databases, TABLE)
Multi-Threaded Slave
>>> slogical_clock을 설정했을 경우 parallel하게 처리되는 것을 확인 할 수 있다. (slave1)
>>> database가 4개 일때 worker thread로 parallel 하게 처리되는 것을 확인 할 수 있다. (slave2)
>>> single thread 처리는 database가 1개 일때와 동일한 결과를 가져온다. (slave3)
0
5000
10000
15000
20000
25000
master slave1 (logical_clock) slave2 (database) slave3 (single thread)
insertQPS
Case #4 – 4 database,TABLE
24
> Case #1_#2 – 1 database + FILE vs 4 databases + FILE : QPS
Multi-Threaded Slave
MASTER
SLAVE 1
(logical_clock)
SLAVE 2
(database)
SLAVE 3
(single)
44m/45m
70m/75m
298m/105m
3times
276m/277m
25Multi-Threaded Slave
MASTER
SLAVE 1
(logical_clock)
SLAVE 2
(database)
SLAVE 3
(single)
40%
14%/27%
13%
45%
> Case #1_#2 – 1 database + FILE vs 4 databases + FILE : CPU
26Multi-Threaded Slave
MASTER
SLAVE 1
(logical_clock)
SLAVE 2
(database)
SLAVE 3
(single)
45m/45m
76m/76m
370m/124m
3times
342m/340m
> Case #1_#2 – 1 database + TABLE vs 4 databases + TABLE : QPS
27Multi-Threaded Slave
LOAD TEST II - binlog_group_commit_sync_delay
Type slave-parallel-type slave_parallel_workers Syntax
master_info_repository
/ relay_log_info_repository
Master - - SET GLOBAL binlog_group_commit_sync_delay = 10; FILE/TABLE
Slave 1 LOGICAL_CLOCK 16 (MTS)
STOP SLAVE;
SET GLOBAL slave_parallel_type='LOGICAL_CLOCK';
SET GLOBAL slave_parallel_workers=16;
START SLAVE;
FILE/TABLE
Slave 2 DATABASE 16 (MTS)
STOP SLAVE;
SET GLOBAL slave_parallel_workers=16;
START SLAVE;
FILE/TABLE
Slave 3 - 0 (single thread) - FILE/TABLE
sysbench --test='/usr/share/doc/sysbench/tests/db/oltp.lua' --oltp_tables_count=1 
--report-interval=10 --oltp-table-size=3000000 --num-threads=16 --mysql-user=root 
--mysql-password=test --mysql-table-engine=innodb --rand-init=on 
--mysql-socket=/mysql/MyHome/tmp/mysql.sock 
--mysql-host=localhost --mysql-port=20306 --mysql-db=sysbench 
prepare
mysqldump --skip-extended-insert --no-create-info -p'test' sysbench > dumpfile.sql
create database sysbench1;
create table sysbench1.sbtest1 like sysbench.sbtest1;
create table sysbench1.sbtest2 like sysbench.sbtest1;
create table sysbench1.sbtest3 like sysbench.sbtest1;
create table sysbench1.sbtest4 like sysbench.sbtest1;
create table sysbench1.sbtest5 like sysbench.sbtest1;
create table sysbench1.sbtest6 like sysbench.sbtest1;
create table sysbench1.sbtest7 like sysbench.sbtest1;
create table sysbench1.sbtest8 like sysbench.sbtest1;
create table sysbench1.sbtest9 like sysbench.sbtest1;
create table sysbench1.sbtest10 like sysbench.sbtest1;
create table sysbench1.sbtest11 like sysbench.sbtest1;
create table sysbench1.sbtest12 like sysbench.sbtest1;
create table sysbench1.sbtest13 like sysbench.sbtest1;
create table sysbench1.sbtest14 like sysbench.sbtest1;
create table sysbench1.sbtest15 like sysbench.sbtest1;
create table sysbench1.sbtest16 like sysbench.sbtest1;
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest1/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest2/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest3/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest4/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest5/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest6/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest7/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest8/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest9/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest10/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest11/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest12/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest13/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest14/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest15/g' | mysql -p'test' &
cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest16/g' | mysql -p'test' &
> CPU:2sx4c HT , Mem:32G, Disk:SAS 15Krpm 300G 4EA, Raid1+0 , 1 Master-3 Slaves
28
> Case #5 – 1 database
>> Performing simple insert query in 16 threads (1 database,FILE)
Multi-Threaded Slave
>>> master서버는 binlog_group_commit_sync_delay 설정으로 master에서 동시에 처리할 수 있는 QPS가
줄어 든것을 확인할 수 있다. 특이사항은 Slave1의 경우는 master보다 동시에 처리할 수 있는 TRX가 증가하
였다. Slave2,slave3은 이전 테스트결과와 동일하게 나왔다.
0
2000
4000
6000
8000
10000
12000
14000
16000
18000
master slave1 (logical_clock) slave2 (database) slave3 (single thread)
insertQPS
Case #5 – 1 database,FILE
29
> Case #5 – 1 database & FILE - QPS
Multi-Threaded Slave
MASTER
SLAVE 1
(logical_clock)
SLAVE 2
(database)
SLAVE 3
(single)
60m (44m)
72m (70m)
291m (298m)
270m (276m)
TO DO 30
• MTS GTID vs binary file based
• MTS Configure Real service
• Rolling out GTID and MTS to a live system with no
downtime
• 데이터 암호화 / 특정 테이블 Load Test
• MTS 사용시 백업 이슈는 없는가?
Reference 31
# MySQL Replication and Multi-threaded Slaves
http://www.slideshare.net/shiv4289/mysql-user-campmultithreadedslaves
# The latest with MySQL on OpenStack Trove
http://www.slideshare.net/tesoracorp/the-latest-with-mysql-on-openstack-trove
# MySQL Replication and Scalability
http://www.slideshare.net/shiv4289/my-sql-replicationscalability
# MySQL 5.6 replication
http://www.slideshare.net/MarkSwarbrick/mysql-56-replication-webinar
# Performance issues and fixes -- MySQL 5.6 Semi-Synchrnous Replication
http://yoshinorimatsunobu.blogspot.jp/2015/01/performance-issues-and-fixes-mysql-56.html
# Q&A: Multi-threaded Replication in MySQL 5.6 and MySQL 5.7
https://www.percona.com/blog/2015/03/13/qa-multi-threaded-replication-in-mysql-5-6-and-mysql-5-7/
> MTS
thank you

Más contenido relacionado

Más de I Goo Lee

Federated Engine 실무적용사례
Federated Engine 실무적용사례Federated Engine 실무적용사례
Federated Engine 실무적용사례I Goo Lee
 
MySQL 상태 메시지 분석 및 활용
MySQL 상태 메시지 분석 및 활용MySQL 상태 메시지 분석 및 활용
MySQL 상태 메시지 분석 및 활용I Goo Lee
 
MySQL 5.7 NF – Optimizer Improvement
 MySQL 5.7 NF – Optimizer Improvement MySQL 5.7 NF – Optimizer Improvement
MySQL 5.7 NF – Optimizer ImprovementI Goo Lee
 
MySQL 5.7 NF – JSON Datatype 활용
MySQL 5.7 NF – JSON Datatype 활용MySQL 5.7 NF – JSON Datatype 활용
MySQL 5.7 NF – JSON Datatype 활용I Goo Lee
 
Intro KaKao MRTE (MySQL Realtime Traffic Emulator)
Intro KaKao MRTE (MySQL Realtime Traffic Emulator)Intro KaKao MRTE (MySQL Realtime Traffic Emulator)
Intro KaKao MRTE (MySQL Realtime Traffic Emulator)I Goo Lee
 
MS 빅데이터 서비스 및 게임사 PoC 사례 소개
MS 빅데이터 서비스 및 게임사 PoC 사례 소개MS 빅데이터 서비스 및 게임사 PoC 사례 소개
MS 빅데이터 서비스 및 게임사 PoC 사례 소개I Goo Lee
 
AWS 환경에서 MySQL Infra 설계하기-2본론
AWS 환경에서 MySQL Infra 설계하기-2본론AWS 환경에서 MySQL Infra 설계하기-2본론
AWS 환경에서 MySQL Infra 설계하기-2본론I Goo Lee
 
AWS 환경에서 MySQL Infra 설계하기-1도입부분
AWS 환경에서 MySQL Infra 설계하기-1도입부분AWS 환경에서 MySQL Infra 설계하기-1도입부분
AWS 환경에서 MySQL Infra 설계하기-1도입부분I Goo Lee
 
AWS 환경에서 MySQL BMT
AWS 환경에서 MySQL BMTAWS 환경에서 MySQL BMT
AWS 환경에서 MySQL BMTI Goo Lee
 
MySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKMySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKI Goo Lee
 
MySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKMySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKI Goo Lee
 
PostgreSQL 이야기
PostgreSQL 이야기PostgreSQL 이야기
PostgreSQL 이야기I Goo Lee
 
Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)I Goo Lee
 
Binlog Servers 구축사례
Binlog Servers 구축사례Binlog Servers 구축사례
Binlog Servers 구축사례I Goo Lee
 
Intro ProxySQL
Intro ProxySQLIntro ProxySQL
Intro ProxySQLI Goo Lee
 
1.mysql disk io 모니터링 및 분석사례
1.mysql disk io 모니터링 및 분석사례1.mysql disk io 모니터링 및 분석사례
1.mysql disk io 모니터링 및 분석사례I Goo Lee
 
.NET Webservice for MySQL
.NET Webservice for MySQL.NET Webservice for MySQL
.NET Webservice for MySQLI Goo Lee
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQLI Goo Lee
 
백업인프라 개선 (w/님블스토리지) - 1TB 를 10분 내에
백업인프라 개선 (w/님블스토리지) - 1TB 를 10분 내에백업인프라 개선 (w/님블스토리지) - 1TB 를 10분 내에
백업인프라 개선 (w/님블스토리지) - 1TB 를 10분 내에I Goo Lee
 
JSON 데이터를 DB에 넣고 사용하고 싶다
JSON 데이터를 DB에 넣고 사용하고 싶다JSON 데이터를 DB에 넣고 사용하고 싶다
JSON 데이터를 DB에 넣고 사용하고 싶다I Goo Lee
 

Más de I Goo Lee (20)

Federated Engine 실무적용사례
Federated Engine 실무적용사례Federated Engine 실무적용사례
Federated Engine 실무적용사례
 
MySQL 상태 메시지 분석 및 활용
MySQL 상태 메시지 분석 및 활용MySQL 상태 메시지 분석 및 활용
MySQL 상태 메시지 분석 및 활용
 
MySQL 5.7 NF – Optimizer Improvement
 MySQL 5.7 NF – Optimizer Improvement MySQL 5.7 NF – Optimizer Improvement
MySQL 5.7 NF – Optimizer Improvement
 
MySQL 5.7 NF – JSON Datatype 활용
MySQL 5.7 NF – JSON Datatype 활용MySQL 5.7 NF – JSON Datatype 활용
MySQL 5.7 NF – JSON Datatype 활용
 
Intro KaKao MRTE (MySQL Realtime Traffic Emulator)
Intro KaKao MRTE (MySQL Realtime Traffic Emulator)Intro KaKao MRTE (MySQL Realtime Traffic Emulator)
Intro KaKao MRTE (MySQL Realtime Traffic Emulator)
 
MS 빅데이터 서비스 및 게임사 PoC 사례 소개
MS 빅데이터 서비스 및 게임사 PoC 사례 소개MS 빅데이터 서비스 및 게임사 PoC 사례 소개
MS 빅데이터 서비스 및 게임사 PoC 사례 소개
 
AWS 환경에서 MySQL Infra 설계하기-2본론
AWS 환경에서 MySQL Infra 설계하기-2본론AWS 환경에서 MySQL Infra 설계하기-2본론
AWS 환경에서 MySQL Infra 설계하기-2본론
 
AWS 환경에서 MySQL Infra 설계하기-1도입부분
AWS 환경에서 MySQL Infra 설계하기-1도입부분AWS 환경에서 MySQL Infra 설계하기-1도입부분
AWS 환경에서 MySQL Infra 설계하기-1도입부분
 
AWS 환경에서 MySQL BMT
AWS 환경에서 MySQL BMTAWS 환경에서 MySQL BMT
AWS 환경에서 MySQL BMT
 
MySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELKMySQL Slow Query log Monitoring using Beats & ELK
MySQL Slow Query log Monitoring using Beats & ELK
 
MySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKMySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELK
 
PostgreSQL 이야기
PostgreSQL 이야기PostgreSQL 이야기
PostgreSQL 이야기
 
Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)
 
Binlog Servers 구축사례
Binlog Servers 구축사례Binlog Servers 구축사례
Binlog Servers 구축사례
 
Intro ProxySQL
Intro ProxySQLIntro ProxySQL
Intro ProxySQL
 
1.mysql disk io 모니터링 및 분석사례
1.mysql disk io 모니터링 및 분석사례1.mysql disk io 모니터링 및 분석사례
1.mysql disk io 모니터링 및 분석사례
 
.NET Webservice for MySQL
.NET Webservice for MySQL.NET Webservice for MySQL
.NET Webservice for MySQL
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQL
 
백업인프라 개선 (w/님블스토리지) - 1TB 를 10분 내에
백업인프라 개선 (w/님블스토리지) - 1TB 를 10분 내에백업인프라 개선 (w/님블스토리지) - 1TB 를 10분 내에
백업인프라 개선 (w/님블스토리지) - 1TB 를 10분 내에
 
JSON 데이터를 DB에 넣고 사용하고 싶다
JSON 데이터를 DB에 넣고 사용하고 싶다JSON 데이터를 DB에 넣고 사용하고 싶다
JSON 데이터를 DB에 넣고 사용하고 싶다
 

Último

Top Rated Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
Top Rated  Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...Top Rated  Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
Top Rated Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...Call Girls in Nagpur High Profile
 
Pirangut | Call Girls Pune Phone No 8005736733 Elite Escort Service Available...
Pirangut | Call Girls Pune Phone No 8005736733 Elite Escort Service Available...Pirangut | Call Girls Pune Phone No 8005736733 Elite Escort Service Available...
Pirangut | Call Girls Pune Phone No 8005736733 Elite Escort Service Available...SUHANI PANDEY
 
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLLucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLimonikaupta
 
Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...
Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...
Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...Delhi Call girls
 
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查ydyuyu
 
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...SUHANI PANDEY
 
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men 🔝mehsana🔝 Escorts...
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men  🔝mehsana🔝   Escorts...➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men  🔝mehsana🔝   Escorts...
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men 🔝mehsana🔝 Escorts...nirzagarg
 
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service AvailableCall Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service AvailableSeo
 
Real Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirtReal Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirtrahman018755
 
Russian Call Girls Pune (Adult Only) 8005736733 Escort Service 24x7 Cash Pay...
Russian Call Girls Pune  (Adult Only) 8005736733 Escort Service 24x7 Cash Pay...Russian Call Girls Pune  (Adult Only) 8005736733 Escort Service 24x7 Cash Pay...
Russian Call Girls Pune (Adult Only) 8005736733 Escort Service 24x7 Cash Pay...SUHANI PANDEY
 
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...tanu pandey
 
VVIP Pune Call Girls Sinhagad WhatSapp Number 8005736733 With Elite Staff And...
VVIP Pune Call Girls Sinhagad WhatSapp Number 8005736733 With Elite Staff And...VVIP Pune Call Girls Sinhagad WhatSapp Number 8005736733 With Elite Staff And...
VVIP Pune Call Girls Sinhagad WhatSapp Number 8005736733 With Elite Staff And...SUHANI PANDEY
 
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
20240509 QFM015 Engineering Leadership Reading List April 2024.pdfMatthew Sinclair
 
2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs
2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs
2nd Solid Symposium: Solid Pods vs Personal Knowledge GraphsEleniIlkou
 
Katraj ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For S...
Katraj ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For S...Katraj ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For S...
Katraj ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For S...tanu pandey
 
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)Delhi Call girls
 
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...nilamkumrai
 

Último (20)

Top Rated Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
Top Rated  Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...Top Rated  Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
Top Rated Pune Call Girls Daund ⟟ 6297143586 ⟟ Call Me For Genuine Sex Servi...
 
Pirangut | Call Girls Pune Phone No 8005736733 Elite Escort Service Available...
Pirangut | Call Girls Pune Phone No 8005736733 Elite Escort Service Available...Pirangut | Call Girls Pune Phone No 8005736733 Elite Escort Service Available...
Pirangut | Call Girls Pune Phone No 8005736733 Elite Escort Service Available...
 
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRLLucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
Lucknow ❤CALL GIRL 88759*99948 ❤CALL GIRLS IN Lucknow ESCORT SERVICE❤CALL GIRL
 
Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...
Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...
Hire↠Young Call Girls in Tilak nagar (Delhi) ☎️ 9205541914 ☎️ Independent Esc...
 
(INDIRA) Call Girl Pune Call Now 8250077686 Pune Escorts 24x7
(INDIRA) Call Girl Pune Call Now 8250077686 Pune Escorts 24x7(INDIRA) Call Girl Pune Call Now 8250077686 Pune Escorts 24x7
(INDIRA) Call Girl Pune Call Now 8250077686 Pune Escorts 24x7
 
valsad Escorts Service ☎️ 6378878445 ( Sakshi Sinha ) High Profile Call Girls...
valsad Escorts Service ☎️ 6378878445 ( Sakshi Sinha ) High Profile Call Girls...valsad Escorts Service ☎️ 6378878445 ( Sakshi Sinha ) High Profile Call Girls...
valsad Escorts Service ☎️ 6378878445 ( Sakshi Sinha ) High Profile Call Girls...
 
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查在线制作约克大学毕业证(yu毕业证)在读证明认证可查
在线制作约克大学毕业证(yu毕业证)在读证明认证可查
 
📱Dehradun Call Girls Service 📱☎️ +91'905,3900,678 ☎️📱 Call Girls In Dehradun 📱
📱Dehradun Call Girls Service 📱☎️ +91'905,3900,678 ☎️📱 Call Girls In Dehradun 📱📱Dehradun Call Girls Service 📱☎️ +91'905,3900,678 ☎️📱 Call Girls In Dehradun 📱
📱Dehradun Call Girls Service 📱☎️ +91'905,3900,678 ☎️📱 Call Girls In Dehradun 📱
 
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
Shikrapur - Call Girls in Pune Neha 8005736733 | 100% Gennuine High Class Ind...
 
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men 🔝mehsana🔝 Escorts...
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men  🔝mehsana🔝   Escorts...➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men  🔝mehsana🔝   Escorts...
➥🔝 7737669865 🔝▻ mehsana Call-girls in Women Seeking Men 🔝mehsana🔝 Escorts...
 
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service AvailableCall Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
Call Girls Ludhiana Just Call 98765-12871 Top Class Call Girl Service Available
 
Real Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirtReal Men Wear Diapers T Shirts sweatshirt
Real Men Wear Diapers T Shirts sweatshirt
 
Russian Call Girls Pune (Adult Only) 8005736733 Escort Service 24x7 Cash Pay...
Russian Call Girls Pune  (Adult Only) 8005736733 Escort Service 24x7 Cash Pay...Russian Call Girls Pune  (Adult Only) 8005736733 Escort Service 24x7 Cash Pay...
Russian Call Girls Pune (Adult Only) 8005736733 Escort Service 24x7 Cash Pay...
 
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...Pune Airport ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready...
Pune Airport ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready...
 
VVIP Pune Call Girls Sinhagad WhatSapp Number 8005736733 With Elite Staff And...
VVIP Pune Call Girls Sinhagad WhatSapp Number 8005736733 With Elite Staff And...VVIP Pune Call Girls Sinhagad WhatSapp Number 8005736733 With Elite Staff And...
VVIP Pune Call Girls Sinhagad WhatSapp Number 8005736733 With Elite Staff And...
 
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
20240509 QFM015 Engineering Leadership Reading List April 2024.pdf
 
2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs
2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs
2nd Solid Symposium: Solid Pods vs Personal Knowledge Graphs
 
Katraj ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For S...
Katraj ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For S...Katraj ( Call Girls ) Pune  6297143586  Hot Model With Sexy Bhabi Ready For S...
Katraj ( Call Girls ) Pune 6297143586 Hot Model With Sexy Bhabi Ready For S...
 
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
WhatsApp 📞 8448380779 ✅Call Girls In Mamura Sector 66 ( Noida)
 
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...
( Pune ) VIP Pimpri Chinchwad Call Girls 🎗️ 9352988975 Sizzling | Escorts | G...
 

MySQL 5.7 MTS (Multi Thread Slave)

  • 3. Multi-Threaded Slave 3 binary log Client Client Client MASTER relay log SLAVE * Before MySQL 5.6 : Single-threaded slave Bottleneck
  • 4. Multi-Threaded Slave 4 binary log Client Client Client MASTER relay log SLAVE binary log Client Client Client MASTER relay log * Before MySQL 5.6 : Single-threaded slave Bottleneck * MySQL 5.6 : Multi-threaded slave by database db1 SLAVE db2 db3
  • 5. Multi-Threaded Slave 5 > Multiple execution threads to apply replication events to the slave(s); > Splits processing between worker threads based on : - Schema(MySQL 5.6+) ㆍSET GLOBAL slave_parallel_type = DATABASE; ㆍMulti-tenant systems friendly; - Locking-based parallelism(new in MySQL 5.7.2) ㆍSET GLOBAL slave_parallel_type = LOGICAL_CLOCK; ㆍIntra-schema parallelization; ㆍBased on information collected during master’s commit of the transactons; > DATABASE : parallelize by database > LOGICAL_CLOCK : parallelize by master concurrency
  • 6. 6 binary log Client Client Client MASTER relay log * MySQL 5.7.2 : Multi-threaded slave by master concurrency Multi-Threaded Slave Receiver thread relay log COORDINATOR Thread db1 Reads & assigns to worker(s) Applier threads worker1 worker2 worker3 SLAVE SLAVE db1
  • 7. 7Multi-Threaded Slave Configure MTS > STOP SLAVE; > SET GLOBAL slave_parallel_type='LOGICAL_CLOCK'; > SET GLOBAL slave_parallel_workers=5; > START SLAVE;
  • 8. 8 Receiver thread(a.k.a. IO thread) Coordinator thread (a.k.a SQL thread) Applier threads Show processlist for MTS Multi-Threaded Slave ㆍ Waiting for the next event in relay log : The initial state before Reading event from the relay log. ㆍ Reading event from the relay log : The thread has read an event from the relay log so that the event can be processed. ㆍ Making temp file : The thread is executing a LOAD DATA INFILE statement and is creating a temporary file containing the data from which the slave will read rows. ㆍ Slave has read all relay log; waiting for the slave I/O thread to update it : The thread has processed all events in the relay log files, and is now waiting for the I/O thread to write new events to the relay log. ㆍ Waiting for slave mutex on exit : A very brief state that occurs as the thread is stopping. https://dev.mysql.com/doc/refman/5.5/en/slave-sql-thread-states.html http://dev.mysql.com/doc/refman/5.7/en/replication-options-slave.html
  • 9. 9 Replication Monitoring : P_S Replication Tables performance_schema > show tables; +----------------------------------------------------------+ …… | …… | | replication_applier_configuration | | replication_applier_status | | replication_applier_status_by_coordinator | | replication_applier_status_by_worker | | replication_connection_configuration | | replication_connection_status | | replication_group_member_stats | | replication_group_members | …… | …… | +----------------------------------------------------------+ https://dev.mysql.com/doc/mysql-perfschema-excerpt/5.7/en/performance-schema-replication-tables.html Multi-Threaded Slave
  • 10. 10 > replication_applier_status_by_coordinator > replication_applier_status_by_worker Multi-Threaded Slave The REPLICATION P_S Tables SHOW SLAVE STATUS > Do not have information about MTS workers;
  • 11. 11Multi-Threaded Slave Use case Case1. T1. update T set col1 = 2 where col1=3; T2. update T set col1 = 4 where col1=2; Case2. x=1, y=1, z=99 On master we apply T1 and T2 in that order T1. Update T set x=Read(y)+1 where z = 99; T2. Update T set y=Read(x)+1 where z = 99; On the slave however these two transactions commit out out order T2. Update T set y=Read(x)+1 where z = 99; T1. Update T set x=Read(y)+1 where z = 99;
  • 12. 12Multi-Threaded Slave Use case Case1. T1. update T set col1 = 2 where col1=3; T2. update T set col1 = 4 where col1=2; Case2. x=1, y=1, z=99 On master we apply T1 and T2 in that order T1. Update T set x=Read(y)+1 where z = 99; T2. Update T set y=Read(x)+1 where z = 99; On the slave however these two transactions commit out out order T2. Update T set y=Read(x)+1 where z = 99; T1. Update T set x=Read(y)+1 where z = 99; x=2 , y=3 X=3, y=2
  • 13. 13Multi-Threaded Slave > slave_parallel_type= LOGICAL_CLOCK •Leverage parallelization information obtained from the execution on the master: –Transactions that prepare on the same “version” of the database, are assigned the same timestamp; 같은 프리페어 트랜잭션은 같은 시간으로 어사인된다. > parallelization conditions : Same commit_parent id ( prepare stage) > The pseudo code is as follows. During Prepare trx.commit_parent= commit_clock.get_timestamp(); During Commit for every binlog group commit_clock.step(); Logical clock and commit parent
  • 14. 14Multi-Threaded Slave Logical clock and commit parent http://geek.rohitkalhans.com/2013/09/enhancedMTS-deepdive.html
  • 15. 15Multi-Threaded Slave ORACLE – 2013.11.13 ORACLE – 2014.09.23 OOW - 2015
  • 16. 16Multi-Threaded Slave transaction_info.h /*Binlog-specific logical timestamps.*/ /* Store for the transaction's commit parent sequence_number. The value specifies this transaction dependency with a"parent" transaction. The member is assigned, when the transaction is about to commit in binlog to a value of the last committed transaction's sequence_number. This and last_committed as numbers are kept ever incremented regardless of binary logs being rotated or when transaction is logged in multiple pieces. However the logger to the binary log may convert them according to its specification. */ int64 last_committed; /* The transaction's private logical timestamp assigned at the transaction prepare phase. The timestamp enumerates transactions in the binary log. The value is gained through incrementing (stepping)a global clock. Eventually the value is considered to increase max_committed_transaction system clock when the transaction has committed. */ int64 sequence_number;
  • 17. 17 Type slave-parallel-type slave_parallel_workers Syntax master_info_repository / relay_log_info_repository Master - - - FILE/TABLE Slave 1 LOGICAL_CLOCK 16 (MTS) STOP SLAVE; SET GLOBAL slave_parallel_type='LOGICAL_CLOCK'; SET GLOBAL slave_parallel_workers=16; START SLAVE; FILE/TABLE Slave 2 DATABASE 16 (MTS) STOP SLAVE; SET GLOBAL slave_parallel_workers=16; START SLAVE; FILE/TABLE Slave 3 - 0 (single thread) - FILE/TABLE > master_info_repository – introduced 5.6.2 : The setting of this variable determines whether the slave logs master status and connec tion information to a FILE (master.info), or to a TABLE (mysql.slave_master_info). > relay_log_info_repository – introduced 5.6.2 : This variable determines whether the slave's position in the relay logs is written to a FIL E (relay-log.info) or to a TABLE (mysql.slave_relay_log_info). > Changing slave repository : stop slave; set global master_info_repository = 'table'; set global relay_log_info_repository = 'table'; start slave; Multi-Threaded Slave LOAD TEST > CPU:2sx4c HT , Mem:32G, Disk:SAS 15Krpm 300G 4EA, Raid1+0 , 1 Master-3 Slaves
  • 18. 18 Type slave-parallel-type slave_parallel_workers Syntax master_info_repository / relay_log_info_repository Master - - - FILE/TABLE Slave 1 LOGICAL_CLOCK 16 (MTS) STOP SLAVE; SET GLOBAL slave_parallel_type='LOGICAL_CLOCK'; SET GLOBAL slave_parallel_workers=16; START SLAVE; FILE/TABLE Slave 2 DATABASE 16 (MTS) STOP SLAVE; SET GLOBAL slave_parallel_workers=16; START SLAVE; FILE/TABLE Slave 3 - 0 (single thread) - FILE/TABLE sysbench --test='/usr/share/doc/sysbench/tests/db/oltp.lua' --oltp_tables_count=1 --report-interval=10 --oltp-table-size=3000000 --num-threads=16 --mysql-user=root --mysql-password=test --mysql-table-engine=innodb --rand-init=on --mysql-socket=/mysql/MyHome/tmp/mysql.sock --mysql-host=localhost --mysql-port=20306 --mysql-db=sysbench prepare mysqldump --skip-extended-insert --no-create-info -p'test' sysbench > dumpfile.sql create database sysbench1; create database sysbench2; create database sysbench3; create database sysbench4; create table sysbench1.sbtest1 like sysbench.sbtest1; create table sysbench1.sbtest2 like sysbench.sbtest1; create table sysbench1.sbtest3 like sysbench.sbtest1; create table sysbench1.sbtest4 like sysbench.sbtest1; create table sysbench1.sbtest5 like sysbench.sbtest1; create table sysbench1.sbtest6 like sysbench.sbtest1; create table sysbench1.sbtest7 like sysbench.sbtest1; create table sysbench1.sbtest8 like sysbench.sbtest1; create table sysbench1.sbtest9 like sysbench.sbtest1; create table sysbench1.sbtest10 like sysbench.sbtest1; create table sysbench1.sbtest11 like sysbench.sbtest1; create table sysbench1.sbtest12 like sysbench.sbtest1; create table sysbench1.sbtest13 like sysbench.sbtest1; create table sysbench1.sbtest14 like sysbench.sbtest1; create table sysbench1.sbtest15 like sysbench.sbtest1; create table sysbench1.sbtest16 like sysbench.sbtest1; create table sysbench2.sbtest1 like sysbench.sbtest1; create table sysbench2.sbtest2 like sysbench.sbtest1; create table sysbench2.sbtest3 like sysbench.sbtest1; create table sysbench2.sbtest4 like sysbench.sbtest1; create table sysbench3.sbtest1 like sysbench.sbtest1; create table sysbench3.sbtest2 like sysbench.sbtest1; create table sysbench3.sbtest3 like sysbench.sbtest1; create table sysbench3.sbtest4 like sysbench.sbtest1; create table sysbench4.sbtest1 like sysbench.sbtest1; create table sysbench4.sbtest2 like sysbench.sbtest1; create table sysbench4.sbtest3 like sysbench.sbtest1; create table sysbench4.sbtest4 like sysbench.sbtest1; cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest1/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest2/g' | mysql -p'test' & … … … cat dumpfile.sql | sed -e's/`sbtest4`/sysbench1.sbtest4/g' | mysql -p'test' & Multi-Threaded Slave > CPU:2sx4c HT , Mem:32G, Disk:SAS 15Krpm 300G 4EA, Raid1+0 , 1 Master-3 Slaves LOAD TEST
  • 19. 19Multi-Threaded Slave LOAD TEST Thread1 : insert MASTER SLAVE 1 (logical_clock) SLAVE 2 (database) SLAVE 3 (single thread) Thread16 : insert Thread2 : insert Thread3 : insert ● ● ● ● ● ● ● Thread4 : insert Thread5 : insert Thread6 : insert
  • 20. 20 > Case #1 – 1 database >> Performing simple insert query in 16 threads (1 database,FILE) Multi-Threaded Slave >>> slogical_clock을 설정했을 경우 parallel하게 처리되는 것을 확인 할 수 있다. (slave1) >>> database가 1개 일때는 worker thread로 parallel 하게 처리가 되지 않는것을 확인 할 수 있다. (slave2) >>> single thread가 오히려 slave2 보다 QPS가 약간 높게 나왔다. (slave3) 0 5000 10000 15000 20000 25000 master slave1 (logical_clock) slave2 (database) slave3 (single thread) insertQPS Case #1 – 1 database,FILE
  • 21. 21 > Case #2 – 4 databases >> Performing simple insert query in 16 threads on masterDB (4 databases,FILE) Multi-Threaded Slave >>> slogical_clock을 설정했을 경우 parallel하게 처리되는 것을 확인 할 수 있다. (slave1) >>> database가 4개 일때 worker thread로 parallel 하게 처리되는 것을 확인 할 수 있다. (slave2) >>> single thread 처리는 database가 1개 일때와 동일한 결과를 가져온다. (slave3) 0 5000 10000 15000 20000 25000 master slave1 (logical_clock) slave2 (database) slave3 (single thread) insertQPS Case #2 – 4 database,FILE
  • 22. 22 > Case #3 – 1 database >> Performing simple insert query in 16 threads (1 database, TABLE) Multi-Threaded Slave >>> slogical_clock을 설정했을 경우 parallel하게 처리되는 것을 확인 할 수 있다. (slave1) >>> database가 1개 일때는 worker thread로 parallel 하게 처리가 되지 않는것 을 확인 할 수 있다. (slave2) >>> single thread가 오히려 slave2 보다 QPS가 약간 높게 나왔다. (slave3) 0 5000 10000 15000 20000 25000 master slave1 (logical_clock) slave2 (database) slave3 (single thread) insertQPS Case #3 – 1 database,TABLE
  • 23. 23 > Case #4 – 4 databases >> Performing simple insert query in 16 threads on masterDB (4 databases, TABLE) Multi-Threaded Slave >>> slogical_clock을 설정했을 경우 parallel하게 처리되는 것을 확인 할 수 있다. (slave1) >>> database가 4개 일때 worker thread로 parallel 하게 처리되는 것을 확인 할 수 있다. (slave2) >>> single thread 처리는 database가 1개 일때와 동일한 결과를 가져온다. (slave3) 0 5000 10000 15000 20000 25000 master slave1 (logical_clock) slave2 (database) slave3 (single thread) insertQPS Case #4 – 4 database,TABLE
  • 24. 24 > Case #1_#2 – 1 database + FILE vs 4 databases + FILE : QPS Multi-Threaded Slave MASTER SLAVE 1 (logical_clock) SLAVE 2 (database) SLAVE 3 (single) 44m/45m 70m/75m 298m/105m 3times 276m/277m
  • 25. 25Multi-Threaded Slave MASTER SLAVE 1 (logical_clock) SLAVE 2 (database) SLAVE 3 (single) 40% 14%/27% 13% 45% > Case #1_#2 – 1 database + FILE vs 4 databases + FILE : CPU
  • 26. 26Multi-Threaded Slave MASTER SLAVE 1 (logical_clock) SLAVE 2 (database) SLAVE 3 (single) 45m/45m 76m/76m 370m/124m 3times 342m/340m > Case #1_#2 – 1 database + TABLE vs 4 databases + TABLE : QPS
  • 27. 27Multi-Threaded Slave LOAD TEST II - binlog_group_commit_sync_delay Type slave-parallel-type slave_parallel_workers Syntax master_info_repository / relay_log_info_repository Master - - SET GLOBAL binlog_group_commit_sync_delay = 10; FILE/TABLE Slave 1 LOGICAL_CLOCK 16 (MTS) STOP SLAVE; SET GLOBAL slave_parallel_type='LOGICAL_CLOCK'; SET GLOBAL slave_parallel_workers=16; START SLAVE; FILE/TABLE Slave 2 DATABASE 16 (MTS) STOP SLAVE; SET GLOBAL slave_parallel_workers=16; START SLAVE; FILE/TABLE Slave 3 - 0 (single thread) - FILE/TABLE sysbench --test='/usr/share/doc/sysbench/tests/db/oltp.lua' --oltp_tables_count=1 --report-interval=10 --oltp-table-size=3000000 --num-threads=16 --mysql-user=root --mysql-password=test --mysql-table-engine=innodb --rand-init=on --mysql-socket=/mysql/MyHome/tmp/mysql.sock --mysql-host=localhost --mysql-port=20306 --mysql-db=sysbench prepare mysqldump --skip-extended-insert --no-create-info -p'test' sysbench > dumpfile.sql create database sysbench1; create table sysbench1.sbtest1 like sysbench.sbtest1; create table sysbench1.sbtest2 like sysbench.sbtest1; create table sysbench1.sbtest3 like sysbench.sbtest1; create table sysbench1.sbtest4 like sysbench.sbtest1; create table sysbench1.sbtest5 like sysbench.sbtest1; create table sysbench1.sbtest6 like sysbench.sbtest1; create table sysbench1.sbtest7 like sysbench.sbtest1; create table sysbench1.sbtest8 like sysbench.sbtest1; create table sysbench1.sbtest9 like sysbench.sbtest1; create table sysbench1.sbtest10 like sysbench.sbtest1; create table sysbench1.sbtest11 like sysbench.sbtest1; create table sysbench1.sbtest12 like sysbench.sbtest1; create table sysbench1.sbtest13 like sysbench.sbtest1; create table sysbench1.sbtest14 like sysbench.sbtest1; create table sysbench1.sbtest15 like sysbench.sbtest1; create table sysbench1.sbtest16 like sysbench.sbtest1; cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest1/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest2/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest3/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest4/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest5/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest6/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest7/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest8/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest9/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest10/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest11/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest12/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest13/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest14/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest15/g' | mysql -p'test' & cat dumpfile.sql | sed -e's/`sbtest1`/sysbench1.sbtest16/g' | mysql -p'test' & > CPU:2sx4c HT , Mem:32G, Disk:SAS 15Krpm 300G 4EA, Raid1+0 , 1 Master-3 Slaves
  • 28. 28 > Case #5 – 1 database >> Performing simple insert query in 16 threads (1 database,FILE) Multi-Threaded Slave >>> master서버는 binlog_group_commit_sync_delay 설정으로 master에서 동시에 처리할 수 있는 QPS가 줄어 든것을 확인할 수 있다. 특이사항은 Slave1의 경우는 master보다 동시에 처리할 수 있는 TRX가 증가하 였다. Slave2,slave3은 이전 테스트결과와 동일하게 나왔다. 0 2000 4000 6000 8000 10000 12000 14000 16000 18000 master slave1 (logical_clock) slave2 (database) slave3 (single thread) insertQPS Case #5 – 1 database,FILE
  • 29. 29 > Case #5 – 1 database & FILE - QPS Multi-Threaded Slave MASTER SLAVE 1 (logical_clock) SLAVE 2 (database) SLAVE 3 (single) 60m (44m) 72m (70m) 291m (298m) 270m (276m)
  • 30. TO DO 30 • MTS GTID vs binary file based • MTS Configure Real service • Rolling out GTID and MTS to a live system with no downtime • 데이터 암호화 / 특정 테이블 Load Test • MTS 사용시 백업 이슈는 없는가?
  • 31. Reference 31 # MySQL Replication and Multi-threaded Slaves http://www.slideshare.net/shiv4289/mysql-user-campmultithreadedslaves # The latest with MySQL on OpenStack Trove http://www.slideshare.net/tesoracorp/the-latest-with-mysql-on-openstack-trove # MySQL Replication and Scalability http://www.slideshare.net/shiv4289/my-sql-replicationscalability # MySQL 5.6 replication http://www.slideshare.net/MarkSwarbrick/mysql-56-replication-webinar # Performance issues and fixes -- MySQL 5.6 Semi-Synchrnous Replication http://yoshinorimatsunobu.blogspot.jp/2015/01/performance-issues-and-fixes-mysql-56.html # Q&A: Multi-threaded Replication in MySQL 5.6 and MySQL 5.7 https://www.percona.com/blog/2015/03/13/qa-multi-threaded-replication-in-mysql-5-6-and-mysql-5-7/ > MTS
  • 32.