読者です 読者をやめる 読者になる 読者になる

RDSからEC2上のMySQL(mroonga)にレプリケーションする

■したいこと

RDSをマスター、EC2上のMySQLそスレーブとして、レプリケーションさせる

※RDS側のテーブルのストレージエンジンはInnoDBだがスレーブ側のMySQLのストレージエンジンはMroongaにしたい。

■time_zoneを合わせておく

Aisa/Tokyoで揃えたかったので、RDSとEC2上MySQLのtime_zoneはAsia/Tokyoにしました。

タイムゾーンをお互い違うままでやったら、レプリケーションエラーになった)

RDS側(ちとめんどい)

http://dev.classmethod.jp/cloud/aws/change-timezone-on-amazon-rds-mysql/

MySQL

my.cnf

default-time-zone=Asia/Tokyo #追加

 ※再起動してエラーがでた場合

mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root -p mysql

 ■スレーブ側のMySQLにRDS特有のテーブルを作成

これが作られてないとレプリケーションエラーする。

use mysql;
CREATE TABLE `rds_heartbeat2` (
  `id` int(11) NOT NULL,
  `value` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

レプリケーションさせたいテーブルをMASTER側に作成する

・マスター側

CREATE TABLE `articles` (
 `id` varchar(32) NOT NULL,
 `title` varchar(26) NOT NULL,
 `del_flag` tinyint(4) NOT NULL DEFAULT '0',
 `create_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
 `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

・スレーブ側

マスターと同じものを作成

※この時点でマスター側になんらかのデータを登録しておく

■マスター側に専用ユーザを作成
マスター側にレプリケーション用のユーザを作成する

CREATE USER 'repl'@'%' IDENTIFIED BY 'test';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

■スレーブ側のmy.cnfの設定

[mysqld]
server-id = 111
log-bin   = mysql-bin
relay-log = relay-log

■マスタのダンプをとる

mysqldump -u dbuser -p -h ~~~~~~~~~~~rds.amazonaws.com --no-create-db --routines --triggers --single-transaction masterdb articles > dump.sql

※RDSはFLUSH TABLES WITH READ LOCKできません

■スレーブにマスタのダンプをインポート

mysql -u root -p  slavedb < dump.sql

■マスタのバイナリログ情報の確認

show master status;

例えばこんな感じに出力

mysql-bin-changelog.000001 120

mysql-bin-changelogはバイナリログで、120は位置情報です

■SLAVEを設定

CHANGE MASTER TO
MASTER_HOST='~~~~~~~~~~~rds.amazonaws.com',
MASTER_USER='repl',
MASTER_PASSWORD='test',
MASTER_LOG_FILE='mysql-bin-changelog.000001',    
MASTER_LOG_POS=120;

LOG_FILEとLOG_POSはマスタのバイナリログ情報の値にする

一度登録して変更したい場合は

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000002',  MASTER_LOG_POS=422;

■スレーブ開始

START SLAVE

■スレーブの状態確認

SHOW SLAVE STATUS

Slave_IO_RunningがYES Slave_SQL_RunningがYES なら問題ない。
ただしスレーブ開始後にマスターにデータを追加し、 スレーブに反映されているかをきちっと確認する

マスターでのデータ登録がスレーブにも反映されている(レプリケーションされている) ことが確認できたら、スレーブ側のエンジンを本来設定したいエンジンにする

■スレーブ側のエンジンの変更

ALTER TABLE articles 
  ADD FULLTEXT INDEX `content_index` (title) COMMENT 'parser "TokenMecab", normalizer "NormalizerAuto"';
ALTER TABLE articles  ENGINE=mroonga COMMENT='engine "InnoDB"';

こんな感じでレプリケーションができました。
なぜ後からALTERでエンジンを変えてるかというと、 最初のレプリケーションで、いくらスレーブ側のテーブルを指定のエンジンで作成していても 初レプリケーション後、マスター側のテーブルと構成が同じになっているから(再作成?)
レプリケーション後ALTERでエンジン変えてあげれば、以降問題ありません。