Skip to content

Commit 253a9ae

Browse files
committed
add chapter2 and レプリケーション方法
1 parent fbdb0f6 commit 253a9ae

File tree

3 files changed

+102
-3
lines changed

3 files changed

+102
-3
lines changed
62.7 KB
Loading

image/mysql-トポロジ.png

220 KB
Loading

learn/chapter02.md

Lines changed: 102 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
![mysql-レプリケーション.PNG](../image/mysql-レプリケーション.png)
99

10-
### バイナリログ
10+
### 2-1-1. バイナリログ
1111
- MySQLサーバー上で発生したすべての変更を直列化し、記録する仕組み
1212
- 行った操作が記録されている
1313

@@ -24,9 +24,108 @@
2424
| RBR(行ベースレプリケーション) | SQL実行時に変更が生じた行の変更前と変更後を記録する | **非決定性SQL**を保存しない代わりにバイナリログサイズが大きくなる |
2525
| MBR(Mixedベースレプリケーション) | 最初はSBRで保存をしようとし、非決定性SQLが出現したとき、RBRで記録する | ない |
2626

27-
### レプリケーションを構成するスレッド
27+
### 2-1-2. レプリケーションを構成するスレッド
2828
#### マスタースレッド
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以降の機能。 |
2946

3047
#### スレーブI/Oスレッド
48+
- マスターに接続し、`COM_BINLOG_DUMP`あるいは`COM_BINLOG_DUMP_GTID`コマンドを発行する
49+
- マスターから連続的に更新を受け取り、リレーログへ保存する
50+
51+
![mysql-スレーブIOスレッド.PNG](../image/mysql-スレーブIOスレッド.png)
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+
![mysql-トポロジ.PNG](../image/mysql-トポロジ.png)
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+
```
31129

32-
#### スレーブSQLスレッド
130+
- コマンドが正常に終了したか、確認するために、`SHOW SLAVE STATUS`を入力する
131+
- `Slave_IO_Running`および`Slave_SQL_Running`**Yes**になっていることを確認する

0 commit comments

Comments
 (0)