MySQL
AWS
EC2

AWS EC2 Mysql レプリケーション環境構築

More than 1 year has passed since last update.

はじめに

本番環境はRDSのMulti A-Z でレプリケーションしているのですが、selectはslaveに、FOR UPDATEはmasterになどクエリの向き先をしっかり確認しておく必要があったので勉強がてらEC2でレプリケーション環境を構築したので自分用にメモ。

やること

・ インスタンスを2つ起動
・ レプリケーション設定
・ 接続確認

EC2インスタンス起動

セキュリティ設定
2つのサーバのMysqlが互いに通信できるように、
Inboundで3306ポートに対して、互いのPrivateIPを設定します。

レプリケーション設定

Master-Server

my.conf

/etc/my.cnf
[mysqld]
server-id=101
log_bin

server-idは、1から(2^32)-1)間の正整数で、サーバ間で重複しないように設定する(任意の値でOK)
ただし、1、2はserver-idがないときのデフォルトとして使用されるため極力使わないほうがいい

Slave-ServerのUser作成とアクセスの許可

mysql > grant replication slave on *.* to 'replication'@'Slave-Srever Private IP' identified by 'password'

ステータスの確認

mysql > show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000001 |     1234 |              |                  |
+-------------------+----------+--------------+------------------+

Slave-Server

my.conf

/etc/my.cnf
[mysqld]
server-id=201
replicate-do-db=db名(対象DB指定)

Master-Server登録

mysql > change master to master_host = 'Master-Server Private IP',
        master_user = 'replication',
        master_password = 'pass',
        master_log_file = 'mysqld-bin.000001', //Master-Serverの情報
        master_log_pos = 1234 //Master-Serverの情報

Slave-ServerのUser作成とアクセスの許可

mysql > grant all privileges on *.* to name@'Master-Srever Private IP' identified by 'password';

ステータスの確認

mysql > show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: Master-Server Private IP
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysqld-bin.000001
          Read_Master_Log_Pos: 2258
               Relay_Log_File: mysqld-relay-bin.000004
                Relay_Log_Pos: 10195
        Relay_Master_Log_File: mysqld-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

Slave_IO_Running: Yes、Slave_SQL_Running: Yesで設定OK

接続確認

各サーバーからホスト指定でログインできれば接続はできている状態となります。
下記のエラーが出る場合はEC2インスタンスのセキュリティを見直す必要があります。

ERROR 1130 (HY000): Host 'Private IP' is not allowed to connect to this MySQL server

さいごに

その都度、各mysqlの再起動や必要であれば権限の反映FLUSH PRIVILEGESが必要になるかと思います。
自分用のメモとして記述しましたが、不備がありましたらご教授いただけますと幸いです。