MySQL 不停機(jī)不鎖表主從搭建
MySQL主從搭建分幾種場(chǎng)景
- 無(wú)業(yè)務(wù)數(shù)據(jù),初始化搭建
- 有業(yè)務(wù)數(shù)據(jù),臨時(shí)擴(kuò)展
初始化的搭建很簡(jiǎn)單,不涉及數(shù)據(jù)業(yè)務(wù),所以鎖表、停機(jī)等都不影響,但是更多時(shí)候是業(yè)務(wù)到一定階段,才會(huì)涉及到橫向擴(kuò)展,需要做主從,讀寫分離等來(lái)提升服務(wù)性能
這個(gè)時(shí)候,數(shù)據(jù)業(yè)務(wù)不能中斷,又需要快速進(jìn)行擴(kuò)展提升性能,只能在不停機(jī)、不停服務(wù)的情況下擴(kuò)展,就需要用到下面介紹的這種方法來(lái)做數(shù)據(jù)庫(kù)主從
當(dāng)然還是有前提條件,如果你原本MySQL連binlog及server_id都這種基礎(chǔ)配置都沒(méi)做,那也談不上不停機(jī)配置主從
原理
不停機(jī)實(shí)現(xiàn)主從搭建的關(guān)鍵點(diǎn)就是以下兩個(gè)參數(shù):
- --single-transaction
- --master-data
master-data參數(shù)主要用來(lái)記錄主庫(kù)的binlog_file和pos,它有兩個(gè)值,分別是:
1:在mysqldump過(guò)程中,將binlogfile和pos信息記錄在sql中,并且不是以注釋信息的方式記錄,這樣在執(zhí)行導(dǎo)入的時(shí)候自動(dòng)執(zhí)行這部分信息
2:在mysqldump過(guò)程中,將binlogfile和pos信息以注釋的方式記錄在sql中
single-transaction參數(shù)則是通過(guò)提交單一事務(wù)來(lái)確保數(shù)據(jù)一致性,通過(guò)在FLUSH TABLES WITH READ LOCK 后添加START TRANSACTION 語(yǔ)句,開(kāi)啟單一事務(wù),此時(shí)加鎖,僅僅是為了獲取準(zhǔn)確的master-data中的binlogfile和pos信息,在開(kāi)啟事務(wù)后,鎖已經(jīng)釋放了,所以對(duì)業(yè)務(wù)影響很小
通過(guò)以上兩個(gè)參數(shù),可以在不長(zhǎng)時(shí)間鎖表的情況下獲取準(zhǔn)確的binlogfile和pos信息,從而完成主從配置
實(shí)戰(zhàn)
導(dǎo)出數(shù)據(jù)
從主庫(kù)通過(guò)mysqldump導(dǎo)出數(shù)據(jù)
- mysqldump -uroot -ppassword --single-transaction --master-data=2 --databases db1 db2 xxx > databases.sql
打包壓縮
- tar -zcvf databases.sql.tar.gz databases.sql
復(fù)制到從庫(kù)
- scp databases.sql.tar.gz root@slave_ip:/data/sql/
后面的操作在從庫(kù)進(jìn)行
解壓
- tar -zxvf databases.sql.tar.gz
導(dǎo)入數(shù)據(jù)
- source /path_to/databases.sql.tar.gz
配置主從同步參數(shù)
- change master to master_host='ip',master_user='slave',master_port=port,master_password='password',master_log_file='mysql-bin.file',master_log_pos=POS;
其中master_log_file和master_log_pos就是上面通過(guò)master-data=2參數(shù)導(dǎo)出的,在sql文件里面開(kāi)頭部分
啟動(dòng)slave同步
- start slave;
查看同步狀態(tài)
- show slave status\G;
通過(guò)這種方法,可以在不停止業(yè)務(wù)的情況下,保證數(shù)據(jù)一致性的同時(shí),快速擴(kuò)展從庫(kù)