ホームページ >データベース >mysql チュートリアル >MySQL レプリケーションで並列レプリケーションを実装する方法
ご存知のとおり、MySQL バージョン 5.6 より前は、MySQL のスレーブ ノードには 2 つのスレッドがありました。マスター/スレーブ レプリケーション、それぞれ I/O スレッドと SQL スレッド。
#I/O スレッドは、バイナリ ログからイベントを受信し、それをリレー ログに書き込む役割を果たします。
SQL スレッドはリレー ログを読み取り、データベースで再生します。
上記の方法では遅延が発生する場合がありますが、マスター ノードとスレーブ ノードの間で遅延が発生する可能性がある状況はどのような場合ですか?
1 .メイン データベースは大規模なトランザクション (大規模なテーブル構造の変更など) を実行します。
2. メイン データベースに対する大規模な変更 (大規模な挿入、更新、削除操作など)。
3. ROW 同期モードでは、メイン データベース内の大きなテーブルの主キーは頻繁には更新されません。
4. データベース パラメータの設定が不合理で、スレーブ ノードのパフォーマンスにボトルネックがあります (例: スレーブ ノードのトランザクション ログ設定が小さすぎるため、頻繁にディスク フラッシュが発生します)。
5. ネットワーク環境が不安定で、ノード IO スレッドからのバイナリログの読み取りに遅延や再接続が発生します。
6. マスターとスレーブのハードウェア構成が異なり、スレーブノードのハードウェアリソース使用量が上限に達しています。 (例: マスターノードの SSD ディスク、スレーブノードの SAS ディスク)
上記の遅延の理由は大まかに分類できます。
1. ハードウェアの問題 (ディスク IO、ネットワーク IO など)
2. 構成の問題。
上記の理由を分析した結果、マスター/スレーブ遅延を削減するには、ハードウェア条件を改善することに加えて、次のことがわかります。 DBA はデータベースの設計や構成の問題にも注意を払う必要があります。最後に、スレーブ ノードの同時処理能力を向上させる必要があります。シングル スレッドの再生からマルチスレッドの並列再生に変更する方が良い方法です。重要な点は、マルチスレッド回復を前提としたデータ競合と障害回復場所をどのように解決するかです。クリックして質問を確認します。MySQL5.6 ライブラリ レベルに基づく並列レプリケーション
インスタンス内に複数のデータベースがある場合、複数のスレッドを開始でき、各スレッドが 1 つのデータベースに対応します。 。このモードでは、スレーブ ノードは複数のスレッドを開始します。スレッドは、Coordinator
と
WorkThreadの 2 つのカテゴリに分類されます。
コーディネータースレッドは、トランザクションが実行できるかどうかを決定する責任があります。並列実行できる場合は、トランザクションを
WorkThread スレッドに振り分けて実行します
DDL など、実行できないと判断した場合は、
クロスライブラリ操作などは、すべてのワーカースレッドが実行されるまで待機し、その後、
Coordinatorによって実行されます。
slave-parallel-type=DATABASE
MySQL5.7 グループ送信に基づく並列レプリケーショングループ送信手順簡単に言うと、double 1 設定の下で、トランザクション後につまり、ディスク ブラッシングの動作を変更し、複数のトランザクションをトランザクションのグループにマージし、統合されたディスク ブラッシングを実行することで、ディスク IO の負荷を軽減します。詳細については、
https://mp.weixin.qq.com/s/rcPkrutiLc93aTblEZ7sFgsequence_number
を参照してください。 #一グループトランザクションを同時に投入するということは、グループ内のトランザクションに競合がないことを意味するため、グループ内のトランザクションをスレーブノード上で同時に実行することができます。同じグループなので、binlog に 2 つの新しいものが表示されます。 パラメーター情報
last_committed
および
トランザクションがグループに属しているかどうかを確認するにはどうすればよいですか?
バイナリログを解析すると、さらに 2 つのパラメータ情報、
last_committedがあることがわかります。そのうち# この値は、トランザクション送信のシーケンス番号を指し、単調増加します。last_committed
sequence_numberが重複しています。
last_committed
[root@mgr2 GreatSQL]# mysqlbinlog mysql-bin.0000002 | grep last_committed GTID last_committed=0 sequence_number=1 GTID last_committed=0 sequence_number=2 GTID last_committed=2 sequence_number=3 GTID last_committed=2 sequence_number=4 GTID last_committed=2 sequence_number=5 GTID last_committed=2 sequence_number=6 GTID last_committed=6 sequence_number=7 GTID last_committed=6 sequence_number=8
データベース構成slave-parallel-type=LOGICAL_CLOCK
基于组提交的同步有个不足点,就是当主节点的事务繁忙度较低的时候,导致时间段内组提交fsync刷盘的事务量较少,于是导致从库回放的并行度并不高,甚至可能一组里面只有一个事务,这样从节点的多线程就基本用不到,可以通过设置下面两个参数,让主节点延迟提交。
binlog_group_commit_sync_delay # 等待延迟提交的时间,binlog提交后等待一段时间再 fsync。让每个 group 的事务更多,人为提高并行度。
binlog_group_commit_sync_no_delay_count # 待提交的最大事务数,如果等待时间没到,而事务数达到了,就立即 fsync。达到期望的并行度后立即提交,尽量缩小等待延迟。
writeset 基于事务结果冲突进行判断事务是否可以进行并行回放的方法,他由
binlog-transaction-dependency-tracking
参数进行控制,默认采用WRITESET
方法。
Command-Line Format | --binlog-transaction-dependency-tracking=value |
---|---|
System Variable | binlog_transaction_dependency_tracking |
Scope | Global |
Dynamic | Yes |
SET_VAR Hint Applies | No |
Type | Enumeration |
Default Value | COMMIT_ORDER |
Valid Values | COMMIT_ORDER WRITESET WRITESET_SESSION |
COMMIT_ORDER
# 使用 5.7 Group commit 的方式决定事务依赖。
WRITESET
# 使用写集合的方式决定事务依赖。
WRITESET_SESSION
# 使用写集合,但是同一个session中的事务不会有相同的last_committed。
writeset 是一个HASH类型的数组,里面记录着事务的更新信息,通过
transaction_write_set_extraction
判断当前事务更新的记录与历史事务更新的记录是否存在冲突,判断过后再采取对应处理方法。writeset储存的最大存储值由binlog-transaction-dependency-history-size
控制。
需要注意的是,当设置成
WRITESET
或WRITESET_SESSION
的时候,事务提交是无序状态的,可以通过设置slave_preserve_commit_order=1
强制按顺序提交。
binlog_transaction_dependency_history_size
设定一个上限,限制在内存中缓存之前事务修改的行信息时所使用的行哈希数。一旦达到这个哈希数,就会清除历史记录。
Command-Line Format | --binlog-transaction-dependency-history-size=# |
---|---|
System Variable | binlog_transaction_dependency_history_size |
Scope | Global |
Dynamic | Yes |
SET_VAR Hint Applies | No |
Type | Integer |
Default Value | 25000 |
Minimum Value | 1 |
Minimum Value | 1000000 |
transaction_write_set_extraction
该模式支持三种算法,默认采用XXHASH64,当从节点配置writeset复制的时候,该配置不能配置为OFF。在MySQL 8.0.26中,该参数已被标记为已弃用,将来将被删除。
Command-Line Format | --transaction-write-set-extraction[=value] |
---|---|
Deprecated | 8.0.26 |
System Variable | binlog_transaction_dependency_history_size |
Scope | Global, Session |
Dynamic | Yes |
SET_VAR Hint Applies | No |
Type | Enumeration |
Default Value | XXHASH64 |
Valid Values | OFF MURMUR32 XXHASH64 |
数据库配置
slave_parallel_type = LOGICAL_CLOCK slave_parallel_workers = 8 binlog_transaction_dependency_tracking = WRITESET slave_preserve_commit_order = 1
以上がMySQL レプリケーションで並列レプリケーションを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。