2017の15日目の記事です。ブロックチェーン技術や仮想通貨はだいぶ前から話題になっていますが、それに関連した面白そうな取り組みをしているようなので、興味のある方はぜひご覧下さい。今回はMySQLのレプリケーションについて書いていこうと思います。MySQLの話なのか?私のTwitterアカウントを見ている人ならご存知かもしれませんが、ここ数ヶ月ほぼMySQL(とカレー🍛)のことしかツイートしていないくらいにはMySQLを触っていたからです。2017年11月16日ということです。真面目に書くと、最近某のMySQLアップグレードをするためにMySQLのことをいろいろ学んで、それらを一度整理したいと思ったからです。今回はその整理したいことの1つである「レプリケーション」についてです。レプリケーションの流れを何となく理解するレプリケーションとは、1つのDBサーバ(Master)のデータを別のDBサーバ(Slave)に複製できる機能のことをいいます。レプリケーションには非同期のものや準同期のものがありますが、今回はデフォルトで設定されている非同期のレプリケーションについて説明します。レプリケーションの流れを何となく理解するために以下のような図を用意しました。MasterのDBに更新系クエリが実行されると、バイナリログにその情報が格納されます。ーぽーの日々)があるので、気になる方は参照してください。データの複製はこのバイナリログを元に行われます。SlaveはMasterからバイナリログの差分を取得する必要があるのですが、それをやってくれるのがマスタースレッドとスレーブI/Oスレッドです。スレーブI/OスレッドがMasterに接続し、COM_BINLOG_DUMPというコマンドを使うことで、継続的にマスタースレッドがバイナリログを差分を送ってくれます。SLAVE権限が必要になります。スレーブI/Oスレッドが受け取ったバイナリログはそのままSlaveに反映されるわけではなく、一度リレーログに書き込まれます。スレーブSQLスレッドがリレーログを読み込み、そのログに含まれるクエリを実行することでデータが複製されます。これが一連の流れになります。Dockerで環境構築してみるレプリケーションについて分かってきたところで、実際にDockerでシュッと環境構築できるサンプルを用意してみました。purple-jwl/mysql-master-slave-replication-sample[追記(2017/12/16)]サンプルはGTIDを用いないレプリケーションについてですが、GTIDを用いたレプリケーション設定をGitHub上のリポジトリのみでコメントアウトで追加していますので、興味のある方はご覧下さい。ID)という機能が使えるようになり、これを用いてレプリケーション設定することもできるようになりました。このサンプルではMaster、Slaveが1台ずつの構成になっていて、以下で各ファイルがやっていることを簡単に説明します。master/my.cnf[client]loose-default_character_set=utf8mb4[mysqld]character_set_server=utf8mb4explicit_defaults_for_timestamp=trueserver_id=1log_bin=mysql-binbinlog_format=MIXED雑に設定を書いています。レプリケーションで必要なバイナリログはデフォルトでは生成されないため、server_idなどを設定する必要があります。slave/my.cnfmaster/my.cnfとほぼ同じなので省略。(server_idが異なるだけなので、もっといい感じにファイル管理できそう)docker-compose.yml特に触れることがないので省略。'repl'"Masterのコンテナ起動時に実行させるスクリプトで、レプリケーション用ユーザーをMasterのDBに作っています。レプリケーションではSlaveからMasterのDBに接続するため、この処理が必要となります。SLAVE'Slaveのコンテナ起動時に実行させるスクリプトで、バイナリログの読み取り位置を設定し、レプリケーションの開始します。最初のsleep処理は、Masterのコンテナ上でMySQLが起動する前にレプリケーションの設定をしようとするとエラーになるので入れています。さいごにいかがだったでしょうか。このようにレプリケーションの設定だけなら意外と簡単にできるのが分かったと思います。私はここ数ヶ月はMySQLな日々を送っていましたが、それまではMySQLについて学ぶ機会がほとんどありませんでした。調べてみると知らない機能や罠などが無限に出てきてとても面白いです。あとMySQLについて学ぶとき、yoku0825さんのブログが非常に役に立っているので感謝したいです。(ちなみに今回の記事で、本当はMHAの設定までをDockerでシュッと構築してフェイルオーバーの実験などをやりたかったのですができませんでした。いう宣言だけしておきます。)明日の担当は@nyanyamiさんです。»プロフィールid:purple_jwlプログラミングやボードゲームなど、自分の好きなことを書くブログです。(12)月別アーカイブはてなブログをはじめよう!purple_jwlさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。