web-dev-qa-db-ja.com

スレーブサーバーでのMySQL非同期レプリケーションの最大IOPSはありますか?

私はこの問題にしばらく取り組んでいます。両方のシステムにMySQL 8.0.15がインストールされた単純なマスター/スレーブセットアップがあります。日常の操作では、スレーブは問題なくマスターを維持しますが、残念ながら私たちのネットワークでは、2つのサーバー間の接続が数時間以上ダウンすることがあります。これが発生し、接続が最終的に復旧すると、リレーログがスレーブに期待される速度(ネットワーク速度)で書き込まれているように見えますが、これらのログをMySQLデータベースに適用すると、物理ディスクの能力が十分に発揮されません。 。

RAMと割り当てられたCPUの上限もありません。スレーブでレプリケーションが追いつくと、ディスクは約600KB/sに達しますが、通常の操作(Windows操作)ではこれらのSSDは500MB /秒以上に到達します。これらはより「ランダム」な書き込みであることはわかっていますが、これほどのパフォーマンスの低下は予期していませんでした。これは、実際に、仕様の回転ディスクのみを使用する同様の設定と同じ速度ですはるかに少ないIOPS。

ハードウェア/ソフトウェアはマスターとスレーブで同じです。データパーティションは、SSDの別のRAID-10でOSとアプリケーションが別のRAID 1、64GB RAM、88 'CPUでセットアップされ、どちらもWindows 2016を実行しています。 MySQL 8.0.15、およびそれらは同様の構成ファイルを使用しています。これは私が現在使用している起動設定です:

[クライアント]
ポート= 3306
default-character-set = utf8
[mysql]
ビープ音なし
default-character-set = utf8
[mysqld]
ポート= 3306
datadir = "W:/ Data"
character-set-server = utf8
default_authentication_plugin = mysql_native_password
default-storage-engine = INNODB
sql-mode = "STRICT_TRANS_TABLES、NO_ENGINE_SUBSTITUTION"
log-output = FILE
general-log = 0
general_log_file = "S:/general.log"
slow-query-log = 1
slow_query_log_file = "S:/slow.log"
long_query_time = 10
log-bin = "S:/ bin"
log-error = "S:/error.log"
server-id = 10
lower_case_table_names = 1
secure-file-priv = ""
loose-local-infile = 1
max_connections = 500
table_open_cache = 2000
tmp_table_size = 7G
thread_cache_size = 48
myisam_max_sort_file_size = 100G
myisam_sort_buffer_size = 12G
key_buffer_size = 11M
read_buffer_size = 64K
read_rnd_buffer_size = 256K
innodb_data_home_dir = "W:/データ"
innodb_flush_log_at_trx_commit = 1
innodb_thread_concurrency = 0
innodb_autoextend_increment = 64
innodb_buffer_pool_instances = 8
innodb_log_buffer_size = 120M
innodb_buffer_pool_size = 50G
innodb_log_file_size = 15G
innodb_concurrency_tickets = 5000
innodb_old_blocks_time = 1000
innodb_open_files = 1000
innodb_stats_on_metadata = 0
innodb_file_per_table = 1
innodb_checksum_algorithm = 0
back_log = 80
flush_time = 0
join_buffer_size = 1M
max_allowed_pa​​cket = 1G
slave_max_allowed_pa​​cket = 1G
max_connect_errors = 2147483648
open_files_limit = 4161
sort_buffer_size = 2M
table_definition_cache = 1400
binlog_row_event_max_size = 8K
sync_master_info = 10000
sync_relay_log = 10000
sync_relay_log_info = 10000
loose_mysqlx_port = 33060

レプリケーション

replicate-same-server-id = 0
sync_binlog = 1
gtid-mode = ON
enforce-gtid-consistency = true

スレーブ最適化

slave-parallel-type = LOGICAL_CLOCK
slave-parallel-workers = 88
slave-compressed-protocol = ON
log-slave-updates = 0
binlog-group-commit-sync-delay = 4000
binlog-group-commit-sync-no-delay-count = 5
binlog-row-image = MINIMAL
binlog-format = STATEMENT

すべてのデータベースはinnodbテーブルのみを使用します。私は自分の研究からオンラインでさまざまな最適化を試みました。私はスレーブ並列設定とさまざまなinnodb設定を調整しようとしましたが、スレーブが追いついているとき、それらのどれもディスクのスループットに影響を与えていないようです。私が調整する必要がある何か、またはこれをトラブルシューティングする方法についての推奨事項が誰かに表示されますか?それとも、ハードウェアとソフトウェアのどちらを見る必要があると考えていても、ありがとうございました!

さらに情報が必要な場合はお知らせください。

1
Josh

スレーブの即時修正

SET GLOBAL innodb_flush_log_at_trx_commit = 2;

これはスレーブを少しスピードアップするはずです。

スレーブのmy.cnfに移動して追加します

[mysqld]
innodb_flush_log_at_trx_commit = 2
innodb_flush_method=O_DIRECT

mysqldを再起動します。

詳細については、以前の投稿 innodb_flush_log_at_trx_commitへの動的な変更 を参照してください。

0
RolandoMySQLDBA