[MySQL] Federated Sotrage Engine - 이론편

■ Federated Storage Engine

FEDERATED 스토리지 엔진을 사용하면 복제 또는 클러스터 기술을 사용하지 않고도 원격 MySQL 데이터베이스의 데이터에 액세스 있습니다. 로컬 FEDERATED 테이블을 쿼리하면 원격 테이블에서 데이터를 자동으로 가져옵니다. 로컬 테이블에는 데이터가 저장되지 않습니다.

 

소스에서 MySQL 빌드하는 경우 FEDERATED 스토리지 엔진을 포함하려면 -DWITH_FEDERATED_STORAGE_ENGINE 옵션을 사용하여 CMake 호출합니다.

 

FEDERATED 스토리지 엔진은 실행중인 서버에서 기본적으로 활성화되지 않습니다. FEDERATED 활성화하려면 --federated 옵션을 사용하여 MySQL 서버 바이너리를 시작해야합니다.

 

FEDERATED 엔진의 소스를 조사하려면 MySQL 소스 배포의 storage / federated 디렉토리를 확인합니다.

 

■ FEDERATED Storage Engine 살펴보기

표준 스토리지 엔진 ( : MyISAM, CSV 또는 InnoDB) 하나를 사용하여 테이블을 생성할 테이블은 테이블 정의 관련 데이터로 구성됩니다. FEDERATED 테이블을 생성할 테이블 정의는 동일하지만 데이터의 물리적 스토리지는 원격 서버에서 처리됩니다.

 

FEDERATED 테이블은 가지 요소로 구성됩니다.

· 테이블 정의 (.frm 파일에 저장 ) 관련된 테이블로 구성된 데이터베이스에 테이블이 있는 원격 서버.

원격 테이블의 테이블 유형은 MyISAM 또는 InnoDB 포함하여 원격 mysqld 서버에서 지원하는 모든 유형이 있습니다.

· 테이블 정의가 원격 서버에 있는 해당 테이블의 정의와 일치하는 데이터베이스 테이블이 있는 로컬 서버.

테이블 정의는 .frm 파일에 저장됩니다. 그러나 로컬 서버에는 데이터 파일이 없습니다. 대신 테이블 정의에는 원격 테이블을 가리키는 연결 문자열이 포함됩니다.

 

로컬 서버의 FEDERATED 테이블에서 쿼리 문을 실행할 일반적으로 로컬에서 데이터 파일에 정보를 삽입, 업데이트 또는 삭제하는 작업이 원격 서버로 전송되어 원격 서버의 데이터 파일을 업데이트합니다. 그리고 로컬에서의 데이터 조회는 원격 서버에서 일치하는 행을 반환합니다.

 

FEDERATED 테이블 설정의 기본 구조는 아래 그림 15.2.“FEDERATED 테이블 구조 나와 있습니다.

 

그림 1 : FEDERATED Table Structure

 

클라이언트가 FEDERATED 테이블을 참조하는 SQL 문을 실행할 로컬 서버 (SQL 문이 실행되는 위치) 원격 서버 (데이터가 물리적으로 저장되는 위치) 간의 정보 흐름은 다음과 같습니다.

1. 스토리지 엔진은 FEDERATED 테이블에 있는 열을 살펴보고 원격 테이블을 참조하는 적절한 SQL 문을 구성합니다.

2. MySQL 클라이언트 API 사용하여 명령문이 원격 서버로 전송됩니다.

3. 원격 서버는 명령문을 처리하고 로컬 서버는 명령문이 생성하는 모든 결과 (영향을받는 또는 결과 집합) 검색합니다.

4. 명령문이 결과 세트를 생성하는 경우 컬럼은 FEDERATED 엔진이 예상하고 원래 명령문을 발행 클라이언트에 결과를 표시하는데 사용할 있는 내부 스토리지 엔진 형식으로 변환됩니다.

 

로컬 서버는 MySQL 클라이언트 C API 기능을 사용하여 원격 서버와 통신합니다. mysql_real_query() 호출하여 명령문을 보냅니다. 결과 집합을 읽기 위해 mysql_store_result() 사용하고 mysql_fetch_row() 사용하여 번에 하나씩 행을 가져옵니다.

 

■ FEDERATED Storage Engine 참고사항과

FEDERATED 스토리지 엔진을 사용할때 다음 사항에 유의해야 합니다.

· FEDERATED 테이블은 다른 복제본으로 복제될 있지만 복제본 서버가 CONNECTION 문자열 (또는 mysql.servers 테이블의 ) 정의된 사용자 / 암호 조합을 사용하여 원격지에 연결할 있는지 확인해야합니다.

 

다음 항목은 FEDERATED 스토리지 엔진이 지원하는 기능과 지원하지 않는 기능을 나타냅니다.

· 원격 서버는 MySQL 서버여야 합니다.

· FEDERATED 테이블을 통해 테이블에 액세스하기 전에 FEDERATED 테이블이 가리키는 원격 테이블이 있어야 합니다.

· 하나의 FEDERATED 테이블이 다른 테이블을 가리킬 있지만 루프를 만들지 않도록 주의해야 합니다.

· FEDERATED 테이블은 일반적인 의미에서 인덱스를 지원하지 않습니다. 테이블 데이터에 대한 액세스는 원격으로 처리되기 때문에 실제로 인덱스를 사용하는 원격 테이블입니다. , 인덱스를 사용할 없어 전체 테이블 스캔이 필요한 쿼리의 경우 서버가 원격 테이블에서 모든 행을 가져 와서 로컬로 필터링 합니다. SELECT 문에 사용 WHERE 또는 LIMIT 관계없이 발생합니다. 이러한 명령문은 반환된 행에 로컬로 적용됩니다.

  따라서 인덱스를 사용하지 못하는 쿼리는 성능 저하와 네트워크 과부하를 유발할 있습니다. 또한 반환 행은 메모리에 저장되어야하므로 이러한 쿼리로 인해 로컬 서버가 스와핑되거나 중단 수도 있습니다.

· 동일한 MyISAM 또는 다른 테이블의 인덱스 정의가 지원되지 않을 있으므로 FEDERATED 테이블을 만들 때주의해야 합니다. 예를 들어, VARCHAR, TEXT 또는 BLOB 열에 인덱스 접두사가 있는 FEDERATED 테이블을 만들면 실패합니다. MyISAM 다음 정의가 유효합니다.

CREATE TABLE `T1`(`A` VARCHAR(100),UNIQUE KEY(`A`(30))) ENGINE=MYISAM;

 

예의 접두사는 FEDERATED 엔진과 호환되지 않으며 같은 명령문이 실패합니다.

CREATE TABLE `T1`(`A` VARCHAR(100),UNIQUE KEY(`A`(30))) ENGINE=FEDERATED

  CONNECTION='MYSQL://127.0.0.1:3306/TEST/T1';

가능하면 이러한 인덱스 문제를 방지하기 위해 원격 서버와 로컬 서버에서 테이블을 만들때 컬럼과 인덱스 정의를 분리해야 합니다.

· 내부적으로 구현은 SELECT, INSERT, UPDATE DELETE 사용하지만 HANDLER 사용하지 않습니다.

· FEDERATED 저장소 엔진은 SELECT, INSERT, UPDATE, DELETE, TRUNCATE TABLE 인덱스를 지원합니다. ALTER TABLE 또는 DROP TABLE 이외의 테이블 구조에 직접 영향을 미치는 데이터 정의 언어 문을 지원하지 않습니다. 현재 구현에서는 준비된 문을 사용하지 않습니다.

· FEDERATED INSERT ... ON DUPLICATE KEY UPDATE 문을 허용하지만 중복 위반이 발생하면 문이 오류와 함께 실패합니다.

· 트랜잭션이 지원되지 않습니다.

· FEDERATED 일괄 삽입 처리를 수행하여 여러 행을 일괄 적으로 원격 테이블로 보내 성능을 향상시킵니다. 또한 원격 테이블이 트랜잭션 경우 원격 저장소 엔진이 오류가 발생할 경우 롤백을 올바르게 수행 있습니다. 기능에는 다음과 같은 제한 사항이 있습니다.

  + 삽입 크기는 서버 최대 패킷 크기를 초과 없습니다. 삽입이이 크기를 초과하면 여러 패킷으로 분할되어 롤백 문제가 발생할 있습니다.

  + INSERT ... ON DUPLICATE KEY UPDATE 대해 대량 삽입 처리가 발생하지 않습니다.

· FEDERATED 엔진이 원격 테이블이 변경되었는지 수있는 방법이 없습니다. 이유는이 테이블이 데이터베이스 시스템 이외의 다른 것에 의해 기록되지 않는 데이터 파일처럼 작동해야하기 때문입니다. 원격 데이터베이스가 변경되면 로컬 테이블에있는 데이터의 무결성이 침해 있습니다.

· CONNECTION 문자열을 사용할 암호에 '@'문자를 사용할 없습니다. CREATE SERVER 문을 사용하여 서버 연결을 만들면이 제한을 해결할 있습니다.

· insert_id timestamp 옵션은 데이터 공급자에게 전파되지 않습니다.

· FEDERATED 테이블에 대해 발행 DROP TABLE 문은 원격 테이블이 아닌 로컬 테이블 삭제합니다.

· FEDERATED 테이블은 쿼리 캐시에서 작동하지 않습니다.

· 사용자 정의 분할은 FEDERATED 테이블에 대해 지원되지 않습니다.

· 네트워크를 통해서 데이터가 전송되므로 네트워크 안정성이 확보되어야 합니다. 또한 대량의 데이터 전송시 속도에 영향을 받을 수 있습니다.

 

■ FEDERATED 스토리지 엔진 리소스

FEDERATED 스토리지 엔진에 대해 다음 추가 리소스를 사용할 있습니다.

· FEDERATED 스토리지 엔진 전용 포럼은 https://forums.mysql.com/list.php?105에서 사용할 있습니다.

Designed by JB FACTORY