====== 09 Galera + innodb_flush_log_at_trx_commit ======
INNODBのパラメータ innodb_flush_log_at_trx_commit を変更すると、パフォーマンスが飛躍的にアップする。
またGaleraで冗長性が保たれている場合innodb_flush_log_at_trx_commitを変更するとどうなるかテスト
[[http://qiita.com/kkyouhei/items/d2c40d9e3952c7049ca3|参考サイト]]
===== パラメータについて =====
innodb_flush_log_at_trx_commitは0,1,2の3つの値があり、1が初期値です。
パラメータは動的に設定可能です。
^設定値^ ログバッファ->ログファイル(wal)^Diskへフラッシュ^備考^
|0|毎秒| 毎秒|mysqldのプロセスがクラッシュすると、最後の秒のトランザクションが消される場合があります。|
|1 (default)|commit時|commit時|OS、あるいはハードウェアの問題によってフラッシュが行われない場合、トランザクションの耐久力が保障されない可能性があります。|
|2|commit時|毎秒|OSのクラッシュや停電が起こると、最後の秒のトランザクションが消されてしまいます。|
===== 1.パフォーマンス試験 =====
[[01_linux:11_データベース:01_mysql:51_mysqlslap|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.障害試験 =====
[[http://planet.mysql.com/entry/?id=2182281|参考:Galera + innodb_flush_log_at_trx_commit]]
結論から言うと、Galeraでinnodb_flush_log_at_trx_commit=2の場合
全ノードが同時にOSダウンする場合(電源障害など)以外ではデータロストしない。
innodb_flush_log_at_trx_commit=0でも、全ノード同時にmysqlで問題が発生する時以外問題ない。。。はず
[[http://www.nkjmkzk.net/?p=60|参考: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)
{{tag>mysql innodb Galera}}