この記事では、mysql に関する関連知識を提供します。主に準同期レプリケーション構成に関連する問題を整理します。準同期モードでは、メイン データベース トランザクションは、少なくとも 1 つのスレーブ データベースを確保する必要があります。ログが取得されるまで送信は完了できません。したがって、メイン データベースがダウンした場合でも、送信されたトランザクションはスレーブ データベースに転送され、データが失われないことが保証されます。一緒に見てみましょう。 . 皆様のお役に立てれば幸いです。
推奨学習: mysql ビデオ チュートリアル
序文:
MySQL デフォルト マスター-slave レプリケーションは非同期モードを採用しています。マスター データベースは、送信されたトランザクションがスレーブ データベースに送信されたかどうかを確認する必要がありません。マスター データベースに障害が発生し、マスターとバックアップが切り替わると、マスター データベースによって送信されたトランザクションは、スレーブデータベースで失われる可能性があります。
MySQL 5.7 では、半同期レプリケーション モードがプラグインを通じてサポートされています。半同期モードでは、メイン データベース トランザクションは、ログを受信する前に、少なくとも 1 つのスレーブ データベースがログを受信することを確認する必要があります。したがって、メイン データベースがダウンした場合でも、データが失われないように、送信されたトランザクションはスレーブ データベースに転送されることが保証されます。
準同期:
非同期レプリケーションと比較した準同期レプリケーションのパフォーマンスへの影響は、主にデータの整合性のトレードオフです。これにより、送信する必要性が追加されます。したがって、半同期レプリケーションには、高伝送ネットワークとマスターとスレーブ間の距離が近いことが必要です。ネットワーク伝送が遅い場合や、マスターとスレーブ間の距離が短い場合は、マスターとスレーブが遠すぎると、マスター データベースのパフォーマンスが低下し、準同期レプリケーションがタイムアウトする可能性があります。
準同期レプリケーションのメイン ライブラリとスレーブ ライブラリは次の操作を実行します。
メイン ライブラリに接続すると、レプリケーション システムはメイン ライブラリに準同期レプリケーションがあるかどうかを確認します。オン;
# トランザクションが終了した後完了してリレー ログに書き込まれ、ディスクにフラッシュされた場合 (このトランザクションを完了する必要はありません)、メイン ライブラリに確認を送信できます。トランザクションを受信しました;
指定された時間内にスレーブ ライブラリが確認情報をメイン ライブラリに送信しない場合、メイン ライブラリの準同期レプリケーションはタイムアウトになり、非同期レプリケーションにダウングレードされます。同期スレーブ ライブラリは確認情報をメイン ライブラリに送信でき、メイン ライブラリは自動的に半同期モードにアップグレードします。
# 半同期レプリケーションはマスター ライブラリとスレーブ ライブラリの両方でオンにする必要がありますマスター ライブラリが準同期モードをオンにしない場合、またはマスター ライブラリが準同期モードをオンにしてもスレーブ ライブラリのどれも準同期モードをオンにしない場合でも、マスター/スレーブ レプリケーションは引き続き実行されます。非同期モードを使用します ;
スレーブ データベースの確認を待機しているためにメイン データベース トランザクションの送信がブロックされると、ブロックが終了するまでトランザクションを送信したセッションは返されず、セッションは返されません。メイン データベース トランザクションの送信は、少なくとも 1 つのスレーブ データベースの確認を待つ必要があります。 rpl_semi_sync_master_wait_for_slave_count パラメータを使用して、マスター ライブラリで確認する必要があるスレーブの数を制御できます。デフォルトは 1 です。
カバレッジは非トランザクション テーブルのロールバックでも発生します。非トランザクション テーブルはロールバックされないため、非トランザクション テーブルのロールバックは Congki のログに書き込まれる必要があります。
RPL_SEMI_SYNC_MATER_WAIT_POINT パラメータは、メイン ライブラリのトランザクションを制御するために半同期モードで使用されます。バイナリへの送信、スレーブ ライブラリの同期、およびバイナリ ログのディスクへの同期を行います。マスター ライブラリが同期した後、スレーブ ライブラリが同期するのを待ちます。トランザクションの確認を受信します。スレーブ ライブラリの確認を待った後、マスター ライブラリはトランザクションをストレージ エンジンに送信し、クライアントに戻ります。
after_commit: マスター ライブラリはトランザクションを binlog に書き込み、スレーブ ライブラリを同期し、binlog を同期して、トランザクションをストレージ エンジンに送信します。送信後、マスター ライブラリはスレーブ ライブラリが確認を受け取るのを待ちます。確認を受信した後、オリジンは送信完了をクライアントに返します。
2 つの同期時点には主に次の違いがあります
after_sync では、すべてのクライアントが送信されたトランザクションを同時に確認します。ストレージ エンジンはデータベースからトランザクションを受信したことを確認してから送信されるため、すべてのクライアントは送信されたトランザクションのデータを同時に確認できます。さらに、フェイルオーバーが発生した場合、マスター データベース内のすべての送信済みトランザクションはスレーブ データベースのリレー ログに同期されており、スレーブ データベース内のデータはロスレスです。
クライアント-->MySQLSQL解析-->ストレージ関与-->バイナリログの書き込み-->ACKを待つ-->ストレージコミット-->クライアント(OK)
after_commit では、トランザクションを送信したクライアントは、スレーブ ライブラリがトランザクションを受信したことの確認を待ってから戻る必要がありますが、スレーブ ライブラリの確認前にストレージ エンジンへの送信が完了しているため、他のクライアントはそれより早くなります。フェイルオーバーが発生すると、ストレージ エンジンにコミットされたものの、スレーブ データベースによってコミットされたことがまだ確認されていないトランザクションのソース上で表示されるデータに関連するデータ損失が他のクライアントで発生する可能性があります。 . .
クライアント-->MySQLSQL解析-->ストレージ関与-->バイナリログの書き込み-->ストレージコミット-->ACKを待つ-->クライアント(OK)
##要約すると、デフォルトの after_sync を使用することをお勧めします。 #半同期インストール手順:環境情報:
MySQL バージョン: 5.7.32
アーキテクチャ: 1 つのマスター (192.168.1.110:3306) 2 つのスレーブ (192.168.1.111:3306,192.168.1.111:3307)
binlog:on
binlog_row_image:full
## #binlog_format:row binlog_format:row##マスタースレーブ非同期レプリケーション(ここでは省略)。
準同期レプリケーションは、マルチソース レプリケーション (複数チャネル) をサポートしていません。準同期レプリケーションでは、デフォルト チャネルのみを使用できます。
構成管理では、INSTALLPLUGIN、SET GLOBAL、STOP SLAVE、START SLAVE コマンドおよびスーパー権限 SUPER 権限を使用します。 をインストールする必要がありますが、MySQL Serverでは動的な負荷をサポートするためにMySQL Serverが必要です。has_dynamic_loadingがyesであることを確認する必要があります。
show global variables like'%have_dynamic_loading%';
準同期レプリケーション プラグイン semisync_master および semisync_slave がプラグイン パス plugin_dir に存在することを確認します。ファイル名の接尾辞はプラットフォームによって異なります (たとえば、Unix および Unix の場合は .so が使用されます)。 - のようなシステム、Windows では .dll が使用されます)。
準同期の構成:マスターとスレーブの両方をインストールして、マスターとスレーブの切り替えを防ぎます。
show global variables like '%plugin_dir%';
注: 次のようにインストールが失敗する場合は、最初に libimf をインストールする必要があります。
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
コンポーネントがロードされているかどうかを確認します。
mysql> INSTALLPLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ERROR 1126(HY000): Can't open shared library '/usr/local/mysql/lib/plugin/semisync_master.so' (errno: 22libimf.so: cannot open shared object file: No such fileor directory)
プラグインをインストールすると、準同期に関連するパラメータを表示できるようになります。 show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+----------------------------+----------+--------------------+--------------------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TEMP_TABLE_INFO | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_VIRTUAL | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ngram | ACTIVE | FTPARSER | NULL | GPL |
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
+----------------------------+----------+--------------------+--------------------+---------+
SELECT PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
| rpl_semi_sync_slave | ACTIVE |
+----------------------+---------------+
rpl_semi_sync_master_enabled: マスター ライブラリが準同期をオンにするかどうか。
rpl_semi_sync_master_wait_point: 同期時点 after_commit、after_sync。
rpl_semi_sync_master_wait_for_slave_count: マスター データベース トランザクションの送信後にスレーブ データベースから要求される確認の数。
rpl_semi_sync_master_timeout: マスター ライブラリはスレーブ ライブラリからの確認タイムアウト (ミリ秒) を待機します。デフォルトは 10000 ミリ秒です。待機時間が超過すると、半同期は非同期モードにダウングレードされます。
rpl_semi_sync_master_wait_no_slave:
OFF の場合、メイン ライブラリが (Rpl_semi_sync_master_clients) が (rpl_semi_sync_master_wait_for_slave_count) より小さいことを検出している限り、準同期はすぐに非同期モードに切り替わります。
# が ON の場合、トランザクションがコミットされていないアイドル時間中に、メイン ライブラリが (Rpl_semi_sync_master_clients) が (rpl_semi_sync_master_wait_for_slave_count) 未満であることを検出しても、調整は行われません。トランザクションがタイムアウトになる前に、メイン ライブラリが (rpl_semi_sync_master_wait_for_slave_count) 以上の値を受け取ることが保証されているため、ACK 応答の数を超えた場合、メイン ライブラリは準同期モードのままになります。トランザクション送信フェーズ (メイン ライブラリは ACK を待機します) がタイムアウトすると、半同期モードは非同期モードに変換されます;无论(rpl_semi_sync_master_wait_no_slave)为ON还是OFF,当slave上线到(rpl_semi_sync_master_wait_for_slave_count)值时,master都会自动由异步模式转为半同步模式。
主库开启半同步功能
SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout=10000;
从库开启半同步功能
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
从库对于正在进行的异步复制,需要重启sql_io_thread 线程,才能生效半同步复制
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
主库添加参数到/etc/my.cnf文件
[mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000
从库添加参数到/etc/my.cnf文件
[mysqld] rpl_semi_sync_slave_enabled=1
查看主从是否启用了半同步复制:
主库查询半同步状态Rpl_semi_sync_master_status为on表示主库开启了半同步复制,Rpl_semi_sync_master_clients表示目前有2个半同步的从库。
show global status like 'rpl%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 2 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | | Rpl_semi_sync_slave_status | OFF | +--------------------------------------------+-------+
从库查询半同步状态Rpl_semi_sync_slave_status 为on表示从库开启了半同步复制。
show global status like 'rpl%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 0 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 0 | | Rpl_semi_sync_master_no_times | 0 | | Rpl_semi_sync_master_no_tx | 0 | | Rpl_semi_sync_master_status | OFF | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 0 | | Rpl_semi_sync_master_tx_wait_time | 0 | | Rpl_semi_sync_master_tx_waits | 0 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 0 | | Rpl_semi_sync_slave_status | ON | +--------------------------------------------+-------+
半同步状态检查:
show global status like 'rpl%'; +--------------------------------------------+---------+ | Variable_name | Value | +--------------------------------------------+---------+ | Rpl_semi_sync_master_clients | 2 | | Rpl_semi_sync_master_net_avg_wait_time | 0 | | Rpl_semi_sync_master_net_wait_time | 0 | | Rpl_semi_sync_master_net_waits | 12463 | | Rpl_semi_sync_master_no_times | 1 | | Rpl_semi_sync_master_no_tx | 2739 | | Rpl_semi_sync_master_status | ON | | Rpl_semi_sync_master_timefunc_failures | 0 | | Rpl_semi_sync_master_tx_avg_wait_time | 1030 | | Rpl_semi_sync_master_tx_wait_time | 5075616 | | Rpl_semi_sync_master_tx_waits | 4926 | | Rpl_semi_sync_master_wait_pos_backtraverse | 0 | | Rpl_semi_sync_master_wait_sessions | 0 | | Rpl_semi_sync_master_yes_tx | 5595 | | Rpl_semi_sync_slave_status | OFF | +--------------------------------------------+---------+
Rpl_semi_sync_master_net_avg_wait_time:变量已经废弃,总是等于0。
Rpl_semi_sync_master_net_wait_time:变量已经废弃,总是等于0。
Rpl_semi_sync_master_net_waits:主库等待从库的总次数。
Rpl_semi_sync_master_no_times:主库关闭半同步的总次数,可以用来分析半同步降级为异步的频率次数。
Rpl_semi_sync_master_no_tx:表示半同步事务提交没有接受到从库确认接受的总次数,可以用来分析半同步事务的提交是否存在超时的情况。
Rpl_semi_sync_master_yes_tx: 表示半同步事务提交接受到从库确认接受的总次数。
Rpl_semi_sync_master_timefunc_failures::调用 gettimeofday() 等时间函数失败的次数。
Rpl_semi_sync_master_tx_avg_wait_time:每个事务提交平均等待时间(单位: microseconds ),可以用来分析事务提交性能。
Rpl_semi_sync_master_tx_wait_time:事务总的提交等待时间(单位: microseconds ),可以用来分析事务提交性能。
Rpl_semi_sync_master_tx_waits:事务总的提交等待次数,可以用来分析事务提交性能。
Rpl_semi_sync_master_wait_pos_backtraverse:主库event binary位置低于之前等待event的总次数,当事务开始等待回复的顺序与其二进制日志事件的写入顺序不同时,就会发生这种情况。
Rpl_semi_sync_master_wait_sessions:当前会话等待从库确认接受的个数,可以用来确认分析会话是否存在由于等待从库确认而堵塞的情况。
推荐学习:mysql视频教程
以上がMySQL の準同期レプリケーション構成を要約して整理するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。