■したいこと
RDSをマスター、EC2上のMySQLそスレーブとして、レプリケーションさせる
※RDS側のテーブルのストレージエンジンはInnoDBだがスレーブ側のMySQLのストレージエンジンはMroongaにしたい。
■time_zoneを合わせておく
Aisa/Tokyoで揃えたかったので、RDSとEC2上MySQLのtime_zoneはAsia/Tokyoにしました。
(タイムゾーンをお互い違うままでやったら、レプリケーションエラーになった)
RDS側(ちとめんどい)
MySQL側
my.cnf
[mysqld]
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でエンジン変えてあげれば、以降問題ありません。