MySQLマスタースレーブレプリケーションは、読み取りと書き込みの分離を実現します
1.読み取り/書き込み分離の原理
1.1マスタースレーブ同期とは
マスターデータベースサーバーとして機能する1つのサーバーと、スレーブデータベースサーバーとして機能する別のサーバーを指します。マスターサーバー内のデータは、スレーブサーバーに自動的にコピーされます。実際、スレーブサーバーはマスターサーバーの操作ステップを再生して、マスターデータとスレーブデータの一貫性を実現します。
1.2マスタースレーブ同期を実装する理由
(1)サーバーの負荷分散を実現します。
顧客のクエリコンプライアンスを処理する前にマスターサーバーとスレーブサーバーを分割することで、顧客の応答時間を改善します。主なプログラムは次のとおりです。
- マスターは、レコードの追加、変更、および削除の機能を処理し、クエリをスレーブに委任します。
- マスターはレコードの追加、変更、削除の機能を処理し、マスターはクエリタスクの一部も実行しますが、スレーブはデータのクエリのみを担当します。マスターサーバーがビジーの場合、マスターサーバーの作業負荷を軽減するために、一部のクエリ要求が自動的にスレーブサーバーに送信されます。
(2)データのオフサイトバックアップを実現します。
定期的にマスターサーバーからスレーブサーバーにデータをコピーして、オフサイトバックアップを実現します。この方法は、データをローカルにバックアップする場合と比較して、マスターサーバーのパフォーマンスの低下を回避すると同時に、マスターサーバーのハードディスクの損傷やサーバーの異常による回復不能なデータのリスクを軽減できます。
(3)データベースシステムの可用性を向上させます。
マスターサーバーで問題が発生した場合、スレーブサーバーをデータ更新およびクエリサービスのマスターサーバーとしてすぐに使用できます。
1.3マスターとスレーブの同期を実現する方法
mysqlでサポートされているレプリケーションタイプ:
- ステートメントベースのレプリケーション:マスターサーバーで実行されるSQLステートメントは、スレーブサーバーでも同じステートメントを実行します。MySQLはデフォルトでステートメントベースのレプリケーションを使用しますが、これはより効率的です。正確にコピーできないことが判明すると、自動的に行ベースのコピーが選択されます。
- 行ベースのレプリケーション:スレーブサーバーでコマンドを実行する代わりに、変更されたコンテンツをコピーします。mysql5.0からサポートされています。
- 混合タイプのレプリケーション:デフォルトではステートメントベースのレプリケーションが採用されます。ステートメントベースのレプリケーションが正確でないことが判明すると、行ベースのレプリケーションが採用されます。
マスタースレーブ複製の動作原理の分析
1.マスターデータベースに変更がある限り、すぐにバイナリログログファイルに記録されます。2。
スレーブデータベースはマスターデータベースに接続するためのI / Oスレッドを開始し、マスター変更のバイナリログを要求します
。3。スレーブI / Oによって取得されたバイナリログはに保存されます。独自のリレーログログファイル。
4.スレーブには、Realyログが変更されたかどうかを定期的にチェックし、データを更新するSQLスレッドがあります。
2.データベース環境の準備
ここでは、2つのサーバー(centos7)を準備し、mysql5.7.30をインストールし、2つのサーバーのネットワークをスムーズにしています。
マスターサーバー(マスター):192.168.0.101
スレーブサーバー(スレーブ):192.168.0.105
最初に、マスターデータベースによって同期されるデータベースデータをスレーブデータベースに同期します。
3.マスター構成
3.1mysql構成ファイルを変更します
msyql構成ファイルに次の構成を追加します(主にserver-id、log-bin、およびbinlog-do-dbを構成します)。
vim /etc/my.cnf
# 主从设置
server-id=1 # 节点ID,确保唯一
# log config
log-bin= mysql-bin #开启mysql的binlog日志功能
binlog-do-db=oyc #二进制日志记录的数据库(多数据库用逗号,隔开)
#控制数据库的binlog刷到磁盘上去 , 0 不控制,性能最好,1每次事物提交都会刷到日志文件中,性能最差,最安全
sync_binlog=1
binlog_format=mixed #binlog日志格式,mysql默认采用statement,建议使用mixed
expire_logs_days=7 #binlog过期清理时间
max_binlog_size=100m #binlog每个日志文件大小
binlog_cache_size=4m #binlog缓存大小
max_binlog_cache_size=512m #最大binlog缓存大
binlog-ignore-db=mysql #不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,或者 复制这句话,写多行
auto-increment-offset=1 # 自增值的偏移量
auto-increment-increment=1 # 自增值的自增量
slave-skip-errors=all #跳过从库错误
3.2mysqlを再起動します
systemctl restart mysql
或者 service mysqld restart
3.3同期ユーザーの作成と承認
1.マスターデータベースに入り、マスターのレプリケーションユーザーを作成します
create user oyc identified by '123456';
2.ユーザーにコピーする権利を与える
grant replication slave on *.* to 'oyc'@'192.168.0.105' identified by '123456';
flush privieges;
3.マスターのステータスを表示します
show master status;
4.スレーブ構成
4.1ライブラリから構成ファイルを変更する
同期テーブルの構成手順:
- Replica-do-dbは、複製するデータベースを設定します(複数のデータベースはコンマを使用し、区切ります)
- Replica-ignore-dbは、レプリケートデータベースを無視するように設定します(マルチデータベースはコンマを使用し、区切ります)
- Replica-do-tableは、複製するテーブルを設定します
- レプリケートテーブルを無視するようにレプリケートテーブルを設定します
- Replicat-wild-do-tableの機能はreplication-do-tableと同じですが、ワイルドカードを使用できます。
- Replicat-wild-ignore-tableの機能はreplication-ignore-tableと同じですが、ワイルドカードを追加できます。
[mysqld]
server-id = 2 # server_id是必须的,而且唯一。
log-bin=mysql-bin
relay-log = mysql-relay-bin
replicate-do-db=oyc
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
4.2スレーブライブラリの接続情報を設定する
スレーブをマスターに接続し、マスターのバイナリログでイベントのやり直しを開始します。
CHANGE MASTER TO MASTER_HOST='192.168.0.100',MASTER_USER='oyc',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
4.3 Salveを起動し、スレーブライブラリのステータスを表示します
START SLAVE;
SHOW SLAVE STATUS;
Slave_IO_Running = Yes Slave_SQL_Running = Yesを参照して、成功を示します。
5.テスト結果
5.1同期前のデータ
5.2マスターにデータを挿入すると、スレーブもデータを同期的に挿入します
同期効果:
マスターテーブルのデータの追加、変更、削除はスレーブに同期され、マスターテーブルの追加、変更、削除、ビューの変更、保存されたプロシージャはすべて同期されます。
6.同期エラーの解決
6.1エラーを無視して、同期を続行します
この方法は、マスターデータベースとスレーブデータベースのデータにほとんど違いがない場合、またはデータ要件が完全に統一されていない場合や、データ要件が厳密でない場合に適しています。
stop slave;
# 表示跳过一步错误,后面的数字可变
set global sql_slave_skip_counter =1;
start slave;
# 查询同步情况
show slave status\G
6.2不要なテーブルを無視する
replicate-ignore-table=table1,table2,oyc_%
6.3データを再同期してから同期する
1.最初にメインライブラリに入り、データが書き込まれないようにテーブルをロックします
。コマンド:
mysql> flush oyc with read lock;
注:この場所は読み取り専用としてロックされており、ステートメントは大文字と小文字を区別しません
2.データバックアップの実行データを
mysql.bak.sqlファイルにバックアップします
[root@master mysql]#mysqldump -uroot -p -hlocalhost > mysql.bak.sql
ここで注意すべきことの1つは、データベースのバックアップを定期的に実行する必要があることです。シェルスクリプトまたはPythonスクリプトを使用できます。これは、データが確実に確実に実行されるようにするために便利です。
3.マスターステータスを表示する
mysql> show master status;
+——————-+———-+————–+——————————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————-+———-+————–+——————————-+
| mysqld-bin.000001 | 3260 | | mysql,test,information_schema |
+——————-+———-+————–+——————————-+
1 row in set (0.00 sec)
4.データ回復のためにmysqlバックアップファイルをスレーブマシンに転送します
scpコマンドを使用する
[root@server01 mysql]# scp mysql.bak.sql [email protected]:/tmp/
5.ライブラリから状態を停止します
mysql> stop slave;
6.次に、ライブラリからmysqlコマンドを実行して、データバックアップをインポートします
mysql> source /tmp/mysql.bak.sql
7.スレーブライブラリの同期を設定し、そこで同期ポイントに注意します。これは、マスターライブラリのマスターステータス情報の表示の|ファイル|位置です。
change master to master_host = ‘192.168.1.101’, master_user = ‘oyc’, master_port=3306, master_password='123456', master_log_file = ‘mysqld-bin.000002’, master_log_pos=1002;
8.スレーブ同期を再開します
mysql> start slave;
9.マスターのロックを解除します
unlock table;
10.同期ステータスを表示する
mysql> show slave status\G 查看同步情况