skillup

技術ブログ

Database

MySQLのレプリケーションについて

投稿日:

MySQLのレプリケーションについて調べたことなどを。

レプリケーションの基礎知識

定義

  • DBを複製して、別サーバーでも管理できるようにすること
  • バックアップと違い、リアルタイムで変更を反映したDBをもつ

構成

  • サーバーは一般的にマスター(わかりやすくいうとメイン)とスレーブ(サブ)に分割される
  • マスターはメインのDB主に、データの変更と参照両方ができ、スレーブに変更内容を転送、複数のスレーブが持てる。
  • スレーブはマスターの変更内容を受け取り、基本的には参照のみに使われることが多い。

メリット

参照性能の向上

重いSELECT文などがある場合はスレーブを参照、更新系はマスターをみるなどとすることで負荷を適宜に分散させることができる。

注:基本的に一瞬でスレーブには転送されるのですが、それでもほんの少しラグが起こります。

以前、レプリケーションを使ったDBを使っている時

1 何らかの更新処理(マスターを参照)

2  スレーブからデータを取得

とした時にスレーブに変更が反映されていない・・ということがありました。ほんの少しですがラグがあったので注意しましょう。

可用性の向上

マスター障害時にマスターをスレーブに昇格するなどして、障害時の復旧コストを下げることができる

仕組み

マスターのバイナリログをスレーブに転送することで実現することができる。

MySQL入門 レプリケーション編

実際の構築手順(ローカルで実行できる環境)

dockerでの構築

ローカルではdockerを使うのが一番やりやすいと思います。

docker-compose.yml

./docker/master_db/my.cnf

./docker/slave_db/my.cnf

https://github.com/umanari145/db_replication

docker-composeでお手軽mysqlのmaster-slave構成

DB側の構築手順

マスター側設定

起動後手順

  1. masterの設定が正常に読み込まれているか状態の確認 SHOW MASTER STATUS 下記のような形式のデータが入っているはず(値自体は変わってくる)

  1. 任意のデータベース作成 CREATE DATABASE example
  2. スレーブの設定 GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.192.4' IDENTIFIED BY 'repl_pass'
  3. 権限確認 SHOW GRANTS FOR 'repl_user'@'192.168.192.4'で下記のレコードがあることを確認

  1. マスター側のダンプデータの作成

スレーブ側の設定

  1. スレーブのDB作成 CREATE DATABASE example
  2. マスター側のダンプデータのリストア mysql -uroot -p example < master_db.sql
  3. スレーブ側の設定 マスター側の操作で設定したホスト、ユーザー、パスワードを設定

  1. スレーブ側のスタート START SLAVE;
    誤って設定した場合は
    STOP SLAVE IO_THREAD;
    STOP SLAVE;
    RESET SLAVE;
  1. 確認 SHOW SLAVE STATUS; 下記のようになっていればOK

確認

下記のようなSQLをマスター側に流し、スレーブに反映があるかいなか

あぱーブログ MySQL 5.6 マスター/スレーブサーバの設定メモ

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

MySQLのLIMIT,OFFSETに関して&explainの見方など

自作のWEBアプリを作っていたところSELECT句が異常に遅いケースがありました。 発見までにかなり時間がかかったんですが、不可思議な現象としてはOFFSETが小さいときと大きいときで検索スピードが全 …

no image

mavenのリモートリポジトリについて

JPAでO/Rマッパーに慣れてからというもの通常のSQLをごりごり書くのが億劫になってきました。 億劫というかいろいろとリスクがありますね。 問題点としてはコンパイルするときにエラーが検知できなかった …

no image

複数GROUP BYでの注意

GROUP BYしたときに件数が増えるという現象があったので一応メモ。というか当たり前のことですが・・・ たとえば以下のようなテーブルがあったとします。 student id student_name …

no image

SQL基礎 複雑なSQLの組み方

SQLの本を見ますとかなり複雑なSQLが書かれていることが多いです。 これは頑張っても無理では・・・と思っていましたが、ポイントしては 原則として必ず図に書く まずは問題を細かく分割する 細部から切り …

no image

dbUnitの使い方

えーJavaで有名なテストツールDBUnitについて。 DbUtilではありませんので間違えないように。(私は最初間違えました・・・) まだ全然使い込んでるわけではありませんがどんなことができるかとい …

アーカイブ