1. マスタースレーブ同期とは
- あるサーバー (マスター) の Mysql データを別のサーバー (スレーブ) の Mysql に同期するプロセスは、マスター/スレーブ同期と呼ばれます。
- マスターサーバーは N 個のスレーブ (子) サーバーに対応できます
同期はクラウド同期と同じで、バックアップとリアルタイム更新としてのみ機能します。
2.マスタースレーブ同期のメリットとデメリット
利点
- 読み取りと書き込みの分離により、データベースへの負荷が軽減されます. マスター サーバーはデータの書き込みを担当し、スレーブ サーバーはデータの読み取りを担当します.
- 分散化、複数のサーバーにより、サーバーの Mysql がハングアップしてシステム全体がクラッシュすることを心配する必要がなくなります。
欠陥
- この操作はマスターとスレーブの同期がずれやすいだけでなく、必須のデータ整合性の要件にも当てはまりません。
3.マスタースレーブ同期の動作原理
メインサーバー:
- io スレッドを開始し、sql コマンドを
binlog
ファイル。
サーバーから:
- io スレッド、sql スレッドを開始します。
- io スレッドは、マスター サーバーの
binlog
ファイルを、その内容をrelay
スレーブ サーバーのログに書き込みます。 - SQL スレッドは
relay
ログ、mysql への同期を実行します。
マスター/スレーブ同期の処理は 3 つのスレッドで開始されることを覚えておいてください. マスター/スレーブ間の通信方法については、以下で説明します.
4.マスタースレーブ同期の構築を開始する
マスター/スレーブ同期の基本的な概念と原則をいくつか紹介した後、構成を開始しましょう。
4.1 準備
-
この記事では、マスタースレーブ同期を構築するために同じホストを使用していません. 目的は、このように学習すると個人的に理解しにくいと感じるためであり、実際のアプリケーションでホストを共有しないため、ここで準備しました. 2 つのサーバー、1 つはマスター、もう 1 つはスレーブ。
マスター サーバーの IP が で106.14.15.1
、
スレーブ サーバーの IP アドレスが であるとします。マスター サーバーとスレーブ サーバーの IP を106.11.11.2
覚えておいてください。混乱しないでください。 -
マスター サーバーとスレーブ サーバーに mysql がダウンロードされていることを確認してください. この記事で使用されている mysql のバージョンは 5.7 です. それでも mysql のダウンロード方法がわからない場合は、Centos 7 に Mysql をダウンロードするための詳細な手順を参照してください。先に書きました。
-
ここで使用する ssh リモート コントロール サーバー ツールをダウンロードします
MobaXterm
。 -
master
次にmasterとslaveと呼びますがslave
、やはりmasterとslaveの原文はmaster&slaveの外国人が付けた名前です。
4.2 マスターサーバーの設定
- 構成ファイルを変更する
/etc/my.cnf
# 绑定 ip 地址,其目的是可以让其它服务器连接上该数据库。
bind-address = 0.0.0.0
# 唯一标识符,主设为 1,子设为 2 3 4 5 ...
server-id = 1
# 启动 login 也就是主会将所有操作都写进 binlog 文件里面。
log-bin=/var/lib/mysql/log-bin.log
- スレーブサーバーが接続できるようにユーザーを作成し、いくつかの必要な同期パラメーターデータを作成します
mysql -u root -p
# 新建 slave 用户。
CREATE USER 'slave'@'106.14.15.1' IDENTIFIED BY 'secret__1';
# 开始授权,也就是创建 slave 用户后还要指定哪台服务器能使用此账号进行登录 mysql 。
# 如果指定 'slave''@'% 则代表任意服务器可以登录进来。
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'106.11.11.2' IDENTIFIED BY 'secret__1';
# 刷新权限,不刷新的话上面的创建不会立即生效的。
FLUSH PRIVILEGES;
# 开始锁表:在锁表期间无法对进行写,其目的是保证主从同步期间没有其它额外数据写进来。
FLUSH TABLES WITH READ LOCK;
# 获取主服务器的 logbin 文件索引 和 偏移量。(每个 mysql 打印都是不一样的)
# 注意:这是主从同步最关键的两个值,同步就靠它俩了,所以务必记住,在从服务器配置的时候会用到。
SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: log-bin.000735
Position: 154
- 新しいウィンドウを開いて、スレーブ サーバーに渡すデータベースのコピーを開始します。注: 上記のウィンドウはそのままです。
# 拷贝所有数据库,并放到 /root/all-databases.sql 下面。
mysqldump -u root -p --all-databases --master-data > /root/all-databases.sql
- コピーが完了したら、元のウィンドウのロックを解除してウィンドウを終了できます
UNLOCK TABLES;
exit;
- コピーした sql ファイルを scp 経由でスレーブ サーバーにアップロードします。
# 如果你的 ssh 端口默认不是 22 则可以通过 -P 指定端口。
scp /root/all-databases.sql [email protected]:/tmp/
これでメインサーバーの設定は完了ですが、とても簡単でしょうか?
4.3 スレーブサーバーの設定
- 構成ファイルを変更する
/etc/my.cnf
servier-id = 2
log-bin = /var/lib/mysql/log-bin.log
- アップロードされたSQLデータベースをインポートします
mysql -u root -p < /tmp/all-databases.sql
プロンプトが表示された場合: この操作は、実行中のスレーブ io スレッドでは実行できません。最初に STOP SLAVE IO_THREAD FOR CHANNEL '' を実行してください。mysql
-u root -p と入力して、次のように入力する必要があります。STOP SLAVE;
- 構成の同期を開始します。最も重要なことはここにあります
mysql -u root -p
# 停掉 SLAVE
STOP SLAVE;
# 还记得上面 master 创建的用户吗?这里就可以用到了。
CHANGE MASTER TO MASTER_HOST='106.13.226.62',
MASTER_USER='slave',
MASTER_PASSWORD='Guanli1_',
# 还记得 SHOW MASTER STATUS\G 的两个重要参数吗?,这里就可以用到了。
MASTER_LOG_FILE='log-bin.000733',
MASTER_LOG_POS=5752;
# 启动 SLAVE 表示开始连接主服务器数据库进行同步工作。
START SLAVE;
# 查看 SLAVE 状态,如果出现 IO 与 SQL 均为 yes 那么你整个主从同步就已经完成并正在运行了。
# IO / SQL 就是线程,还记得上面说过的【工作原理】吗?
SHOW SLAVE STATUS \G
*************************** 1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
IO/SQL ステータスが no の場合、Last_Error などの SHOW SLAVE STATUS \G の出力を使用して、問題をトラブルシューティングできます。
それでは、実験して、マスター サーバーに新しいデータベースを作成し、スレーブ サーバーが正常に同期されるかどうかを確認してみましょう。
Master
mysql -u root -p
CREATE DATABASE products;
Slave
mysql -u root -p
SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| products |
+--------------------+
スレーブの同期が取れており、マスターとスレーブの同期確立が完了していることが分かりますが、それほど難しくありませんよね?
さらに、my.cnf は他のいくつかのマスター/スレーブ構成オプションを構成できます.たとえば、sync_binlog = 1 の場合、予期しない状況に遭遇したときに、通常の同期を確保するためにハード ディスクへの書き込みを強制するかどうかを意味します.たとえば、slave-skip -errors = all は、同期処理中であることを意味し、SQL エラー レポートがある場合、必須の実行を無視するかどうか、SQL スレッドが通過しないようにするかどうかなどを指定します。
特定の詳細な構成はこの記事の範囲を超えています。自分でドキュメントを検索または参照できます。