SlideShare a Scribd company logo
Federated Engine 적용사례와 동작원리
2015. 11.
이윤정
- 1/17 -
Federated Table 적용 사례 1
동기화대상테이블
(=원본테이블)
트리거
한국
원본테이블_DML
DML
유형
DML
일시
순번
동기화 테이블과
동일한 구성
ToBe
지역코드
미국 유럽(네덜란드)
federated_원본테이블_dml federated_원본테이블_dml
원본테이블_dml 원본테이블이름_dml
원본테이블 원본테이블
sp_sync_원본테이블이름
(동기화 stored procedure)
sp_sync_원본테이블이름
(동기화 stored procedure)
Federated Table은
미국DB 혹은 유럽DB에서
한국DB에 있는 테이블의 내용을
읽어오는 용도로만 사용함
미국/유럽 DB에서는
한국DB에서 데이터를 가져온
마지막 “순번”이후의 데이터만
한국DB에서 읽어오도록 조건을 줘서
인덱스를 이용해 데이터를 읽도록 했음
PK
한국 <-> 미국 : 2Mbps
한국 <-> 유럽: 1Mbps
해외에서 한국에 있는 DML이력을 가져와서 해외에 반영한 후 반영여부를 한국에 update 해주는 경우 분당 약 1000건 처리
해외에서 한국에 있는 DML이력을 읽어오기만 하고 해외에 반영됐는지 여부를 한국에 update는 하지 않는 경우 분당 약 30,000건 처리
- 2/17 -
Federated Table 적용 사례 2
 Federated Table 과 Local Table 간의 조인 (Federated Table 이 Driving Table이면서 NOT IN & UNION ALL...)
쿼리에서 Federated Table 의 데이터를 전부 Local DB 로 가져온 후 한 건씩 Nested Loop Join 하면서 과도한
메모리를 사용하게 됨
평소 DB서버의 상태
Federated Table을 이용 쿼리가 실행될 때
- 3/17 -
Federated Engine 이해
 Remote Server에 있는 MySQL/MariaDB에 있는 테이블에 접근할 수 있게 하는 스토리지 엔진
(Oracle의 DB Link와 유사함)
 Local Server에서 Remote Server에 있는 테이블을 Local Server에 있는 테이블처럼 사용할 수 있게 해준다.
 MySQL에서 Federated, MariaDB에서는 FederatedX(확장된 기능의 Federated) 로 부르고 있다.
 실체가 없는 브릿지 역할을 한다.
- 4/17 -
Federated Engine 활성화
 Local Server에서 Federated 엔진이 활성화 돼 있어야 한다.
 MariaDB: 별다른 옵션 없이 사용할 수 있다.(기본적으로 활성화 돼 있음)
 MySQL: 환경을 설정한 후에 DB를 restart 한다.
 엔진 활성화 여부 확인
vi my.cnf
[mysqld]
…
Federated
…
SHOW ENGINES;
- 5/17 -
Federated Table 생성 – 방법1: 테이블 생성문 안에 Remote Server 정보 포함
 Remote Table
 Local Table
 Local Server에 만든 Federated Table은 Local에 있는 다른 일반 테이블처럼 사용이 가능하다.
 SHOW CREATE TABLE 구문을 이용하면 테이블 생성에 사용된 username, password, host 등 모든 정보가
노출된다.
↑
username
↑
password
↑
host
↑
port
↑
schema
↑
tablename
create table remoteschema.t1
(
id int unsigned not null auto_increment primary key
,c1 int
,c2 varchar(100)
)
engine=innodb
default charset=utf8;
create table localschema.federated_t1
(
id int unsigned not null auto_increment primary key
,c1 int
,c2 varchar(100)
)
engine=federated
default charset=utf8
connection = 'mysql://remoteuser:remotepass@127.0.0.1:3307/remoteschema/t1';
- 6/17 -
Federated Table 생성 – 방법2: Remote Server 정보 등록 후 사용
 Remote Server 정보 등록
 Local Federated Table 생성
CREATE SERVER remote_server
FOREIGN DATA WRAPPER 'mysql' OPTIONS
(HOST ‘127.0.0.1',
DATABASE 'remoteschema',
USER 'remoteuser',
PASSWORD 'remotepass',
PORT 3307
);
← host
← schema
← username
← password
← port
CREATE TABLE 접근할대상테이블이름
(
Remote Server에 있는 것과 동일한 컬럼 구성
)
ENGINE=FEDERATED
CONNECTION='remote_server/접근할대상테이블이름'
COMMENT='코멘트'
DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_bin;
- 7/17 -
Federated Engine의 특성
 SELECT, INSERT, UPDATE, DELETE, TRUNCATE 구문을 지원한다.
 INSERT ON DUPLICATE KEY UPDATE 는 지원되지 않는다.
: 쿼리문에서 에러가 발생하진 않으나, 중복데이터가 있으면 UPDATE가 되지 않고 KEY 중복 에러가 발생한다.
 ALTER TABLE 이나 DDL 문은 허용되지 않는다.
 Query Cache를 이용하지 않고, 쿼리가 실행될 때마다 매번 데이터를 다시 읽는다.
 사용자 정의 파티션을 지원하지 않는다.
 Federated table를 이용하면 remote에 있는 모든 데이터를 local로 가져온다.
 인덱스를 지원한다.
 local의 연결이 종료돼도 remote의 연결은 남아있으며, remote에 남아있는 연결은 remote server의 timeout
설정에 따라서 추후에 정리된다.
- 8/17 -
Federated Table 동작 원리
 테스트를 통한 Federated Table의 동작 원리를 이해하기 위해 테스트용 테이블을 생성한다.
Remote
Server
create table remoteschema.t1
(
id int unsigned not null auto_increment primary key
,c1 int
,c2 varchar(100)
)
engine=innodb
default charset=utf8;
Local
Server
create table localschema.federated_t1
(
id int unsigned not null auto_increment primary key
,c1 int
,c2 varchar(100)
)
engine=federated
default charset=utf8
connection = 'mysql://remoteuser:remotepass@127.0.0.1:3307/remoteschema/t1';
- 9/17 -
Federated Table 동작 원리
 INSERT ~ SELECT ~ 문의 처리
 입력될 모든 데이터를 가져와서 리터럴 변수를 이용한 INSERT문 처럼 만들어서 처리한다.
Local
Server
insert into localschema.federated_t1 (c1, c2)
select @rownum:=@rownum+1 as id
,a.table_name
from information_schema.tables a
,(select @rownum := 0) b
limit 5;
Remote
Server
151126 13:53:49 2 Connect remoteuser@localhost as anonymous on
remoteschema
2 Query SET AUTOCOMMIT=0
2 Query SAVEPOINT save1
2 Query INSERT INTO `t1` (`id`, `c1`, `c2`) VALUES
(0, 1 , 'ALL_PLUGINS')
2 Query INSERT INTO `t1` (`id`, `c1`, `c2`) VALUES
(0, 2 , 'APPLICABLE_ROLES') ,
(0, 3 , 'CHARACTER_SETS') ,
(0, 4 , 'CLIENT_STATISTICS') ,
(0, 5 , 'COLLATIONS')
2 Query COMMIT
- 10/17 -
Federated Table 동작 원리
 LAST_INSERT_ID()
federated를 이용해서 auto_increment가 포함된 테이블에 데이터를 입력하고 last_insert_id()를 확인해보면
federated를 통해서 입력된 테이블의 last_insert_id()가 나오지 않고 다른 값이 나온다.
즉, federated를 이용할 때는 last_insert_id()를 사용할 수 없다.
 SELECT문의 처리 : 인덱스가 있는 컬럼이 조건으로 사용되는 경우
Local
Server
select * from localschema.federated_t1 where id = 1;
Remote
Server
151126 14:31:06 2 Query SHOW TABLE STATUS LIKE 't1'
2 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE (`id` = 1)
Local
Server
select * from localschema.federated_t1 where id between 3 and 6;
Remote
Server
151126 14:32:05 2 Query SHOW TABLE STATUS LIKE 't1'
2 Query SELECT `id`, `c1`, `c2` FROM `t1`
WHERE ( (`id` >= 3) ) AND ( (`id` <= 6) )
- 11/17 -
Federated Table 동작 원리
 SELECT문의 처리: limit을 사용하는 경우 = remote에 있는 모든 데이터를 local로 읽어온 후에 1건을 반환한다.
 SELECT문의 처리: 인덱스가 없는 컬럼을 조건으로 사용하는 경우 = remote의 모든 데이터를 local로 가져온
후에 처리한다.
Local
Server
select c2 from localschema.federated_t1 limit 1;
Remote
Server
151126 14:33:11 2 Query SHOW TABLE STATUS LIKE 't1'
2 Query SELECT `id`, `c1`, `c2` FROM `t1`
Local
Server
select c2 from localschema.federated_t1 where c2 like 'ALL%';
Remote
Server
151126 14:34:16 2 Query SHOW TABLE STATUS LIKE 't1'
2 Query SELECT `id`, `c1`, `c2` FROM `t1`
- 12/17 -
Federated Table 동작 원리
 SELECT문의 처리: 인덱스가 없던 컬럼에 인덱스를 생성하는 경우
 remote에서 인덱스가 없던 컬럼에 인덱스를 생성한 후에 데이터를 조회해도 local에서는 여전히
인덱스가 없는 것으로 인식하여 remote의 모든 데이터를 local로 가져온 후에 처리한다.
Remote
Server
create index t1_idx on remoteschema.t1 (c2);
Local
Server
select c2 from localschema.federated_t1 where c2 like 'ALL%';
Remote
Server
151126 14:36:30 2 Query SHOW TABLE STATUS LIKE 't1'
2 Query SELECT `id`, `c1`, `c2` FROM `t1`
- 13/17 -
Federated Table 동작 원리
 SELECT문의 처리: 인덱스가 없던 컬럼에 인덱스를 생성하는 경우
 인덱스 정보를 추가해서 Federated table을 재생성하면 인덱스를 인식하여 remote에서 인덱스를
사용해서 필요한 데이터만 읽어서 local로 가져온다.
Remote
Server
drop table if exists localschema.federated_t1;
create table localschema.federated_t1
(
id int unsigned not null auto_increment primary key
,c1 int
,c2 varchar(100)
,INDEX t1_idx (c2)
)
engine=federated
default charset=utf8
connection = 'mysql://remoteuser:remotepass@127.0.0.1:3307/remoteschema/t1';
Local
Server
select c2 from localschema.federated_t1 where c2 like 'ALL%';
Remote
Server
151126 14:42:06 6 Query SHOW TABLE STATUS LIKE 't1'
6 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE
( (`c2` >= 'ALLguatda.com/cmx.p000...000') ) AND
( (`c2` <= 'ALL...') )
- 14/17 -
Federated Table 동작 원리
 DELETE문의 처리
 remote server에서 바로 delete문을 처리하는 것이 아니라 조건에 해당되는 데이터를 remote에서
local로 모두 읽어온 후에 다시 조건을 주고 remote에서 처리한다.
Local
Server
delete from localschema.federated_t1 where c2 like 'ALL%';
Remote
Server
151126 14:43:19 6 Query SET AUTOCOMMIT=0
6 Query SAVEPOINT save1
6 Query SHOW TABLE STATUS LIKE 't1'
6 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE
( (`c2` >= 'ALLguatda.com/cmx.p000...000') ) AND
( (`c2` <= 'ALL...') )
6 Query DELETE FROM `t1` WHERE `id` = 1
AND `c2` = 'ALL_PLUGINS' LIMIT 1
6 Query DELETE FROM `t1` WHERE `id` = 11
AND `c2` = 'ALL_PLUGINS' LIMIT 1
6 Query DELETE FROM `t1` WHERE `id` = 16
AND `c2` = 'ALL_PLUGINS' LIMIT 1
6 Query DELETE FROM `t1` WHERE `id` = 21
AND `c2` = 'ALL_PLUGINS' LIMIT 1
6 Query COMMIT
- 15/17 -
Federated Table 동작 원리
 UPDATE문의 처리
 remote server에서 바로 update문을 처리하는 것이 아니라 조건에 해당되는 데이터를 remote에서
local로 모두 읽어온 후에 다시 조건을 주고 remote에서 처리한다.
Local
Server
update localschema.federated_t1
set c2 = 'X'
where c2 like 'ENGINE%';
Remote
Server
151126 14:45:06 6 Query SAVEPOINT save1
6 Query SHOW TABLE STATUS LIKE 't1'
6 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE
( (`c2` >= 'ENGINEguatda.com/cmx.p000...000') ) AND
( (`c2` <= 'ENGINE...') )
6 Query UPDATE `t1` SET `c2` = 'X'
WHERE `id` = 10 AND `c2` = 'ENGINES'
6 Query COMMIT
- 16/17 -
Routine 안에서 Federated Table 사용될 때 remote에서의 처리
Local
Server
MainBlock: BEGIN
... 생략 ...
DECLARE out_cursor CURSOR FOR
select id from localschema.federated_t1;
... 생략 ...
OPEN out_cursor;
outLoopBlock: LOOP
FETCH out_cursor INTO v_out_value;
... 생략 ...
update localschema.federated_t1 set c1 = 9
where id = v_out_value;
END LOOP outLoopBlock;
END MainBlock
Remote
Server
2 Query SHOW TABLE STATUS LIKE 't1'
2 Query SELECT `id`, `c1`, `c2` FROM `t1`
2 Query SET AUTOCOMMIT=0
2 Query SAVEPOINT save1
2 Query SHOW TABLE STATUS LIKE 't1'
2 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE ( (`id` = 2) ) AND ( (1=1) )
2 Query UPDATE `t1` SET `c1` = 2 WHERE `id` = 2
2 Query COMMIT
2 Query SAVEPOINT save1
2 Query SHOW TABLE STATUS LIKE 't1'
2 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE ( (`id` = 3) ) AND ( (1=1) )
2 Query UPDATE `t1` SET `c1` = 3 WHERE `id` = 3
2 Query COMMIT
2 Query SAVEPOINT save1
2 Query SHOW TABLE STATUS LIKE 't1'
2 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE ( (`id` = 4) ) AND ( (1=1) )
- 17/17 -
Q&A
Q&A

More Related Content

PDF
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
PPTX
MySQL_MariaDB-성능개선-202201.pptx
PPTX
MySQL_MariaDB로의_전환_기술요소-202212.pptx
PPTX
Maxscale 소개 1.1.1
PDF
[2018] MySQL 이중화 진화기
DOCX
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
PDF
Maxscale_메뉴얼
PDF
HandsOn ProxySQL Tutorial - PLSC18
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
MySQL_MariaDB-성능개선-202201.pptx
MySQL_MariaDB로의_전환_기술요소-202212.pptx
Maxscale 소개 1.1.1
[2018] MySQL 이중화 진화기
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
Maxscale_메뉴얼
HandsOn ProxySQL Tutorial - PLSC18

What's hot (20)

PDF
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
PDF
Mvcc in postgreSQL 권건우
PDF
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
DOCX
MySQL_SQL_Tunning_v0.1.3.docx
PPTX
PostgreSQL Database Slides
PDF
MySQL Load Balancers - Maxscale, ProxySQL, HAProxy, MySQL Router & nginx - A ...
PDF
[오픈소스컨설팅] 프로메테우스 모니터링 살펴보고 구성하기
PDF
MariaDB MaxScale monitor 매뉴얼
PDF
MySQL Administrator 2021 - 네오클로바
PDF
Understanding PostgreSQL LW Locks
PDF
Introduction VAUUM, Freezing, XID wraparound
PDF
[pgday.Seoul 2022] PostgreSQL구조 - 윤성재
PDF
MySQL 상태 메시지 분석 및 활용
PDF
MariaDB 마이그레이션 - 네오클로바
PDF
MySQL GTID 시작하기
PDF
PostgreSQL and RAM usage
PDF
MySQL Database Architectures - InnoDB ReplicaSet & Cluster
PDF
[Pgday.Seoul 2020] SQL Tuning
PPTX
MariaDB Galera Cluster
PDF
MySQL/MariaDB Proxy Software Test
[Pgday.Seoul 2021] 1. 예제로 살펴보는 포스트그레스큐엘의 독특한 SQL
Mvcc in postgreSQL 권건우
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
MySQL_SQL_Tunning_v0.1.3.docx
PostgreSQL Database Slides
MySQL Load Balancers - Maxscale, ProxySQL, HAProxy, MySQL Router & nginx - A ...
[오픈소스컨설팅] 프로메테우스 모니터링 살펴보고 구성하기
MariaDB MaxScale monitor 매뉴얼
MySQL Administrator 2021 - 네오클로바
Understanding PostgreSQL LW Locks
Introduction VAUUM, Freezing, XID wraparound
[pgday.Seoul 2022] PostgreSQL구조 - 윤성재
MySQL 상태 메시지 분석 및 활용
MariaDB 마이그레이션 - 네오클로바
MySQL GTID 시작하기
PostgreSQL and RAM usage
MySQL Database Architectures - InnoDB ReplicaSet & Cluster
[Pgday.Seoul 2020] SQL Tuning
MariaDB Galera Cluster
MySQL/MariaDB Proxy Software Test
Ad

Similar to Federated Engine 실무적용사례 (20)

PDF
PostgreSQL로 배우는 SQL 기초
PPTX
효율적인 SQL 작성방법 1주차
PDF
[Pgday.Seoul 2018] PostgreSQL 11 새 기능 소개
PDF
Laravel 로 배우는 서버사이드 #4
PPTX
Unity cookbook 20
PDF
Linux blue borne-vulnerabilities
PDF
Ryu with OpenFlow 1.3, REST API
PDF
파이썬 데이터베이스 연결 1탄
PDF
닷넷프레임워크에서 Redis 사용하기
PDF
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
PDF
From MSSQL to MySQL
PDF
Network programming report
PDF
손쉬운 데이터 연결 방법(라이브바인딩 활용)
PPTX
NO PARALLEL DML
PDF
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
PPTX
게임 개발자를 위한 Vba 활용
PDF
Presto User & Admin Guide
PDF
Apache sqoop
PostgreSQL로 배우는 SQL 기초
효율적인 SQL 작성방법 1주차
[Pgday.Seoul 2018] PostgreSQL 11 새 기능 소개
Laravel 로 배우는 서버사이드 #4
Unity cookbook 20
Linux blue borne-vulnerabilities
Ryu with OpenFlow 1.3, REST API
파이썬 데이터베이스 연결 1탄
닷넷프레임워크에서 Redis 사용하기
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
From MSSQL to MySQL
Network programming report
손쉬운 데이터 연결 방법(라이브바인딩 활용)
NO PARALLEL DML
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
게임 개발자를 위한 Vba 활용
Presto User & Admin Guide
Apache sqoop
Ad

More from I Goo Lee (20)

PDF
MySQL_Fabric_운영시유의사항
PDF
MySQL Deep dive with FusionIO
PDF
From MSSQL to MariaDB
PDF
AWS Aurora 100% 활용하기
PDF
Backup automation in KAKAO
PDF
텔레그램을 이용한 양방향 모니터링 시스템 구축
PDF
MySQL 5.7 NF – Optimizer Improvement
PDF
MySQL 5.7 NF – JSON Datatype 활용
PDF
Intro KaKao MRTE (MySQL Realtime Traffic Emulator)
PDF
MS 빅데이터 서비스 및 게임사 PoC 사례 소개
PDF
AWS 환경에서 MySQL Infra 설계하기-2본론
PDF
AWS 환경에서 MySQL Infra 설계하기-1도입부분
PDF
AWS 환경에서 MySQL BMT
PDF
MySQL Slow Query log Monitoring using Beats & ELK
PDF
MySQL Audit using Percona audit plugin and ELK
PDF
PostgreSQL 이야기
PDF
Intro KaKao ADT (Almighty Data Transmitter)
PDF
Binlog Servers 구축사례
PDF
Intro ProxySQL
PDF
1.mysql disk io 모니터링 및 분석사례
MySQL_Fabric_운영시유의사항
MySQL Deep dive with FusionIO
From MSSQL to MariaDB
AWS Aurora 100% 활용하기
Backup automation in KAKAO
텔레그램을 이용한 양방향 모니터링 시스템 구축
MySQL 5.7 NF – Optimizer Improvement
MySQL 5.7 NF – JSON Datatype 활용
Intro KaKao MRTE (MySQL Realtime Traffic Emulator)
MS 빅데이터 서비스 및 게임사 PoC 사례 소개
AWS 환경에서 MySQL Infra 설계하기-2본론
AWS 환경에서 MySQL Infra 설계하기-1도입부분
AWS 환경에서 MySQL BMT
MySQL Slow Query log Monitoring using Beats & ELK
MySQL Audit using Percona audit plugin and ELK
PostgreSQL 이야기
Intro KaKao ADT (Almighty Data Transmitter)
Binlog Servers 구축사례
Intro ProxySQL
1.mysql disk io 모니터링 및 분석사례

Federated Engine 실무적용사례

  • 1. Federated Engine 적용사례와 동작원리 2015. 11. 이윤정
  • 2. - 1/17 - Federated Table 적용 사례 1 동기화대상테이블 (=원본테이블) 트리거 한국 원본테이블_DML DML 유형 DML 일시 순번 동기화 테이블과 동일한 구성 ToBe 지역코드 미국 유럽(네덜란드) federated_원본테이블_dml federated_원본테이블_dml 원본테이블_dml 원본테이블이름_dml 원본테이블 원본테이블 sp_sync_원본테이블이름 (동기화 stored procedure) sp_sync_원본테이블이름 (동기화 stored procedure) Federated Table은 미국DB 혹은 유럽DB에서 한국DB에 있는 테이블의 내용을 읽어오는 용도로만 사용함 미국/유럽 DB에서는 한국DB에서 데이터를 가져온 마지막 “순번”이후의 데이터만 한국DB에서 읽어오도록 조건을 줘서 인덱스를 이용해 데이터를 읽도록 했음 PK 한국 <-> 미국 : 2Mbps 한국 <-> 유럽: 1Mbps 해외에서 한국에 있는 DML이력을 가져와서 해외에 반영한 후 반영여부를 한국에 update 해주는 경우 분당 약 1000건 처리 해외에서 한국에 있는 DML이력을 읽어오기만 하고 해외에 반영됐는지 여부를 한국에 update는 하지 않는 경우 분당 약 30,000건 처리
  • 3. - 2/17 - Federated Table 적용 사례 2  Federated Table 과 Local Table 간의 조인 (Federated Table 이 Driving Table이면서 NOT IN & UNION ALL...) 쿼리에서 Federated Table 의 데이터를 전부 Local DB 로 가져온 후 한 건씩 Nested Loop Join 하면서 과도한 메모리를 사용하게 됨 평소 DB서버의 상태 Federated Table을 이용 쿼리가 실행될 때
  • 4. - 3/17 - Federated Engine 이해  Remote Server에 있는 MySQL/MariaDB에 있는 테이블에 접근할 수 있게 하는 스토리지 엔진 (Oracle의 DB Link와 유사함)  Local Server에서 Remote Server에 있는 테이블을 Local Server에 있는 테이블처럼 사용할 수 있게 해준다.  MySQL에서 Federated, MariaDB에서는 FederatedX(확장된 기능의 Federated) 로 부르고 있다.  실체가 없는 브릿지 역할을 한다.
  • 5. - 4/17 - Federated Engine 활성화  Local Server에서 Federated 엔진이 활성화 돼 있어야 한다.  MariaDB: 별다른 옵션 없이 사용할 수 있다.(기본적으로 활성화 돼 있음)  MySQL: 환경을 설정한 후에 DB를 restart 한다.  엔진 활성화 여부 확인 vi my.cnf [mysqld] … Federated … SHOW ENGINES;
  • 6. - 5/17 - Federated Table 생성 – 방법1: 테이블 생성문 안에 Remote Server 정보 포함  Remote Table  Local Table  Local Server에 만든 Federated Table은 Local에 있는 다른 일반 테이블처럼 사용이 가능하다.  SHOW CREATE TABLE 구문을 이용하면 테이블 생성에 사용된 username, password, host 등 모든 정보가 노출된다. ↑ username ↑ password ↑ host ↑ port ↑ schema ↑ tablename create table remoteschema.t1 ( id int unsigned not null auto_increment primary key ,c1 int ,c2 varchar(100) ) engine=innodb default charset=utf8; create table localschema.federated_t1 ( id int unsigned not null auto_increment primary key ,c1 int ,c2 varchar(100) ) engine=federated default charset=utf8 connection = 'mysql://remoteuser:remotepass@127.0.0.1:3307/remoteschema/t1';
  • 7. - 6/17 - Federated Table 생성 – 방법2: Remote Server 정보 등록 후 사용  Remote Server 정보 등록  Local Federated Table 생성 CREATE SERVER remote_server FOREIGN DATA WRAPPER 'mysql' OPTIONS (HOST ‘127.0.0.1', DATABASE 'remoteschema', USER 'remoteuser', PASSWORD 'remotepass', PORT 3307 ); ← host ← schema ← username ← password ← port CREATE TABLE 접근할대상테이블이름 ( Remote Server에 있는 것과 동일한 컬럼 구성 ) ENGINE=FEDERATED CONNECTION='remote_server/접근할대상테이블이름' COMMENT='코멘트' DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_bin;
  • 8. - 7/17 - Federated Engine의 특성  SELECT, INSERT, UPDATE, DELETE, TRUNCATE 구문을 지원한다.  INSERT ON DUPLICATE KEY UPDATE 는 지원되지 않는다. : 쿼리문에서 에러가 발생하진 않으나, 중복데이터가 있으면 UPDATE가 되지 않고 KEY 중복 에러가 발생한다.  ALTER TABLE 이나 DDL 문은 허용되지 않는다.  Query Cache를 이용하지 않고, 쿼리가 실행될 때마다 매번 데이터를 다시 읽는다.  사용자 정의 파티션을 지원하지 않는다.  Federated table를 이용하면 remote에 있는 모든 데이터를 local로 가져온다.  인덱스를 지원한다.  local의 연결이 종료돼도 remote의 연결은 남아있으며, remote에 남아있는 연결은 remote server의 timeout 설정에 따라서 추후에 정리된다.
  • 9. - 8/17 - Federated Table 동작 원리  테스트를 통한 Federated Table의 동작 원리를 이해하기 위해 테스트용 테이블을 생성한다. Remote Server create table remoteschema.t1 ( id int unsigned not null auto_increment primary key ,c1 int ,c2 varchar(100) ) engine=innodb default charset=utf8; Local Server create table localschema.federated_t1 ( id int unsigned not null auto_increment primary key ,c1 int ,c2 varchar(100) ) engine=federated default charset=utf8 connection = 'mysql://remoteuser:remotepass@127.0.0.1:3307/remoteschema/t1';
  • 10. - 9/17 - Federated Table 동작 원리  INSERT ~ SELECT ~ 문의 처리  입력될 모든 데이터를 가져와서 리터럴 변수를 이용한 INSERT문 처럼 만들어서 처리한다. Local Server insert into localschema.federated_t1 (c1, c2) select @rownum:=@rownum+1 as id ,a.table_name from information_schema.tables a ,(select @rownum := 0) b limit 5; Remote Server 151126 13:53:49 2 Connect remoteuser@localhost as anonymous on remoteschema 2 Query SET AUTOCOMMIT=0 2 Query SAVEPOINT save1 2 Query INSERT INTO `t1` (`id`, `c1`, `c2`) VALUES (0, 1 , 'ALL_PLUGINS') 2 Query INSERT INTO `t1` (`id`, `c1`, `c2`) VALUES (0, 2 , 'APPLICABLE_ROLES') , (0, 3 , 'CHARACTER_SETS') , (0, 4 , 'CLIENT_STATISTICS') , (0, 5 , 'COLLATIONS') 2 Query COMMIT
  • 11. - 10/17 - Federated Table 동작 원리  LAST_INSERT_ID() federated를 이용해서 auto_increment가 포함된 테이블에 데이터를 입력하고 last_insert_id()를 확인해보면 federated를 통해서 입력된 테이블의 last_insert_id()가 나오지 않고 다른 값이 나온다. 즉, federated를 이용할 때는 last_insert_id()를 사용할 수 없다.  SELECT문의 처리 : 인덱스가 있는 컬럼이 조건으로 사용되는 경우 Local Server select * from localschema.federated_t1 where id = 1; Remote Server 151126 14:31:06 2 Query SHOW TABLE STATUS LIKE 't1' 2 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE (`id` = 1) Local Server select * from localschema.federated_t1 where id between 3 and 6; Remote Server 151126 14:32:05 2 Query SHOW TABLE STATUS LIKE 't1' 2 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE ( (`id` >= 3) ) AND ( (`id` <= 6) )
  • 12. - 11/17 - Federated Table 동작 원리  SELECT문의 처리: limit을 사용하는 경우 = remote에 있는 모든 데이터를 local로 읽어온 후에 1건을 반환한다.  SELECT문의 처리: 인덱스가 없는 컬럼을 조건으로 사용하는 경우 = remote의 모든 데이터를 local로 가져온 후에 처리한다. Local Server select c2 from localschema.federated_t1 limit 1; Remote Server 151126 14:33:11 2 Query SHOW TABLE STATUS LIKE 't1' 2 Query SELECT `id`, `c1`, `c2` FROM `t1` Local Server select c2 from localschema.federated_t1 where c2 like 'ALL%'; Remote Server 151126 14:34:16 2 Query SHOW TABLE STATUS LIKE 't1' 2 Query SELECT `id`, `c1`, `c2` FROM `t1`
  • 13. - 12/17 - Federated Table 동작 원리  SELECT문의 처리: 인덱스가 없던 컬럼에 인덱스를 생성하는 경우  remote에서 인덱스가 없던 컬럼에 인덱스를 생성한 후에 데이터를 조회해도 local에서는 여전히 인덱스가 없는 것으로 인식하여 remote의 모든 데이터를 local로 가져온 후에 처리한다. Remote Server create index t1_idx on remoteschema.t1 (c2); Local Server select c2 from localschema.federated_t1 where c2 like 'ALL%'; Remote Server 151126 14:36:30 2 Query SHOW TABLE STATUS LIKE 't1' 2 Query SELECT `id`, `c1`, `c2` FROM `t1`
  • 14. - 13/17 - Federated Table 동작 원리  SELECT문의 처리: 인덱스가 없던 컬럼에 인덱스를 생성하는 경우  인덱스 정보를 추가해서 Federated table을 재생성하면 인덱스를 인식하여 remote에서 인덱스를 사용해서 필요한 데이터만 읽어서 local로 가져온다. Remote Server drop table if exists localschema.federated_t1; create table localschema.federated_t1 ( id int unsigned not null auto_increment primary key ,c1 int ,c2 varchar(100) ,INDEX t1_idx (c2) ) engine=federated default charset=utf8 connection = 'mysql://remoteuser:remotepass@127.0.0.1:3307/remoteschema/t1'; Local Server select c2 from localschema.federated_t1 where c2 like 'ALL%'; Remote Server 151126 14:42:06 6 Query SHOW TABLE STATUS LIKE 't1' 6 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE ( (`c2` >= 'ALLguatda.com/cmx.p000...000') ) AND ( (`c2` <= 'ALL...') )
  • 15. - 14/17 - Federated Table 동작 원리  DELETE문의 처리  remote server에서 바로 delete문을 처리하는 것이 아니라 조건에 해당되는 데이터를 remote에서 local로 모두 읽어온 후에 다시 조건을 주고 remote에서 처리한다. Local Server delete from localschema.federated_t1 where c2 like 'ALL%'; Remote Server 151126 14:43:19 6 Query SET AUTOCOMMIT=0 6 Query SAVEPOINT save1 6 Query SHOW TABLE STATUS LIKE 't1' 6 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE ( (`c2` >= 'ALLguatda.com/cmx.p000...000') ) AND ( (`c2` <= 'ALL...') ) 6 Query DELETE FROM `t1` WHERE `id` = 1 AND `c2` = 'ALL_PLUGINS' LIMIT 1 6 Query DELETE FROM `t1` WHERE `id` = 11 AND `c2` = 'ALL_PLUGINS' LIMIT 1 6 Query DELETE FROM `t1` WHERE `id` = 16 AND `c2` = 'ALL_PLUGINS' LIMIT 1 6 Query DELETE FROM `t1` WHERE `id` = 21 AND `c2` = 'ALL_PLUGINS' LIMIT 1 6 Query COMMIT
  • 16. - 15/17 - Federated Table 동작 원리  UPDATE문의 처리  remote server에서 바로 update문을 처리하는 것이 아니라 조건에 해당되는 데이터를 remote에서 local로 모두 읽어온 후에 다시 조건을 주고 remote에서 처리한다. Local Server update localschema.federated_t1 set c2 = 'X' where c2 like 'ENGINE%'; Remote Server 151126 14:45:06 6 Query SAVEPOINT save1 6 Query SHOW TABLE STATUS LIKE 't1' 6 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE ( (`c2` >= 'ENGINEguatda.com/cmx.p000...000') ) AND ( (`c2` <= 'ENGINE...') ) 6 Query UPDATE `t1` SET `c2` = 'X' WHERE `id` = 10 AND `c2` = 'ENGINES' 6 Query COMMIT
  • 17. - 16/17 - Routine 안에서 Federated Table 사용될 때 remote에서의 처리 Local Server MainBlock: BEGIN ... 생략 ... DECLARE out_cursor CURSOR FOR select id from localschema.federated_t1; ... 생략 ... OPEN out_cursor; outLoopBlock: LOOP FETCH out_cursor INTO v_out_value; ... 생략 ... update localschema.federated_t1 set c1 = 9 where id = v_out_value; END LOOP outLoopBlock; END MainBlock Remote Server 2 Query SHOW TABLE STATUS LIKE 't1' 2 Query SELECT `id`, `c1`, `c2` FROM `t1` 2 Query SET AUTOCOMMIT=0 2 Query SAVEPOINT save1 2 Query SHOW TABLE STATUS LIKE 't1' 2 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE ( (`id` = 2) ) AND ( (1=1) ) 2 Query UPDATE `t1` SET `c1` = 2 WHERE `id` = 2 2 Query COMMIT 2 Query SAVEPOINT save1 2 Query SHOW TABLE STATUS LIKE 't1' 2 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE ( (`id` = 3) ) AND ( (1=1) ) 2 Query UPDATE `t1` SET `c1` = 3 WHERE `id` = 3 2 Query COMMIT 2 Query SAVEPOINT save1 2 Query SHOW TABLE STATUS LIKE 't1' 2 Query SELECT `id`, `c1`, `c2` FROM `t1` WHERE ( (`id` = 4) ) AND ( (1=1) )