Help us understand the problem. What is going on with this article?

MariaDB 10.3 で Spider Storage Engine を試す

More than 1 year has passed since last update.

2018年5月にGAになった MariaDB Server 10.3.7 以降 Spider ストレージエンジンが GA になりました。

https://mariadb.com/kb/en/library/mariadb-1037-release-notes/
https://mariadb.com/kb/en/library/spider-storage-engine-overview/
https://mariadb.com/kb/en/library/spider-installation/

Spider の概要

Spider では非常にデータ数の多いテーブルなどをパーティション分割し、複数のノード(Data Node)にシャーディングすることにより、書き込み(write)でもスケールアウトすることができます。Tencent Games などで大規模に利用されているらしいです。

テスト環境

  • OS: CentOS 7.5.1804
  • MariaDB 10.3.9 GA
  • Spider Node x 1 (ホスト名: spider)
  • Data Node x 2 (ホスト名: data1/data2)

Data Node の設定

データノードは、Spiderでないストレージエンジンと同様にテーブルを作成し、Spider nodeからアクセスさせるためのユーザを作成します。

InnoDBテーブル作成(対象ホスト: data1/data2)

明示的に InnoDB テーブルを作成します。

CREATE TABLE test.spider (
   id INT PRIMARY KEY AUTO_INCREMENT,
   name VARCHAR(50)
) ENGINE=InnoDB;

spider ユーザ作成

Spider node からパーティショニングしてさきほど作成した InnoDB テーブルにデータを格納したり、参照するためのユーザを各データノードで作成します。

GRANT ALL on *.* to spider@'%' identified by 'password';
FLUSH PRIVILEGES;

Spider Node の設定(対象ホスト: spider)

Spider ストレージエンジンを用いるのは、data node に対する proxy のように動作する Spider node のみです。

Spider Engineのインストール

インストール用のSQLがありますので、MariaDB monitor(mysql)でSOURCEします。

SOURCE /usr/share/mysql/install_spider.sql

CREATE SERVER

各 data node のIPアドレスが以下のように割り当てられているとします。

data1: 192.168.2.11
data2: 192.168.2.12

CREATE SERVER 文で Spider から data1, data2 という名前で参照可能とします。

CREATE SERVER data1 FOREIGN DATA WRAPPER mysql
 OPTIONS (
  HOST '192.168.2.11',
  DATABASE 'test',
  USER 'spider', 
  PASSWORD 'password',
  PORT 3306);

CREATE SERVER data2 FOREIGN DATA WRAPPER mysql
 OPTIONS (
  HOST '192.168.2.12',
  DATABASE 'test',
  USER 'spider', PASSWORD 'password',
  PORT 3306);

FLUSH TABLES;

Spider table作成

Spide node上で Spider tableを作成し、data node上のInnoDBテーブルにパーティショニングするように設定します。

CREATE TABLE test.spider (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50)
) ENGINE=Spider COMMENT='wrapper "mysql", table "spider"'
 PARTITION BY HASH (id)
(
  PARTITION p1 COMMENT = 'srv "data1"',
  PARTITION p2 COMMENT = 'srv "data2"'
);

この例では id カラムの値に応じて各 data node に割り振っています。

確認は

SELECT * FROM information_schema.partitions WHERE table_name ='spider' \G

でできます。

テストデータのINSERT

Spider node の spider table に対して、以下のSQLを1秒間に2回以上実行しないよう、適度に間隔をおいて数回実行します。

insert into spider (name) values (now());

テストデータ確認

期待通りに data1/data2 にパーティショニングされ、Spider nodeでクエリをかけると全データを参照することができました。

data1

MariaDB [test]> select * from spider;
+----+---------------------+
| id | name                |
+----+---------------------+
|  2 | 2018-09-10 11:54:16 |
|  4 | 2018-09-10 11:54:18 |
|  6 | 2018-09-10 11:54:20 |
+----+---------------------+

data2

MariaDB [test]> select * from spider;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | 2018-09-10 11:54:14 |
|  3 | 2018-09-10 11:54:17 |
|  5 | 2018-09-10 11:54:19 |
+----+---------------------+

Spider node

MariaDB [test]> select * from spider order by id;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | 2018-09-10 11:54:14 |
|  2 | 2018-09-10 11:54:16 |
|  3 | 2018-09-10 11:54:17 |
|  4 | 2018-09-10 11:54:18 |
|  5 | 2018-09-10 11:54:19 |
|  6 | 2018-09-10 11:54:20 |
+----+---------------------+
cherubim1111
AWS Certified Solution Architect - Associate / Google Cloud Certified - Professional Cloud Architect
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away