Mysql /MariaDB에서 Spider 엔진을 사용한 샤딩을 소개하겠습니다.

1편에서는 구성방법 

2편에서는 sharding HA

3편에서는 성능 및 제한사항을 살펴보겠습니다.

 

 

-1. Test 환경

 

  1. Spider node (1ea)
    1) MariaDB 10.2.14  (33.333.333.33)
  2. Data node (2ea)  
    1) MariaDB 10.2.14     (11.111.111.11:3311)
    2) MariaDB 10.2.14     (22.222.222.22:3311)

     

 

-2. Data Node 구성

 

  1. DB user 생성

Create user ‘spider_test’@‘%’ identified by ‘test123’;

Grant all privileges on *.* to ‘spider_test’@‘%;

Flush privileges;

 

 

   2.   테이블 생성
=> sys bench 사용할 것이므로 sysbench 기본테이블과 같은 구성으로 생성
 

create table backend.sbtest

 (
id int(10) not null auto_increment,
k int(10) not null default ‘0’,
c char(120) not null default ‘’,
pad char(60) not null default ‘’,
primary key (id),
key k (k)

) engine=innodb  

 

 

-3.  스파이더 엔진 구성

 

스파이더 노드에서 mariadb 10버전 이상부터 제공되는 spider 엔진 설치 스크립트 수행

mysql -uroot -p < ./share/install_spider.sql

 

1.Server 정보 등록
1)

create server backend1

foreign data wrapper mysql
Options(
HOST ’11.111.111.11’,
Database ‘backend’,
User ‘spider_test’,
Password ‘test123’,

Port 3311);

 

create server backend2

foreign data wrapper mysql
    Options(
    Host ’22.222.222.22’,
    Database ‘backend’,
    User ‘spider_test’,
    Password ‘test123’,
   Port 3311
   );


2. 테이블 생성


create table backend.sbtest

 (
id int(10) not null auto_increment,
k int(10) not null default ‘0’,
c char(120) not null default ‘’,
pad char(60) not null default ‘’,
primary key (id),
key k (k)
) engine=spider comment=‘database “backend”,table “sbtest”’

Partition by key(id)

(

Partition pr1 comment=‘srv “backend1”’,

Partition pr2 comment=‘srv “backend2”’

);

=> 파티션 pr1=> backend1 서버로

파티션 pr2 => backend2 서버에 데이터 저장

 

 

3. 생성 확인

Select * from mysql.spider_Tables;

 

*************************** 1. row ***************************

               db_name: backend

            table_name: sbtest#P#pr1

               link_id: 0

              priority: 1000000

                server: backend1

                scheme: NULL

                  host: NULL

                  port: NULL

                socket: NULL

              username: NULL

              password: NULL

                ssl_ca: NULL

            ssl_capath: NULL

              ssl_cert: NULL

            ssl_cipher: NULL

               ssl_key: NULL

ssl_verify_server_cert: 0

          default_file: NULL

         default_group: NULL

           tgt_db_name: backend

        tgt_table_name: sbtest

           link_status: 1

*************************** 2. row ***************************

               db_name: backend

            table_name: sbtest#P#pr2

               link_id: 0

              priority: 1000000

                server: backend2

                scheme: NULL

                  host: NULL

                  port: NULL

                socket: NULL

              username: NULL

              password: NULL

                ssl_ca: NULL

            ssl_capath: NULL

              ssl_cert: NULL

            ssl_cipher: NULL

               ssl_key: NULL

ssl_verify_server_cert: 0

          default_file: NULL

         default_group: NULL

           tgt_db_name: backend

        tgt_table_name: sbtest

           link_status: 1

2 rows in set (0.00 sec)

 

 

-4. Data 확인

 

mysql> insert into backend.sbtest select * from sbtest.sbtest1;

Query OK, 100000 rows affected (4.33 sec)

Records: 100000  Duplicates: 0  Warnings: 0

 

 

-. spider node

 

mysql> select count(*) from backend.sbtest;

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

| count(*) |

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

|   100000 |

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

1 row in set (0.09 sec)

 

-.backend1

mysql> select count(*) from backend.sbtest;

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

| count(*) |

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

|    50449 |

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

1 row in set (0.01 sec)

 

 

-. backend2

mysql> select count(*) from backend.sbtest;

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

| count(*) |

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

|    49551 |

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

1 row in set (0.01 sec)