データベース応用コース9/9
レプリケーションを構築してみよう
このシナリオではレプリケーションの構築方法について学んでいきます。
レプリケーションとは
レプリケーションとは複製を意味し、データベースにおいては元から存在していたデータを別のMySQL(RDBMS)に複製することを指します。また、1つのMySQL(RDBMS)をインスタンスという単位で表現します。
レプリケーションを行いMySQLのインスタンス数を増やすことで一貫性を保ちながら冗長性のあるシステムを構築できるようになります。
一貫性とは複数のMySQLから取得したデータが一致し、常に同じ正しいデータに保つことを指します。例えばインスタンスAとBのMySQLが存在するケースを考えてみましょう。インスタンスAでは社長というデータがあるのにも関わらず、インスタンスBでは社長というデータがない場合、これは一貫性があるとは言えません。一貫性を保つことは、より安全なシステムやアプリケーションの提供に繋がるので、一貫性はMySQLに限らずシステム全般で重要な要素となります。
冗長性とはサーバー(コンピュータ)を複数用意し、それらを連携させることで負荷を分散させたり、耐障害性を高めることを指します。サーバーを複数用意することで同一のMySQLにアクセス(接続)する人の数を減らすことができ、その結果通信にかかる負荷を減らすことが出来ます。負荷を減らすことは、より快適なシステムやアプリケーションの提供に繋がるので、冗長化はMySQLに限らずシステム全般で重要な要素となります。
プライマリ・セカンダリ構成とは
MySQLでレプリケーションを行う上でもうひとつ大事なキーワードがあります。
それはプライマリ・セカンダリ構成です。
プライマリ・セカンダリ構成とはレプリケーションを構築する上で最も基本的なインスタンスの構成となります。プライマリは親、セカンダリは子供として理解しましょう。
レプリケーションを構築する際、元からデータの存在しているインスタンスをプライマリ(親)とし、そのデータを複製したインスタンスをセカンダリ(子供)として扱います。セカンダリは複数インスタンス存在することが出来ます。
レプリケーションを構築する方法
それでは、レプリケーションを実際に構築する方法について学んでいきましょう。
まずはレプリケーションを構築するための手順について簡単に把握しておきます。
- プライマリ上でレプリケーション化のための設定を行う。
- プライマリ上でレプリケーションに接続する専用のユーザを作る。
- プライマリからフルバックアップを取得する。
- セカンダリ上でレプリケーション化のための設定を行う。
- セカンダリ上でマスターとなるMySQLを指定する。
1. プライマリ上でレプリケーション化のための設定を行う。
まずはプライマリ上でレプリケーションのための設定を行います。
設定はSQLではなく、Vimなどのテキストエディタを使って /etc/mysql/mysql.conf.d/mysqld.cnf に書き込みます。
[mysqld]
...省略
server-id=1
log-bin=mysql-bin
上記に追加した2つの項目について説明します。
- server-id → 各MySQLインスタンスに割り振る固有のID
- log-bin → MySQLでの変更履歴を記録しておくログを保管するファイル名
プライマリ上では以上2つの設定を行う必要があります。
ファイルを変更したら設定を反映させるためにMySQLを再起動しましょう。
service mysql restart
2. プライマリ上でレプリケーションに接続する専用のユーザを作る。
次にREPLICATIONとSLAVEの権限を付与したユーザを作成しましょう。
# replという名前のユーザを作成
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_pass';
# replにレプリケーション用の権限を付与
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
# 変更を反映
FLUSH PRIVILEGES;
3. プライマリからフルバックアップを取得する。
mysqldump -u ユーザ名 -h IPアドレス -p --all-databases --master-data > dump.sql
4. セカンダリ上でレプリケーション化のための設定を行う。
次にセカンダリ上でレプリケーションのための設定を行います。
プライマリと同じく、設定はテキストエディタを使って /etc/mysql/mysql.conf.d/mysqld.cnf に書き込みます。
[mysqld]
server-id=2
ファイルを変更したら設定を反映させるためにMySQLを再起動しましょう。
service mysql restart
再起動が終わったら、プライマリ上から転送されたバックアップを使い、データをセカンダリのデータベースに反映しましょう。
# dump.sqlという名前のバックアップを反映させる。
source dump.sql
# 変更結果を反映する
FLUSH PRIVILEGES;
source文はファイルに記されているSQL文を順番に実行するコマンドです。バックアップファイルの中身はSQL文になっているので、source文を使うことでバックアップデータを反映するのに必要なSQL文を順番に実行することができます。つまり、source文でバックアップファイルを対象にするとMySQL上でバックアップの復元を行うことが可能になります。変更を反映するには、FLUSH PRIVILEGESを実行します。
5. セカンダリ上でプライマリとなるMySQLを指定する。
まずは、指定する際に指定な情報を取得するために下記のコマンドを実行します。
grep "^CHANGE MASTER" dump.sql
上記のコマンドを入力することで、バックアップファイルの中から後ほど必要となるMASTER_LOG_FILEとMASTER_LOG_POSの値が出力されます。
最後に、セカンダリのデータベース上で接続するプライマリを指定します。
# 接続するプライマリを指定する。
CHANGE MASTER TO
MASTER_HOST="db.envader.local",
MASTER_USER="repl",
MASTER_PASSWORD="repl_pass",
MASTER_LOG_FILE="上のgrepで出力されたファイル名",
MASTER_LOG_POS=上のgrepで出力されたログファイルの位置;
# セカンダリをスタートする。
START SLAVE;
# セカンダリの稼働状態を確認する。
SHOW SLAVE STATUS\G
CHANGE MASTER TO文で設定する項目は以下の通りです。
- MASTER_HOST → 接続するプライマリのIPアドレスまたはドメイン
- MASTER_USER → 接続するプライマリで使用するレプリケーション用のユーザ
- MASTER_PASSWORD → MASTER_USERで指定したユーザのパスワード
- MASTER_LOG_FILE → レプリケーションの際に使うバイナリログファイルの名前
- MASTER_LOG_POS → レプリケーションの際に使うバイナリログファイルの位置
以上でレプリケーションの構築は完了です。
まとめ
今回は、レプリケーションについて解説しました。
問題を解くためには、十分な画面サイズのPC環境をご利用下さい。