MySQLマスタースレーブレプリケーションは、読み取りと書き込みの分離を実現します

MySQLマスタースレーブレプリケーションは、読み取りと書き込みの分離を実現します

1.読み取り/書き込み分離の原理

1.1マスタースレーブ同期とは

マスターデータベースサーバーとして機能する1つのサーバーと、スレーブデータベースサーバーとして機能する別のサーバーを指します。マスターサーバー内のデータは、スレーブサーバーに自動的にコピーされます。実際、スレーブサーバーはマスターサーバーの操作ステップを再生して、マスターデータとスレーブデータの一貫性を実現します。

1.2マスタースレーブ同期を実装する理由

(1)サーバーの負荷分散を実現します。
顧客のクエリコンプライアンスを処理する前にマスターサーバーとスレーブサーバーを分割することで、顧客の応答時間を改善します。主なプログラムは次のとおりです。

  • マスターは、レコードの追加、変更、および削除の機能を処理し、クエリをスレーブに委任します。
  • マスターはレコードの追加、変更、削除の機能を処理し、マスターはクエリタスクの一部も実行しますが、スレーブはデータのクエリのみを担当します。マスターサーバーがビジーの場合、マスターサーバーの作業負荷を軽減するために、一部のクエリ要求が自動的にスレーブサーバーに送信されます。

(2)データのオフサイトバックアップを実現します。
定期的にマスターサーバーからスレーブサーバーにデータをコピーして、オフサイトバックアップを実現します。この方法は、データをローカルにバックアップする場合と比較して、マスターサーバーのパフォーマンスの低下を回避すると同時に、マスターサーバーのハードディスクの損傷やサーバーの異常による回復不能なデータのリスクを軽減できます。

(3)データベースシステムの可用性を向上させます。
マスターサーバーで問題が発生した場合、スレーブサーバーをデータ更新およびクエリサービスのマスターサーバーとしてすぐに使用できます。

1.3マスターとスレーブの同期を実現する方法

mysqlでサポートされているレプリケーションタイプ

  • ステートメントベースのレプリケーション:マスターサーバーで実行されるSQLステートメントは、スレーブサーバーでも同じステートメントを実行します。MySQLはデフォルトでステートメントベースのレプリケーションを使用しますが、これはより効率的です。正確にコピーできないことが判明すると、自動的に行ベースのコピーが選択されます。
  • 行ベースのレプリケーション:スレーブサーバーでコマンドを実行する代わりに、変更されたコンテンツをコピーします。mysql5.0からサポートされています。
  • 混合タイプのレプリケーション:デフォルトではステートメントベースのレプリケーションが採用されます。ステートメントベースのレプリケーションが正確でないことが判明すると、行ベースのレプリケーションが採用されます。
    Msyqlマスタースレーブレプリケーションの原則

マスタースレーブ複製の動作原理の分析

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 查看同步情况

おすすめ

転載: blog.csdn.net/u014553029/article/details/106222188