前回はEC2でMySQL(運用編 VPで無停止ALTER)を紹介しましたが、同じ様に通常のInnoDBテーブルをSpiderシャーディングに無停止で移行することも可能です。
そこで今回は、この方法を紹介します。

初期テーブルは以下のとおりです。

mysql> create table gift(
 id int auto_increment,
 name varchar(255),
 description text,
 created_at datetime not null,
 primary key(id)
)engine=InnoDB;
Query OK, 0 rows affected (0.02 sec)

上記をSpider化していきますが、今回は定期的にデータを投入しながらSpider化を行ってみます。
まず、以下のようなシェルを実行し、常にデータの投入がされている状態を作ります。

$ vi insert2gift.sh
#!/bin/sh

i=0
while ((1))
do
 name=$(uuidgen | tr -d '-')
 desc=$(mkpasswd -l 1000)
 mysql -u xxxxxxx cloudpack -pxxxxxxxxxxxxx -e "INSERT INTO gift(name, description,created_at) VALUES('${name}', '${desc}', NOW());"
 echo "."
 sleep 1
done;

exit 1
$ sh insert2gift.sh

それではVPを利用し、無停止でSpiderに移行をしてみようと思います。
基本的には前回と同様で、切り替え用のダミーと2つのデータノードをもつ新規Spiderテーブル、
それらを束ねるVPテーブルを用意します。

○データノードの設定

mysql> GRANT ALL PRIVILEGES ON *.* TO 'xxxxxxxxxxxxxx'@localhost IDENTIFIED BY 'xxxxxxxxxxxxxx';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'xxxxxxxxxxxxxx'@'%' IDENTIFIED BY 'xxxxxxxxxxxxxx';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'xxxxxxxxxxxxxx'@'123.123.123.123' IDENTIFIED BY 'xxxxxxxxxxxxxx';
Query OK, 0 rows affected (0.00 sec)

mysql> use cloudpack;
Database changed

mysql> create table gift(
 id int auto_increment,
 name varchar(255),
 description text,
 created_at datetime not null,
 primary key(id)
)engine=InnoDB;
Query OK, 0 rows affected (0.00 sec)

○SpiderノードのSpider、ダミー、VPテーブルの設定

mysql> create table gift_new(
 id int auto_increment,
 name varchar(255),
 description text,
 created_at datetime not null,
 primary key(id)
) engine = Spider DEFAULT CHARSET=utf8
CONNECTION ' table "gift", user "xxxxxxxxxxxxx", password "xxxxxxxxxxxxx" '
PARTITION BY LIST(MOD(id, 2)) (
   PARTITION hostb VALUES IN (0) comment 'host "111.111.111.111", port "3306"',
   PARTITION hostc VALUES IN (1) comment 'host "222.222.222.222", port "3306"'
);
Query OK, 0 rows affected (0.02 sec)

mysql> create table gift_dummy like gift;
Query OK, 0 rows affected (0.01 sec)

mysql> create table gift_vp(
  id int auto_increment,
  name varchar(255),
  description text,
  created_at datetime not null,
  primary key(id)
)engine=vp
comment 'table_name_list "gift_dummy gift_new", cit "2", cil "2", ctm "1", ist "1", zru "1"';
Query OK, 0 rows affected (0.03 sec)

この時点では、以下のイメージのような構成になっています。

○テーブルのリネーム

こちらも前回と同様にテーブルのリネームを行い、接続先をVPテーブルに向けます。

mysql> rename table 
 gift_dummy to gift_delete,  
 gift to gift_dummy,  
 gift_vp to gift;
Query OK, 0 rows affected (0.03 sec)

○データのコピー

こちらも前回と同様になります。

mysql> select vp_copy_tables('gift', 'gift_dummy', 'gift_new');
Query OK, 0 rows affected (0.01 sec)

○テーブルの再リネーム

コピーが完了したら、テーブルのリネームを再度行い、移行先のSpiderテーブルをgiftにします。

mysql> rename table 
 gift to gift_vp,  
 gift_new to gift;
Query OK, 0 rows affected (0.01 sec)

○不要テーブルの削除

最後に、必要のなくなったテーブルを削除します。

mysql> drop table 
 gift_dummy,
 gift_vp, 
 gift_delete;
Query OK, 0 rows affected (0.00 sec)

これで、移行が完了しました。
それでは、実際にテーブルの内容を見てみます。

host A

mysql> select * from gift order by id;
+------+----------------------------------+----------------------------------+---------------------+
| id   | name                             | description                      | created_at          |
+------+----------------------------------+----------------------------------+---------------------+
|   1  | d84c7d13d56e48999f6e42396bb0d6b8 | 57b6f87681df4141953b63cd6ee74... | 2011-09-21 22:35:23 |
|   2  | fc52fbdee1904e40a92711bc3ff5b53b | 4fe1116428e142369ab419d603a8b... | 2011-09-21 22:35:23 |
|   3  | 936917c0e7b246b380573654c80863e1 | 08cf01342f1149b5a7fa15f2df5b6... | 2011-09-21 22:35:24 |
|   4  | 5d630544409e4ef98ece5b489cd5aff5 | c3c1848832d04b69bc9f9c1bd7249... | 2011-09-21 22:35:23 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 5429 | 0462eaf7646b4855a993a49128ba3f4d | 0d07cdbac3c14723b25bc1a1bc74a... | 2011-09-22 01:07:42 |
| 5430 | b67fdb0b633c40829dd812c0358f5ccb | 85a310e34668427ab392b07fe36f8... | 2011-09-22 01:07:49 |
| 5431 | 431a0be6d0d94223bad8405d0011560e | f78b63b0ed5c42d0a947dc3db6bcb... | 2011-09-22 01:07:56 |
| 5432 | 4a0f9c4dcbaa42a99aeb014232091551 | 9ceb2dce039e49268280560631578... | 2011-09-22 01:08:02 |
+------+----------------------------------+----------------------------------+---------------------+
5007 rows in set (0.06 sec)
host B
mysql> select * from gift order by id;
+------+----------------------------------+----------------------------------+---------------------+
| id   | name                             | description                      | created_at          |
+------+----------------------------------+----------------------------------+---------------------+
|   1  | d84c7d13d56e48999f6e42396bb0d6b8 | 57b6f87681df4141953b63cd6ee74... | 2011-09-21 22:35:23 |
|   3  | 936917c0e7b246b380573654c80863e1 | 08cf01342f1149b5a7fa15f2df5b6... | 2011-09-21 22:35:24 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 5429 | 0462eaf7646b4855a993a49128ba3f4d | 0d07cdbac3c14723b25bc1a1bc74a... | 2011-09-22 01:07:42 |
| 5431 | 431a0be6d0d94223bad8405d0011560e | f78b63b0ed5c42d0a947dc3db6bcb... | 2011-09-22 01:07:56 |
+------+----------------------------------+----------------------------------+---------------------+
2503 rows in set (0.01 sec)

host C

mysql> select * from gift order by id;
+------+----------------------------------+----------------------------------+---------------------+
| id   | name                             | description                      | created_at          |
+------+----------------------------------+----------------------------------+---------------------+
|   2  | fc52fbdee1904e40a92711bc3ff5b53b | 4fe1116428e142369ab419d603a8b... | 2011-09-21 22:35:23 |
|   4  | 5d630544409e4ef98ece5b489cd5aff5 | c3c1848832d04b69bc9f9c1bd7249... | 2011-09-21 22:35:23 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 5430 | b67fdb0b633c40829dd812c0358f5ccb | 85a310e34668427ab392b07fe36f8... | 2011-09-22 01:07:49 |
| 5432 | 4a0f9c4dcbaa42a99aeb014232091551 | 9ceb2dce039e49268280560631578... | 2011-09-22 01:08:02 |
+------+----------------------------------+----------------------------------+---------------------+
2504 rows in set (0.00 sec)

上記のように、元々入っていたデータと、移行中に投入されたデータがきれいにシャーディングされていることがわかります。

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、こちら