이전 federated 엔진 관련 글
https://sarc.io/index.php/mariadb/1167-mariadb-federated
https://sarc.io/index.php/mariadb/1180-mariadb-federated-issue
-1. 테스트 위한 환경 구성
=> source db에서 분산할 테이블을 1번서버 , 2번서버에 생성 혹은 import 한 뒤
source db에서 분산할 key 값으로 federated 엔진 테이블 생성
--1번서버
CREATE TABLE test.ferderate_test_1 ( num1 int NOT NULL, num2 int NOT NULL, num3 int NOT NULL, PRIMARY KEY (num1) ) ENGINE=innodb; insert into test.ferderate_test_1 values (0,1,2); insert into test.ferderate_test_1 values (1,1,2); insert into test.ferderate_test_1 values (2,1,2); insert into test.ferderate_test_1 values (10,1,2); insert into test.ferderate_test_1 values (11,1,2); insert into test.ferderate_test_1 values (12,1,2);
--2번 서버
CREATE TABLE test.ferderate_test_2 ( num1 int NOT NULL, num2 int NOT NULL, num3 int NOT NULL, PRIMARY KEY (num1) ) ENGINE=innodb; insert into test.ferderate_test_2 values (0,2,2); insert into test.ferderate_test_2 values (1,2,2); insert into test.ferderate_test_2 values (2,2,2); insert into test.ferderate_test_2 values (10,2,2); insert into test.ferderate_test_2 values (11,2,2); insert into test.ferderate_test_2 values (12,2,2);
--source서버
MariaDB [(none)]> install soname 'ha_federatedx.so'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> show engines; +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ | MRG_MyISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | Aria | YES | Crash-safe tables with MyISAM heritage | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, foreign keys and encryption for tables | YES | YES | YES | | SEQUENCE | YES | Generated tables filled with sequential values | YES | NO | YES | | FEDERATED | YES | FederatedX pluggable storage engine | YES | NO | YES | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ 9 rows in set (0.00 sec)
=> FEDERATEDX 엔진 설치
CREATE TABLE test.ferderate_test ( num1 int NOT NULL, num2 int NOT NULL, num3 int NOT NULL, PRIMARY KEY (num1) ) ENGINE=FEDERATED PARTITION BY range (num1) (PARTITION p0 VALUES less than (10) ENGINE = FEDERATED connection='mysql://root:test@1번서버:3306/test/ferderate_test_1', PARTITION p1 VALUES less than (20) ENGINE = FEDERATED connection='mysql://root:test@2번서버:3306/test/ferderate_test_2' );
=> num1 컬럼 10이하 값들은 파티션 p0 으로 1번 서버에 분산 ,
10 이상 20의 값들은 파티션 p1로 2번서버에 분산되도록 federated 테이블 생성
-2. 분산 테스트 - select
(source 서버)
MariaDB [(none)]> select * from test.ferderate_test partition (p0); +------+------+------+ | num1 | num2 | num3 | +------+------+------+ | 0 | 1 | 0 | | 1 | 1 | 2 | | 2 | 1 | 2 | | 10 | 1 | 2 | | 11 | 1 | 2 | | 12 | 1 | 2 | +------+------+------+ 6 rows in set (0.01 sec)
=> p0 파티션 즉, 1번서버에서 num1 컬럼 10 미만 값들이 조회 될 것이라 기대했으나 1번서버의 해당 테이블 모든 값들이 조회됨.
아래 내용 처럼 완벽히 지원되지 않는듯함
=> FEDERATED storage engine. Partitioning of FEDERATED tables is not supported; it is not possible to create partitioned FEDERATED tables.
https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations-storage-engines.html
-2.1 분산 테스트 - insert
MariaDB [(none)]> insert into test.ferderate_test values (15,1,2); Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> select * from test.ferderate_test partition (p1); +------+------+------+ | num1 | num2 | num3 | +------+------+------+ | 0 | 2 | 2 | | 1 | 2 | 2 | | 2 | 2 | 2 | | 10 | 2 | 2 | | 11 | 2 | 2 | | 12 | 2 | 2 | | 15 | 1 | 2 | +------+------+------+ 7 rows in set (0.00 sec)
MariaDB [(none)]> insert into test.ferderate_test values (3,2,2); Query OK, 1 row affected (0.01 sec) MariaDB [(none)]> commit; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> select * from test.ferderate_test partition (p1); +------+------+------+ | num1 | num2 | num3 | +------+------+------+ | 0 | 2 | 2 | | 1 | 2 | 2 | | 2 | 2 | 2 | | 10 | 2 | 2 | | 11 | 2 | 2 | | 12 | 2 | 2 | | 15 | 1 | 2 | +------+------+------+ 7 rows in set (0.00 sec) MariaDB [(none)]> select * from test.ferderate_test partition (p0); +------+------+------+ | num1 | num2 | num3 | +------+------+------+ | 0 | 1 | 0 | | 1 | 1 | 2 | | 2 | 1 | 2 | | 3 | 2 | 2 | | 10 | 1 | 2 | | 11 | 1 | 2 | | 12 | 1 | 2 | +------+------+------+ 7 rows in set (0.00 sec)
=> insert 는 파티셔닝 된 대로 잘 분산됨을 확인