mysqlデータベースのマスター/スレーブ同期により、読み取りと書き込みの分離が実現されます
12つのcentos7システムにそれぞれmysql5.7をインストールします
序文
多数の同時訪問を和らげるために、大規模なWebサイトは、Webサイトで分散負荷分散を実現することを除いて十分とは言えません。データビジネス層とデータアクセス層に関して言えば、それが依然として従来のデータ構造である場合、または単一のサーバーに依存して非常に多くのデータベース接続操作を処理する場合、特にデータが失われた場合、データベースは必然的にクラッシュします。その結果はさらに悲惨なものになるでしょう。このとき、データベース接続を減らす方法を検討します。今日はトピックを入力しましょう。
マスタースレーブデータベースを使用して、読み取りと書き込みの分離を実現し、それによってマスターデータベースのプレッシャーを共有します。mysqlを複数のサーバーにデプロイし、そのうちの1つをマスターデータベースと見なし、他のサーバーをスレーブデータベースと見なして、マスターとスレーブの同期を実現します。マスターデータベースはアクティブな書き込み操作を担当しますが、スレーブデータベースはアクティブな読み取り操作のみを担当します(スレーブスレーブデータベースはデータの整合性を維持するためにパッシブに書き込み操作を行います)。これにより、データの損失を大幅に回避できます。データベース接続を減らすこともできます。メインデータベースの負荷を軽減します。
次の写真を見てみましょう:
上記のモデルでは、Mysql-Aはマスターサーバーまたはマスターであり、Mysql-Bはスレーブサーバーまたはスレーブです。
Mysql-Aのデータベースイベント(データベースのSQL操作ステートメントの変更など)はログシステムAに保存され、対応するポート(デフォルトは3306)のネットワークを介してMysql-Bに送信されます。Mysql-Bはそれを受信すると、それをローカルログシステムBに書き込み、データベースMysql-Bのデータベースイベントを1つずつ完了します。
ログシステムAは、MYSQLログタイプのバイナリログであり、データベーステーブルを変更するすべてのアクション、つまりbinログを保存するために特に使用されます。MYSQLは、ステートメントの実行後、ロックを解放する前にバイナリログに書き込むことに注意してください。トランザクションの安全性を確保するため。
ロギングシステムBはバイナリログではありません。MYSQL-Aのバイナリログからコピーされるため、データベースの変更によって生成されることはありません。少しリレーのように感じます。リレーログまたはリレーログと呼ばれます。
上記のメカニズムにより、Mysql-AとMysql-Bのデータベースデータの整合性を確保できますが、時間の遅延、つまりMysql-Bのデータが遅れている必要があります。したがって、このような問題が発生します。Mysql-Aデータベース操作は同時に実行できますが、Mysql-Bはリレーログから1つずつ読み取って実行することしかできません。Mysql-Aが頻繁に書き込む場合、Mysql-Bは追いつけない可能性があります。
マスタースレーブ同期レプリケーションには、いくつかの方法があります。
(1)同期レプリケーション、マスター変更は、スレーブ1、スレーブ2、...、スレーブnが完了するのを待ってから戻る必要があります。
(2)非同期レプリケーションの場合、マスターは自身のデータベース操作を完了するだけで済みます。スレーブがバイナリログを受信して操作を完了したかどうかは関係ありません。MYSQLのデフォルト設定。
(3)準同期レプリケーション。マスターは、スレーブでの1つの操作が成功することを保証するだけで、他のスレーブに関係なく戻ります。この関数は、Google forMYSQLによって導入されました。
この記事では、読み取りと書き込みの分離を実現するために、centos7システムに実装されたmysql5.7データベースのマスタースレーブ同期構成について説明します。
12つのcentos7システムにそれぞれmysql5.7をインストールします
特定のインストール手順は、このリンクhttps://blog.csdn.net/qq_15092079/article/details/81629238にあります。
この記事の2つのサーバーのIPアドレスは、マスターサーバー(192.168.17.130)とスレーブサーバー(192.168.17.132)です。
後でテストするために、これら2つのサーバーにそれぞれテストデータベースを作成します。
2マスターサーバーの構成
2.1構成ファイルmy.cnfの変更
#根据上一篇文章,编辑my.cnf文件
[root@localhost mysql]# vim /etc/my.cnf
#在[mysqld]中添加:
server-id=1
log_bin=master-bin
log_bin_index=master-bin.index
binlog_do_db=test
#备注:
#server-id 服务器唯一标识。
#log_bin 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。
#binlog_do_db 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。
#binlog_ignore_db 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。
#其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可。
2.2サーバーからユーザーと権限を作成する
#进入mysql数据库
[root@localhost mysql]# mysql -uroot -p
Enter password:
#创建从数据库的masterbackup用户和权限
mysql> grant replication slave on *.* to masterbackup@'192.168.17.%' identified by '123456';
#备注
#192.168.17.%通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP
#若将 192.168.17.% 改为 %,则任何ip均可作为其从数据库来访问主服务器
#退出mysql
mysql> exit;
[root@localhost mysql]# service mysql restart
Shutting down MySQL.... SUCCESS!
Starting MySQL. SUCCESS!
2.4メインサーバーのステータスを表示する
#进入mysql数据库
[root@localhost mysql]# mysql -uroot -p
Enter password:
#查看主服务器状态
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 154 | test | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
3スレーブ構成
3.1構成ファイルmy.cnfの変更
#根据上一篇文章,编辑my.cnf文件
[root@localhost mysql]# vim /etc/my.cnf
#在[mysqld]中添加:
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
#replicate-do-db=test
#备注:
#server-id 服务器唯一标识,如果有多个从服务器,每个服务器的server-id不能重复,跟IP一样是唯一标识,如果你没设置server-id或者设置为0,则从服务器不会连接到主服务器。
#relay-log 启动MySQL二进制日志,可以用来做数据备份和崩溃恢复,或主服务器挂掉了,将此从服务器作为其他从服务器的主服务器。
#replicate-do-db 指定同步的数据库,如果复制多个数据库,重复设置这个选项即可。若在master端不指定binlog-do-db,则在slave端可用replication-do-db来过滤。
#replicate-ignore-db 不需要同步的数据库,如果有多个数据库,重复设置这个选项即可。
#其中需要注意的是,replicate-do-db和replicate-ignore-db为互斥选项,一般只需要一个即可。
[root@localhost mysql]# service mysql restart
Shutting down MySQL.... SUCCESS!
Starting MySQL. SUCCESS!
3.3マスターサーバーに接続します
#进入mysql数据库
[root@localhost mysql]# mysql -uroot -p
Enter password:
#连接master主服务器
mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154;
#备注:
#master_host对应主服务器的IP地址。
#master_port对应主服务器的端口。
#master_log_file对应show master status显示的File列:master-bin.000001。
#master_log_pos对应show master status显示的Position列:154。
3.4スレーブデータの同期を開始する
#启动slave数据同步
mysql> start slave;
#停止slave数据同步(若有需要)
mysql> stop slave;
3.5スレーブ情報の表示
mysql> show slave status\G;
Slave_IO_RunningとSlave_SQL_Runningはどちらもyesです。これは、同期が成功したことを意味します。
4テスト
(1)メインサーバーでmysqlにログインし、テストデータベースに入り、テストテーブルを作成し、データを挿入します。
ヒント:ここでは、データベース管理ツール(nacicatなど)を使用して操作するのが最適です。
create table hi_tb(id int(3),name char(10));
insert into hi_tb values(001,'bobu');
(2)スレーブサーバーのmysqlにログインし、テストデータベースに入ります
データベースから、hi_tbテーブルも表示され、テーブルに1つのbobuデータがあり、データの同期が成功したことを示しています。
5エラーを解決する
マスター/スレーブ同期の過程で、ステートメントの1つが同期に失敗し、エラーが報告された場合、後続のステートメントは正常に同期されてはなりません。たとえば、マスターデータベースにはデータがありますが、スレーブデータベースにはこのデータがありません。ただし、このデータを削除する操作がマスターデータベースで実行された場合、スレーブデータベースは確実に実行されません。そのようなデータなしでそれを削除することができ、エラーが報告されます。このとき、データベースからのデータ同期が失敗するため、後続の同期ステートメントを実行し続けることはできません。
ここで提供されるソリューションは2つあります。
(1)スレーブデータベースで、SET global sql_slave_skip_counterを使用してイベントをスキップし、このエラーをスキップして、次のイベントグループから実行します。
#在从数据库上操作
mysql > stop slave;
mysql > set global sql_slave_skip_counter=1;
mysql > start slave;
(2)スレーブデータベースで、マスターデータベースに再接続します。この種の操作は、途中の同期ステートメントを直接スキップするため、過去に一部のデータが同期されない可能性がありますが、この種の操作も最後のトリックです。最良の方法は、スレーブデータベースとマスターデータベースのデータ構造とデータを整合させてから、マスタースレーブ同期の操作を再開することです。
#在从数据库上操作
mysql > stop slave;
mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=2050;
mysql > start slave;
#备注
#master_log_file和master_log_pos可能会不同,需要在主数据库中show master status来查看
6まとめ
この時点で、mysqlデータベースのマスター/スレーブ同期が完了します。読み取りと書き込みの分離については、プログラムを介して実装できます。これは、実現のアイデアの簡単な説明です。
メインサーバー上に(対応する権限の必要に応じてセキュリティのために)主に書き込み操作に使用されるデータベースユーザーを作成できます。このユーザーを介してメインデータベースに接続するプログラムでは、書き込み操作にのみ使用され、読み取りは行われません操作。
スレーブサーバー上にデータベースユーザーを作成し(セキュリティのため、selectの読み取り権限のみ)、主に読み取り操作に使用され、プログラムでこのユーザーを介してスレーブデータベースに接続できます。
もちろん、MYSQLのプロキシを完成させ、SQLステートメントのルーティングを実装するコンポーネントを見つけることもできるので、プログラムでどのデータベースが書き込まれ、どのデータベースが読み取られるかに注意を払う必要はありません。
元のリンク:https://blog.csdn.net/qq_15092079/article/details/81672920