ユーザ用ツール

サイト用ツール


サイドバー

このページの翻訳:



最近の更新



Tag Cloud

01_linux:11_データベース:01_mysql:09_galera_innodb_flush_log_at_trx_commit

09 Galera + innodb_flush_log_at_trx_commit

INNODBのパラメータ innodb_flush_log_at_trx_commit を変更すると、パフォーマンスが飛躍的にアップする。
またGaleraで冗長性が保たれている場合innodb_flush_log_at_trx_commitを変更するとどうなるかテスト

参考サイト

パラメータについて

innodb_flush_log_at_trx_commitは0,1,2の3つの値があり、1が初期値です。
パラメータは動的に設定可能です。

設定値 ログバッファ→ログファイル(wal)Diskへフラッシュ備考
0毎秒 毎秒mysqldのプロセスがクラッシュすると、最後の秒のトランザクションが消される場合があります。
1 (default)commit時commit時OS、あるいはハードウェアの問題によってフラッシュが行われない場合、トランザクションの耐久力が保障されない可能性があります。
2commit時毎秒OSのクラッシュや停電が起こると、最後の秒のトランザクションが消されてしまいます。

1.パフォーマンス試験

mysqlslap でベンチマークを計ってみる。
書き込み回数が減る分パフォーマンスが上がる

innodb_flush_log_at_trx_commit=1

# mysqlslap --no-defaults --concurrency=20 --iteration=1 --engine=innodb --number-int-cols=10 --number-char-cols=10 --auto-generate-sql --auto-generate-sql-load-type=update --auto-generate-sql-write-number=1000 --number-of-queries=1000 --user=root -p
Enter password: 

Benchmark
	Running for engine innodb
	Average number of seconds to run all queries: 32.026 seconds
	Minimum number of seconds to run all queries: 32.026 seconds
	Maximum number of seconds to run all queries: 32.026 seconds
	Number of clients running queries: 20
	Average number of queries per client: 50

innodb_flush_log_at_trx_commit=2

# mysqlslap --no-defaults --concurrency=20 --iteration=1 --engine=innodb --number-int-cols=10 --number-char-cols=10 --auto-generate-sql --auto-generate-sql-load-type=update --auto-generate-sql-write-number=1000 --number-of-queries=1000 --user=root -p
Enter password: 

Benchmark
	Running for engine innodb
	Average number of seconds to run all queries: 23.225 seconds
	Minimum number of seconds to run all queries: 23.225 seconds
	Maximum number of seconds to run all queries: 23.225 seconds
	Number of clients running queries: 20
	Average number of queries per client: 50

2.障害試験

参考:Galera + innodb_flush_log_at_trx_commit

結論から言うと、Galeraでinnodb_flush_log_at_trx_commit=2の場合
全ノードが同時にOSダウンする場合(電源障害など)以外ではデータロストしない。
innodb_flush_log_at_trx_commit=0でも、全ノード同時にmysqlで問題が発生する時以外問題ない。。。はず

参考:innodb_flush_log_at_trx_commit検証

検証結果

クライアントから、数千のトランザクションを発行しながら、mysqlやOSを異常終了させてみる。

片方のノードでmysqlをシャットダウン

シャットダウンの場合は、特にデータ差異は発生しない。
※VIPを持ってないノードをシャットダウンした場合は、
データ書き込みが止まる訳ではないので、PrimaryとSecondaryでデータ数の差が発生します。(正常動作)

片方のmysqlをkillしてみる。

(OSの異常終了でも同様)
walからファイルへの書き込み(1秒分)が書き込まれてない状態となる。
これはPrimary側からデータの復旧が可能です。
※共にクライアントが書き込みをcommitした分までは、正常な方にデータが書き込まれている。

1.Primaryのmysqlをkill
-Primary
| 3688 | AAAA |
| 3689 | AAAA |
| 3690 | AAAA |
+------+------+
3691 rows in set (0.00 sec)

-Secondary
| 3689 | AAAA |
| 3690 | AAAA |
| 3691 | AAAA |
+------+------+
3692 rows in set (0.01 sec)
2.Secondaryのmysqlをkill
-Primary
|  3889 | AAAA |
|  3890 | AAAA |
|  3891 | AAAA |
+-------+------+
17985 rows in set (0.02 sec)

-Secondary
|  3881 | AAAA |
|  3882 | AAAA |
|  3883 | AAAA |
+-------+------+
17977 rows in set (0.03 sec)
01_linux/11_データベース/01_mysql/09_galera_innodb_flush_log_at_trx_commit.txt · 最終更新: 2016/05/27 13:37 by matsui