LoginSignup
58
57

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-06

■したいこと

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でエンジン変えてあげれば、以降問題ありません。

58
57
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
58
57