|
7 | 7 |
|
8 | 8 | 
|
9 | 9 |
|
10 |
| -### バイナリログ |
| 10 | +### 2-1-1. バイナリログ |
11 | 11 | - MySQLサーバー上で発生したすべての変更を直列化し、記録する仕組み
|
12 | 12 | - 行った操作が記録されている
|
13 | 13 |
|
|
24 | 24 | | RBR(行ベースレプリケーション) | SQL実行時に変更が生じた行の変更前と変更後を記録する | **非決定性SQL**を保存しない代わりにバイナリログサイズが大きくなる |
|
25 | 25 | | MBR(Mixedベースレプリケーション) | 最初はSBRで保存をしようとし、非決定性SQLが出現したとき、RBRで記録する | ない |
|
26 | 26 |
|
27 |
| -### レプリケーションを構成するスレッド |
| 27 | +### 2-1-2. レプリケーションを構成するスレッド |
28 | 28 | #### マスタースレッド
|
| 29 | +- マスターとスレッドの関係性は以下の通り |
| 30 | + |
| 31 | +| 種類 | 形態 | |
| 32 | +| :--- | :--- | |
| 33 | +| マスター | サーバ | |
| 34 | +| スレーブ | クライアント | |
| 35 | + |
| 36 | +- 詳しくは上の図を参照するとわかりやすいが、マスタースレッドに接続するためには、接続スレッド、すなわちスレーブスレッドが必要 |
| 37 | + |
| 38 | +##### マスタースレッドの役割 |
| 39 | +- バイナリログをスレーブへ送ること |
| 40 | +- 送るコマンドは以下の通りだが、両方共**プロトコルレベル**コマンドなので、**mysql CLI**を使って実行させることはできない |
| 41 | + |
| 42 | + | コマンド | 内容 | |
| 43 | + | :--- | :--- | |
| 44 | + | `COM_BINLOG_DUMP` | バイナリログファイル名とポジションによってバイナリログ送信のポジションを決定する | |
| 45 | + | `COM_BINLOG_DUMP_GTID` | GTIDによってバイナリログ送信ポジションを決定する<br>MySQL5.6以降の機能。 | |
29 | 46 |
|
30 | 47 | #### スレーブI/Oスレッド
|
| 48 | +- マスターに接続し、`COM_BINLOG_DUMP`あるいは`COM_BINLOG_DUMP_GTID`コマンドを発行する |
| 49 | +- マスターから連続的に更新を受け取り、リレーログへ保存する |
| 50 | + |
| 51 | + |
| 52 | + |
| 53 | +- リレーログにもインデックスファイルがあるので、`SHOW RELAYLOG EVENTS`で確認可能 |
| 54 | + |
| 55 | +#### スレーブSQLスレッド |
| 56 | +- リレーログから更新の差分を読み取り、スレーブ上で再生するためのスレッド |
| 57 | +- IOスレッドよりも**SQLスレッド**の方が**処理量が多く、処理が遅延しやすい** |
| 58 | + |
| 59 | +### 2-1-3. レプリケーションのトポロジ |
| 60 | +- マスターとスレッドの1:1構成もあるが、以下のように1:Nの構成などもある |
| 61 | +- **負荷分散目的では、1:N構成が多い** |
| 62 | +- デュアルマスター、循環型では、更新のタイミングによっては**データの不整合が起きるリスク**がある |
| 63 | + |
| 64 | + |
| 65 | + |
| 66 | +## 2-2. レプリケーションのセットアップ概要 |
| 67 | +### 2-2-1. マスター側の設定 |
| 68 | +- バイナリログの有効化 |
| 69 | +- スレーブからの接続受け入れの準備 |
| 70 | + |
| 71 | +#### 2-2-1-1. server_idの設定 |
| 72 | +- レプリケーションを構成するMySQLサーバーは、いずれも**固有のID**を持つ |
| 73 | + - バイナリログにも記録される |
| 74 | + - これによって、どの**MySQLサーバーが更新の発信源か、認識できる** |
| 75 | +- `server_id`は**32ビットの符号なし整数**で設定する |
| 76 | + - よく使われるのは、**IPアドレスのサブネット部分**を使用 |
| 77 | + - 一つのホストで複数立てる場合(Dockerとか)は工夫が必要 |
| 78 | + |
| 79 | +#### 2-2-1-2. バイナリログの有効化 |
| 80 | +- `lon_bin`オプションを`my.cnf`に書いて再起動する |
| 81 | + |
| 82 | +#### 2-2-1-3. スレーブ接続用アカウントの作成 |
| 83 | +- `REPLICATION SLAVE`を持ったユーザーを、スレーブからログイン可能な状態にする |
| 84 | +- 作成例を下記に示す |
| 85 | + |
| 86 | + ```bash |
| 87 | + mysql> CREATE USER 'mokusen'@'192.168.30.0/255.255.255.0' IDENTIFIED BY 'secret'; |
| 88 | + mysql> GRANT REPLICATION SLAVE ON *.* TO 'mokusen'@'192.138.30.0/255.255.255.0'; |
| 89 | + ``` |
| 90 | + |
| 91 | +### 2-2-2. スレーブへデータをコピー |
| 92 | +- 新規にマスターサーバを作成し、レプリケーションを行う場合は、コピーはいらない |
| 93 | +- そうでない場合は、既存のMySQLサーバーをマスターとして、新規にスレーブを追加する場合、マスターからコピーを取る |
| 94 | + |
| 95 | +#### コピー方法 |
| 96 | +1. マスター側でバイナリログを有効化する |
| 97 | +2. マスター側で、バックアップを取得する |
| 98 | + - `mysqldump`コマンドで`--master-data=2`オプションを付けて実行する |
| 99 | +3. バックアップを何かしらの方法でスレーブへリストアする |
| 100 | + |
| 101 | +### 2-2-3. スレーブの設定 |
| 102 | +#### 2-2-3-1. server_idの設定 |
| 103 | +- `server_id`を設定する |
| 104 | + |
| 105 | +#### 2-2-3-2. レプリケーションの設定 |
| 106 | +- レプリケーションの設定は、`CHANGE MASTER` |
| 107 | +- 実行例を下記に示す |
| 108 | + |
| 109 | + ```bash |
| 110 | + mysql> CHANGE MASTER TO |
| 111 | + -> MASTER_HOST=`マスターのホスト名またはIPアドレス`, |
| 112 | + -> MASTER_PORT=3306, |
| 113 | + -> MASTER_LOG_FILE=`mysql-bin.000777`, |
| 114 | + -> MASTER_LOG_POS=12345678, |
| 115 | + -> MASTER_HEARTBEAT_PERIOD=60; |
| 116 | + ``` |
| 117 | + |
| 118 | +- `MASTER_USER`と`MASTER_PASSWORD`が含まれていないのは、平文でパスワードが保存されるリスクから、MySQL5.6から警告が出るようになった |
| 119 | + - 実行すると、スレーブ上の`master.info`ファイルか、`mysql.slave_master_info`テーブルに平文保存される |
| 120 | +- このリスクの回避法は、`START SLAVE`でログインに必要な情報を指定すること |
| 121 | + - SSL接続でない場合、盗聴される危険性があるので、気をつける |
| 122 | + |
| 123 | +#### 2-2-3-3. レプリケーションの開始 |
| 124 | +- 実行例を下記に示す |
| 125 | + |
| 126 | + ```bash |
| 127 | + mysql> START SLAVE USER = 'mokusen' PASSWORD = 'secret'; |
| 128 | + ``` |
31 | 129 |
|
32 |
| -#### スレーブSQLスレッド |
| 130 | +- コマンドが正常に終了したか、確認するために、`SHOW SLAVE STATUS`を入力する |
| 131 | + - `Slave_IO_Running`および`Slave_SQL_Running`が**Yes**になっていることを確認する |
0 commit comments