[MariaDB - Sharding] use. Spider Engine

안녕하세요 이번글에서는 mariadb에서 spider엔진을 이용하여 데이터노드에 데이터를 분산하여 입력하는 테스트를 해보겠습니다.

기존의 MySQL의 샤딩은 DB단에서 구현하지 않고, DB 앞단에서 구현을 합니다.

 
엔진 동작원리

 

 

 

 

Spider 엔진이란

Spider 스토리지 엔진은 샤딩 기능이 내장 된 스토리지 엔진입니다. 

파티셔닝 및 xa 트랜잭션을 지원하며 다른 MariaDB 인스턴스의 테이블을 마치 동일한 인스턴스에있는 것처럼 처리 할 수 있습니다.
Remote 테이블은 스파이더 엔진이 아닌 MariaDB가 지원하는 모든 스토리지 엔진을 사용할 수 있습니다. 
스파이더 엔진을 통한 마스터 노드와 스파이더 노드들의 연결은 Local MariaDB 노드에서 Remote MariaDB노드로 연결설정을 통하여 완성됩니다

MariaDB에서는 Spider 엔진을 탑재하면서, DB단에서 샤딩을 구현할 수 있게 되었습니다.

 

 

 

 

 

샤딩 (Sharding)

Horizontal Sharding (Range based Sharding): 일반적인 샤딩은  수평 파티셔닝 방식을 뜻합니다.  수평 파티셔닝(Horizontal Sharding) 또는 샤딩은 스키마 복제 후 샤드키를 기준으로 데이터를 나누는것을 말합니다.

데이터베이스를 샤딩하게 되면 기존에 하나로 구성될 스키마를 다수의 복제본으로 구성하고 각각의 샤드에 어떤 데이터가 저장될지를 샤드키를 기준으로 분리합니다.

Vertical partitioning: 수직 파티셔닝(Vertical partitioning)은 스키마를 나누고 데이터가 따라 옮겨가는것을 말합니다. 엔티티의 컬럼을 분할하는 방식입니다. 도메인에 따라 쉽게 분리 할수 있으며, 도메인의 영향을 많이 받기 때문에 어플리케이션 단에서 CRUD 구현을 합니다.

 

 

 

 

테스트 환경

Hostname
IP
version
spider
192.168.100.114
mariadb 10.2
node1
192.168.100.52
mariadb 10.2
node2
192.168.100.53
mariadb 10.2

 

 

 

 

 사전 구성

사전 maraidb 설치

 데이터 노드 구성(node1, node2)

DB 및 테이블 생성

MariaDB [(none)]> CREATE TABLE backend.sbtest1 (
    ->   id int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   k int(10) unsigned NOT NULL DEFAULT '0',
    ->   c char(120) NOT NULL DEFAULT '',
    ->   pad char(60) NOT NULL DEFAULT '',
    ->   PRIMARY KEY (id),
    ->   KEY k (k)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)

 

DB user 생성 및 권한 부여

MariaDB [(none)]> create user 'shard'@'%' identified by 'shard';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on *.* to shard@'%';
Query OK, 0 rows affected (0.00 sec)

 

 

 

 Spider node 구성

 

Spider 엔진 설치(spider node)

[root@jh-spider ~]# mysql -uroot -proot < /mysql/share/install_spider.sql


MariaDB [(none)]> select engine, support, transactions, xa from information_schema.engines;
+--------------------+---------+--------------+------+
| engine             | support | transactions | xa   |
+--------------------+---------+--------------+------+
| SPIDER             | YES     | YES          | YES  |
| CSV                | YES     | NO           | NO   |
| MRG_MyISAM         | YES     | NO           | NO   |
| MyISAM             | YES     | NO           | NO   |
| SEQUENCE           | YES     | YES          | NO   |
| PERFORMANCE_SCHEMA | YES     | NO           | NO   |
| MEMORY             | YES     | NO           | NO   |
| Aria               | YES     | NO           | NO   |
| InnoDB             | DEFAULT | YES          | YES  |
+--------------------+---------+--------------+------+
9 rows in set (0.00 sec)
 
 
 

 데이터 노드 정보 등록 (spider node)

MariaDB [(none)]> CREATE SERVER node1
    ->   FOREIGN DATA WRAPPER mysql
    -> OPTIONS(
    ->   HOST '192.168.100.52',
    ->   DATABASE 'backend',
    ->   USER 'shard',
    ->   PASSWORD 'shard',
    ->   PORT 3306
    -> );
Query OK, 0 rows affected (0.00 sec)


MariaDB [(none)]> CREATE SERVER node2
    ->   FOREIGN DATA WRAPPER mysql
    -> OPTIONS(
    ->   HOST '192.168.100.53',
    ->   DATABASE 'backend',
    ->   USER 'shard',
    ->   PASSWORD 'shard',
    ->   PORT 3306
    -> );
Query OK, 0 rows affected (0.00 sec)
 
 

 spider database 및 table 생성

MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS backend;
Query OK, 1 row affected (0.00 sec)


MariaDB [(none)]> CREATE  TABLE backend.sbtest1
    -> (
    ->   id int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   k int(10) unsigned 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='wrapper "mysql", table "sbtest1"'
    ->  PARTITION BY KEY (id)
    -> (
    ->  PARTITION pt1 COMMENT = 'srv "node1"',
    ->  PARTITION pt2 COMMENT = 'srv "node2"'
    -> ) ;
Query OK, 0 rows affected (0.00 sec)
 
 
 

 계정 생성 및 권한 부여

MariaDB [(none)]> create user 'shard'@'%' identified by 'shard';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on *.* to shard@'%';
Query OK, 0 rows affected (0.00 sec)
 
 

 

Data insert 테스트

 Sysbench 설치

[root@jh-spider ~]# curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
Detected operating system as centos/7.
Checking for curl...
Detected curl...
Downloading repository file: https://packagecloud.io/install/repositories/akopytov/sysbench/config_file.repo?os=centos&dist=7&source=script
done.
Installing pygpgme to verify GPG signatures...
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
* base: mirror.navercorp.com
* extras: mirror.navercorp.com
* updates: ftp.jaist.ac.jp
akopytov_sysbench-source/signature                                    |  833 B  00:00:00     
Retrieving key from https://packagecloud.io/akopytov/sysbench/gpgkey
Importing GPG key 0x04DCFD39:
Userid     : "https://packagecloud.io/akopytov/sysbench-prerelease (https://packagecloud.io/docs#gpg_signing) <support@packagecloud.io>"
Fingerprint: 9789 8d69 f99e e5ca c462 a0f8 cf10 4890 04dc fd39
From       : https://packagecloud.io/akopytov/sysbench/gpgkey
akopytov_sysbench-source/signature                                    | 1.0 kB  00:00:00 !!!
base                                                                  | 3.6 kB  00:00:00     
extras                                                                | 2.9 kB  00:00:00     
updates                                                               | 2.9 kB  00:00:00     
(1/4): base/7/x86_64/group_gz                                         | 153 kB  00:00:00     
(2/4): extras/7/x86_64/primary_db                                     | 246 kB  00:00:00     
(3/4): base/7/x86_64/primary_db                                       | 6.1 MB  00:00:00     
(4/4): updates/7/x86_64/primary_db                                    |  14 MB  00:00:01     
akopytov_sysbench-source/primary                                      | 2.0 kB  00:00:01     
akopytov_sysbench-source                                                               15/15
Package pygpgme-0.3-9.el7.x86_64 already installed and latest version
Nothing to do
Installing yum-utils...
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirror.navercorp.com
* extras: mirror.navercorp.com
* updates: ftp.jaist.ac.jp
Package yum-utils-1.1.31-54.el7_8.noarch already installed and latest version
Nothing to do
Generating yum cache for akopytov_sysbench...
Importing GPG key 0x04DCFD39:
Userid     : "https://packagecloud.io/akopytov/sysbench-prerelease (https://packagecloud.io/docs#gpg_signing) <support@packagecloud.io>"
Fingerprint: 9789 8d69 f99e e5ca c462 a0f8 cf10 4890 04dc fd39
From       : https://packagecloud.io/akopytov/sysbench/gpgkey
Generating yum cache for akopytov_sysbench-source...

The repository is setup! You can now install packages.





[root@jh-spider ~]# yum -y install sysbench
...(중략)
=============================================================================================
Package                Arch          Version                 Repository                Size
=============================================================================================
Installing:
sysbench               x86_64        1.0.20-1.el7            akopytov_sysbench        430 k
Installing for dependencies:
postgresql-libs        x86_64        9.2.24-7.el7_9          updates                  235 k

Transaction Summary
=============================================================================================
Install  1 Package (+1 Dependent package)

Total download size: 665 k
Installed size: 1.8 M
Downloading packages:
(1/2): postgresql-libs-9.2.24-7.el7_9.x86_64.rpm                      | 235 kB  00:00:00     
(2/2): sysbench-1.0.20-1.el7.x86_64.rpm                               | 430 kB  00:00:00     
---------------------------------------------------------------------------------------------
Total                                                        663 kB/s | 665 kB  00:00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : postgresql-libs-9.2.24-7.el7_9.x86_64                                     1/2
  Installing : sysbench-1.0.20-1.el7.x86_64                                              2/2
  Verifying  : postgresql-libs-9.2.24-7.el7_9.x86_64                                     1/2
  Verifying  : sysbench-1.0.20-1.el7.x86_64                                              2/2

Installed:
  sysbench.x86_64 0:1.0.20-1.el7                                                             

Dependency Installed:
  postgresql-libs.x86_64 0:9.2.24-7.el7_9                                                    

Complete!

 

 

 Data insert (use sysbench)

만건 데이터 입력

[root@jh-spider ~]# sysbench /usr/share/sysbench/oltp_read_only.lua --db-driver=mysql --threads=16 --mysql-socket=/tmp/mysql.sock --mysql-db=test  --mysql-user=shard --mysql-password=shard --mysql-port=3306 --table-size=10000 prepare
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Initializing worker threads...

Creating table 'sbtest1'...
Inserting 10000 records into 'sbtest1'
Creating a secondary index on 'sbtest1'...

 

 

 Data 조회

MariaDB [(none)]> select count(*) from test.sbtest1;
+----------+
| count(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.00 sec)
 
 

 만건의 데이터를 backend DB로 복사 

MariaDB [(none)]> insert into backend.sbtest1 select * from test.sbtest1;
ERROR 1429 (HY000): Unable to connect to foreign data source: node1

※ 위의 에러 발생시 아래의 명령 실행
MariaDB [(none)]> use backend
MariaDB [backend]> flush tables;
Query OK, 0 rows affected (0.016 sec)


MariaDB [backend]> insert into backend.sbtest1 select * from test.sbtest1;
Query OK, 10000 rows affected (0.255 sec)
Records: 10000  Duplicates: 0  Warnings: 0
 
 
 

입력 후 data count 조회

<Spider node>
MariaDB [backend]> select count(*) from backend.sbtest1;
+----------+
| count(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.010 sec)
 
<Node1>
MariaDB [(none)]> select count(*) from backend.sbtest1;
+----------+
| count(*) |
+----------+
|     2960 |
+----------+
1 row in set (0.001 sec)
 
<Node2>
MariaDB [(none)]> select count(*) from backend.sbtest1;
+----------+
| count(*) |
+----------+
|     7040 |
+----------+
1 row in set (0.002 sec)
 
 
 
메인 DB인 spider node에는 만건이 모두 들어가고 각각의 데이터 노드에는 데이터가 각각 나뉘어 입력됩니다.

 

참고

https://rastalion.me/spider-%ec%97%94%ec%a7%84%ec%9d%84-%ec%9d%b4%ec%9a%a9%ed%95%9c-%ec%83%a4%eb%94%a9-%ed%99%98%ea%b2%bd-%ea%b5%ac%ec%b6%95-01/

 

SPIDER 엔진을 이용한 샤딩 환경 구축 #01 - RastaLion's IT Blog

  Spider 엔진? Spider 스토리지 엔진은 샤딩 기능이 내장 된 스토리지 엔진입니다. 파티셔닝 및 xa 트랜잭션을 지원하며 다른 MariaDB 인스턴스의 테이블을 마치 동일한 인스턴스에있는 것처럼 처리

rastalion.me