ずいぶん時間が空いてしまったが、
MariaDBのHAで続きが出来たので、
記載します。
前回、負荷試験前でありましたが、
諸々実施後、以下の問題点が出てきました。
- 秒間300コミットを超えると、slaveが遅延する
- slave遅延により、Semiレプリケーションが外れる
秒間300コミット以上の場合は、
slave側で、innodb_flush_log_at_trx_commitを2にしないと追いつけなくなる。
これで秒間600コミットくらいまで耐えれるが、それ以上である場合、0にしないとダメであった。
同時に、Semiレプリケーションが外れて、通常レプリケーションとなると、
レプリケーションによるfailoverでのロスト率が高まってしまうため、
rpl_semi_sync_master_timeoutを1500ミリ秒に設定した。
同時に、slaveのデータ保全性を高めるため、
rpl_semi_sync_master_wait_pointにAFTER_SYNCを設定した(いわゆるロスレスレプリケーション)。
さらに、slaveの更新性能をアップするため、
- slave_parallel_threads
というMariaDB特有のパラメータを設定した。
slave_parallel_threadsの特徴は、MariaDBではグループコミットという機能があり、
MySQLの並列レプリケーションよりも細かい粒度で書き込みをまとめることが出来る。
そんなこんなで出来上がった設定は以下の通り。
ちなみに、16CORE/104GBの仮想マシンです。
########## # mysqld ########## [mysqld] # -------------------------------------------------- # base # -------------------------------------------------- user=mysql bind-address=0.0.0.0 port=3306 pid-file=/var/run/mysqld/mysqld.pid datadir=/var/lib/mysql socket =/var/lib/mysql/mysql.sock symbolic-links=0 sql_mode=TRADITIONAL default-storage-engine=InnoDB transaction-isolation=READ-COMMITTED character-set-server=utf8mb4 collation-server=utf8mb4_general_ci skip-character-set-client-handshake=0 innodb_buffer_pool_load_at_startup=1 innodb_buffer_pool_dump_at_shutdown=1 innodb-defragment=1 innodb_fast_shutdown=0 thread_pool_max_threads=1000 thread_handling=pool-of-threads extra_port=3307 extra_max_connections=10 # -------------------------------------------------- # replication # -------------------------------------------------- server-id=1 binlog_format=row log-bin=mysql-bin max_binlog_size=128M sync_binlog=1 expire_logs_days=2 innodb_flush_log_at_trx_commit=1 innodb_autoinc_lock_mode=2 plugin-load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1500 rpl_semi_sync_slave_enabled=1 rpl_semi_sync_master_wait_point=AFTER_SYNC log-slave-updates relay_log_recovery=1 slave_parallel_threads=8 # -------------------------------------------------- # network # -------------------------------------------------- max_connections=7200 max_connect_errors=999999999 connect_timeout=10 max_allowed_packet=10M back_log=1024 # -------------------------------------------------- # logging # -------------------------------------------------- log_output=FILE log_warnings=1 log_error=/var/log/mysql/error.log slow_query_log=1 long_query_time=0.5 slow_query_log_file=/var/log/mysql/slow.log innodb_file_per_table=1 innodb_log_buffer_size=16M # -------------------------------------------------- # cache, memory # -------------------------------------------------- query_cache_size=0 max_heap_table_size=32M tmp_table_size=32M thread_cache_size=2400 innodb_buffer_pool_size=72G innodb_flush_neighbors=0 innodb_read_ahead_threshold=0 innodb_log_file_size=4G innodb_buffer_pool_instances=16 innodb_lru_scan_depth=2048 # -------------------------------------------------- # IO # -------------------------------------------------- innodb_read_io_threads=16 innodb_write_io_threads=16 innodb_io_capacity=5000 innodb_io_capacity_max=20000 innodb_open_files=2048 innodb_purge_threads=4 innodb_sync_array_size=32 # -------------------------------------------------- # query # -------------------------------------------------- sort_buffer_size=4M read_rnd_buffer_size=2M read_buffer_size=512K join_buffer_size=512K ########## # mysqldump ########## [mysqldump] default-character-set=utf8mb4 max_allowed_packet=1G ########## # mysql ########## [mysql] default-character-set=utf8mb4 ########## # mysqld-safe ########## [mysqld_safe] log-error=/var/log/mysql/error.log
あとは、maxscaleで各種イベントを拾った時、
slave側には、以下のクエリーを投げてやることにした。
set global read_only = 1; set global innodb_flush_log_at_trx_commit = 0;
これで、slave側も秒間1000コミット近く耐えらる。
コメントがあればどうぞ