====== 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}}