mysql主從復(fù)制相關(guān)參數(shù)
--server-id:未指定授滓,默認(rèn)為0的情況類似哀卫;
--replicate-same-server-id:指定主從的uuid相同;
SET @@ auto_increment_increment =10,設(shè)置auto_increment屬性列的步長(zhǎng)划栓;
auto_increment_offset決定了AUTO_INCREMENT列的起始值
在auto_increment_offset大于auto_increment_increment的情況下呢撞,offset值被忽略损姜;
建立原生主從復(fù)制
從機(jī)上面進(jìn)行CHANGE MASTER TO操作庵寞,如下:
CHANGE MASTER TO MASTER_HOST='主節(jié)點(diǎn)IP',MASTER_USER=‘用于復(fù)制的用賬號(hào)',MASTER_PASSWORD='密碼',MASTER_PORT=主節(jié)點(diǎn)端口,MASTER_AUTO_POSITION=1;
從機(jī)上執(zhí)行可執(zhí)行如下操作:
--replicate-*:這類命令只有在從機(jī)起來(lái)后才能夠進(jìn)行設(shè)置;
--log-slave-updates:設(shè)置從寫入執(zhí)行的更新到從自己的binlog薛匪,即A->B->C其中B同時(shí)為主捐川、從的情況
--slave_parallel_workers:設(shè)置從并行回放的線程數(shù)
--slave-parallel-type:當(dāng)使用多線程并行回放時(shí),用于指定哪類事務(wù)被執(zhí)行逸尖,其取值可分為:LOGICAL_CLOCK古沥,mysql5.6及之前版本只支持庫(kù)級(jí)別的并行回放;
在設(shè)置了slave_preserve_commit_order=1的情況下娇跟,只能夠使用 LOGICAL_CLOCK岩齿;
mysql5.7多線程并行復(fù)制
需要在從節(jié)點(diǎn)上執(zhí)行如下設(shè)置
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-type=DATABASE #兼容MySQL 5.6基于schema級(jí)別的并發(fā)復(fù)制
slave-parallel-workers=4 #開啟多線程復(fù)制
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
從節(jié)點(diǎn)中途宕機(jī)
從I/O 線程中恢復(fù)過(guò)來(lái)的信息存于表 mysql.slave_master_info中;
從SQL 線程中恢復(fù)過(guò)來(lái)的信息存于表 mysql.slave_relay_log_info中苞俘;
在GTID模式下盹沈,從機(jī)使用多線程進(jìn)行回放
場(chǎng)景1:MASTER_AUTO_POSITION開啟,設(shè)置 relay_log_recovery=0. 其他變量降不會(huì)影響恢復(fù)吃谣;
場(chǎng)景2:用位置點(diǎn)進(jìn)行復(fù)制乞封,建議設(shè)置 relay_log_recovery=1,sync_relay_log=1(多線程), 及relay_log_info_repository=TABLE.sync_relay_log=1表示每一個(gè)事務(wù)都會(huì)被刷到relay log中;
數(shù)據(jù)可能出現(xiàn)的不一致的情況
場(chǎng)景1 半回放
一個(gè)事務(wù)更新非事務(wù)表岗憋,部分?jǐn)?shù)據(jù)已經(jīng)被更新肃晚;
場(chǎng)景2 間隙gaps
一個(gè)事務(wù)沒有被完全回放完,后面的事務(wù)提前回放了仔戈;
消除這種gaps的方法:設(shè)置slave_preserve_commit_order=1关串,這同時(shí)要求 slave_parallel_type=LOGICAL_CLOCK, 并且使能log-bin 和log-slave-update.
場(chǎng)景3 Gap-free low-watermark position
多線程復(fù)制可能產(chǎn)生gtid gap和Gap-free low-watermark position,這會(huì)導(dǎo)致Salve上重復(fù)已經(jīng)回放過(guò)的event监徘。后果就是數(shù)據(jù)不一致或者復(fù)制中斷晋修,除非設(shè)置binlog格式為row模式并且設(shè)置slave_exec_mode=IDEMPOTENT和slave_exec_mode=IDEMPOTENT,允許Slave回放binlog時(shí)忽略重復(fù)鍵和找不到鍵的錯(cuò)誤凰盔,使得binlog回放具有冪等性墓卦,但這也意味著如果真的出現(xiàn)了主備數(shù)據(jù)不一致也會(huì)被它忽略。
多線程復(fù)制還會(huì)存在一個(gè)問題:已經(jīng)事務(wù)已經(jīng)提交廊蜒,但是位置還沒更新趴拧;
在基于logical_clock的MTS場(chǎng)景下,用戶可以通過(guò)配置參數(shù)slave_preserve_commit_order=1 來(lái)保證提交的順序性山叮;參見官網(wǎng):數(shù)據(jù)一致性的分析討論著榴,參見鏈接