mysql df_MySQL主从复制实战
什么是主從復(fù)制
使用兩個或兩個以上的數(shù)據(jù)庫,一部分?jǐn)?shù)據(jù)庫當(dāng)做主數(shù)據(jù)庫,而另一部分?jǐn)?shù)據(jù)庫當(dāng)做從數(shù)據(jù)庫。系統(tǒng)在主數(shù)據(jù)庫中進(jìn)行寫操作,從數(shù)據(jù)庫記錄在主庫上所有的寫操作,使得主從數(shù)據(jù)庫的數(shù)據(jù)保持一致。
一旦主數(shù)據(jù)庫出現(xiàn)問題時,使用從數(shù)據(jù)庫代替主數(shù)據(jù)庫,可以避免服務(wù)中斷。
什么是讀寫分離
讀寫分離是基于主從復(fù)制的。系統(tǒng)操作數(shù)據(jù)庫中的數(shù)據(jù)時,將對數(shù)據(jù)的增刪改也就是寫操作,發(fā)送到主數(shù)據(jù)庫,將查詢的任務(wù)交給從數(shù)據(jù)庫。
寫操作一般相比讀操作更耗時,而系統(tǒng)在大多數(shù)情況下都是讀多寫少。進(jìn)行讀寫分離,減少讀寫操作相互影響,既能提高查詢效率,也能減輕主數(shù)據(jù)庫的壓力,提高系統(tǒng)性能。
主從復(fù)制原理
下圖為網(wǎng)上找的一張介紹主從復(fù)制的原理圖。
簡單來講,有以下四個關(guān)鍵點(diǎn):
1、主數(shù)據(jù)庫開啟bin-log,將所有寫操作的sql語句記錄到日志文件中。
2、每當(dāng)有從庫連接到主庫的時候,主庫都會創(chuàng)建一個線程(master bin-log輸出線程),用于發(fā)送bin-log內(nèi)容到從庫。
3、從數(shù)據(jù)庫開啟中繼日志relay-log,用于同步回來的主數(shù)據(jù)庫bin-log。
4、從數(shù)據(jù)庫中運(yùn)行2個線程,一個線程(slave
I/O線程)連接到主庫,獲取主數(shù)據(jù)庫bin-log日志文件里的SQL,記錄到本機(jī)的中繼日志relay-log文件里,另一個線程(slave
SQL線程)執(zhí)行本機(jī)relay-log文件里的SQL語句,在從數(shù)據(jù)庫重新執(zhí)行一遍數(shù)據(jù)操作,保持主從數(shù)據(jù)庫的數(shù)據(jù)一致。
復(fù)制模式介紹
異步復(fù)制
說明:MySQL默認(rèn)的復(fù)制模式。主庫在執(zhí)行完客戶端提交的事務(wù)后,立即將結(jié)果返回給客戶端,而不等待從庫接收處理。
問題:一旦主數(shù)據(jù)庫宕機(jī),已經(jīng)提交的事務(wù)可能并沒有傳到從數(shù)據(jù)庫上,此時如果進(jìn)行主備切換,會導(dǎo)致新主庫上的數(shù)據(jù)不完整,犧牲了數(shù)據(jù)的一致性。
全同步復(fù)制
說明:當(dāng)主庫和從庫執(zhí)行完客戶端提交的事務(wù)后,才返回結(jié)果給客戶端。
問題:雖然保證了在任何情況下的數(shù)據(jù)一致性,當(dāng)由于需要等待所有數(shù)據(jù)庫執(zhí)行完該事務(wù)才能返回結(jié)果,操作耗時長,犧牲了性能。
半同步復(fù)制
說明:主庫在執(zhí)行完客戶端提交的事務(wù)后,等待至少一個從庫接收到并寫到中繼日志后,才返回結(jié)果給客戶端。
相對于異步復(fù)制和半同步復(fù)制,是保證數(shù)據(jù)一致性和性能的折中方案。需要注意的是,半同步需要等待從庫響應(yīng),因此對于網(wǎng)絡(luò)要求高,僅適用于低延時的網(wǎng)絡(luò)。
主從復(fù)制方案
下圖為常見的主從復(fù)制的方案。
一主一從:從機(jī)可以作為數(shù)據(jù)的熱備,當(dāng)主節(jié)點(diǎn)宕機(jī),備節(jié)點(diǎn)頂替。但需要注意的是,并不能代替數(shù)據(jù)備份,因?yàn)殄e誤的操作,也會同步到備節(jié)點(diǎn),數(shù)據(jù)仍會丟失。
一主多從:適用于讀多寫少的系統(tǒng),但從庫不可過多,過多會導(dǎo)致響應(yīng)速度變慢。可以指定一個從庫作為備用庫,當(dāng)主節(jié)點(diǎn)宕機(jī),備節(jié)點(diǎn)頂替。也可以指定一個從庫,將報(bào)表統(tǒng)計(jì)之類的慢查詢語句都發(fā)到該從庫,不至于影響其他查詢操作。也可以指定一個從庫,供開發(fā)人員排障使用,即使不小心刪除數(shù)據(jù),也不至于影響整體系統(tǒng)業(yè)務(wù)數(shù)據(jù)準(zhǔn)確性,達(dá)到隔離效果。
雙主:當(dāng)大部分業(yè)務(wù)都為寫,而寫入性能還不夠理想,可以采取雙主模式。同時在兩個主庫寫數(shù)據(jù),并互相同步。業(yè)務(wù)上可以通過id取模、哈希計(jì)算等方法,奇數(shù)往主庫1插數(shù)據(jù),偶數(shù)往主庫2插數(shù)據(jù),保證主鍵不重復(fù)。
級聯(lián)同步:為了減低主庫的壓力,主庫只向一個從庫同步數(shù)據(jù),其他從庫同步這個從庫的數(shù)據(jù)。如果主庫宕機(jī),同步主庫的從庫可以直接作為主庫使用。但如果這個從庫掛了,問題會比較嚴(yán)重,會導(dǎo)致其他從庫變?yōu)楣聝汗?jié)點(diǎn)。
環(huán)形多主:性能強(qiáng),但一旦掛了一個,會導(dǎo)致整個系統(tǒng)不可用。
使用Docker 搭建MySQL主從復(fù)制
以下演示使用Docker,搭建一主一從的數(shù)據(jù)庫系統(tǒng)。
1、運(yùn)行docker pull mysql:5.7下載mysql鏡像。
2、在/opt目錄下創(chuàng)建三個文件夾,分別為/opt/mysql_cluster、/opt/mysql_cluster/master和/opt/mysql_cluster/slave1。其中master和slave1文件夾用于保存需要持久化到宿主機(jī)上mysql容器的數(shù)據(jù)文件、日志文件等。
3、在/opt/mysql_cluster/master編寫my.cnf文件,內(nèi)容如下。需要注意的是,開啟bin-log日志后默認(rèn)記錄所有庫所有表的操作,可以通過配置來指定需要記錄操作的數(shù)據(jù)庫或者表,或指定不記錄操作的數(shù)據(jù)庫或者表。[mysqld]
#實(shí)例ID,不能和集群中的其他實(shí)例相同
server-id=1
#bin?log?文件前綴
log-bin=mysql-prefix
#?需要同步的數(shù)據(jù)庫
binlog-do-db=tuling
#不需要同步的數(shù)據(jù)庫
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=test
4、在/opt/mysql_cluster/slave1編寫my.cnf文件,內(nèi)容如下:[mysqld]
#實(shí)例ID,不能和集群中的其他實(shí)例相同
server-id=2
skip-slave-start=true
#限定用戶進(jìn)行數(shù)據(jù)修改的操作
read_only=ON
#中繼日志前綴
relay-log=relay-bin
5、運(yùn)行以下命令,啟動主數(shù)據(jù)庫。向外暴露的端口號為3307,默認(rèn)的密碼為123456,并且掛載宿主機(jī)目錄到容器中,用于將數(shù)據(jù)保存到宿主機(jī),保證數(shù)據(jù)不丟失。docker?run?-p?3307:3306?--name?mysql_master?\-v?/opt/mysql_cluster/master/conf:/etc/mysql?\-v?/opt/mysql_cluster/master/logs:/var/log/mysql?\-v?/opt/mysql_cluster/master/data:/var/lib/mysql?\?-v?/opt/mysql_cluster/master/my.cnf:/etc/my.cnf?\-e?MYSQL_ROOT_PASSWORD=123456?\-d?mysql:5.7
6、運(yùn)行docker exec -it mysql_master /bin/bash,進(jìn)入主數(shù)據(jù)庫容器。
7、運(yùn)行mysql -uroot -p,輸入密碼,登錄數(shù)據(jù)庫。
8、運(yùn)行以下命令,添加訪問權(quán)限,刷新授權(quán)表信息,方便后續(xù)在其他機(jī)器操作該數(shù)據(jù)庫。grant?all?privileges?on?*.*?to?root@'%'?identified?by?"123456";flush?privileges;
9、運(yùn)行以下命令,添加主庫復(fù)制賬號,刷新授權(quán)表信息。用戶名和密碼都是slave。后續(xù)從庫使用該賬號,獲取相關(guān)bin-log。CREATE?USER?'slave'@'%'?IDENTIFIED?BY?'slave';GRANT?REPLICATION?SLAVE?ON?*.*?TO?'slave'@'%';flush?privileges;
10、運(yùn)行命令show master status;,獲取主庫當(dāng)前bin-log文件名(File)和位置(Position)。
11、運(yùn)行以下命令,啟動從數(shù)據(jù)庫。向外暴露的端口號為3308,默認(rèn)的密碼為123456,并且掛載宿主機(jī)目錄到容器中,用于將數(shù)據(jù)保存到宿主機(jī),保證數(shù)據(jù)不丟失。docker?run?-p?3308:3306?-m?300M?--memory-reservation?200M?--name?mysql_slave?\-v?/opt/mysql_cluster/slave1/conf:/etc/mysql?\-v?/opt/mysql_cluster/slave1/logs:/var/log/mysql?\-v?/opt/mysql_cluster/slave1/data:/var/lib/mysql?\?-v?/opt/mysql_cluster/slave1/my.cnf:/etc/my.cnf?\-e?MYSQL_ROOT_PASSWORD=123456?\-d?mysql:5.7
12、運(yùn)行docker exec -it mysql_slave /bin/bash,進(jìn)入從數(shù)據(jù)庫容器。
13、運(yùn)行mysql -uroot -p,輸入密碼,登錄數(shù)據(jù)庫。
14、運(yùn)行以下命令,添加訪問權(quán)限,刷新授權(quán)表信息。方便后續(xù)在其他機(jī)器操作該數(shù)據(jù)庫。grant?all?privileges?on?*.*?to?root@'%'?identified?by?"123456";flush?privileges;
15、運(yùn)行以下命令,配置從庫復(fù)制信息。其中,master_host為docker宿主機(jī)的ip,master_user和master_slave為主庫復(fù)制賬號,master_log_file是主庫運(yùn)行命令show master status獲取的File字段值,master_log_pos為Position字段值。master_port為主數(shù)據(jù)庫向外暴露的端口號。change?master?to?master_host='192.168.255.167',master_user='slave',master_password='slave',master_log_file='mysql-prefix.000004',master_log_pos=1824,master_port=3307;
16、運(yùn)行start slave;,啟動slave服務(wù)。
17、運(yùn)行show slave status\G;,查看slave狀態(tài)。當(dāng)參數(shù)"Slave_IO_Running"和"Slave_SQL_Running"值都是Yes,主從配置完成。
18、可以通過在主庫創(chuàng)建表、插入修改數(shù)據(jù)后,查看從庫是否同步成功,驗(yàn)證是否搭建成功。
19、當(dāng)需要重新配置主從時,可以在從庫上運(yùn)行以下兩條命令,取消當(dāng)前的主備復(fù)制。stop?slave;reset?master;
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的mysql df_MySQL主从复制实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 盘点程序员必备的专业术语,值得看一看
- 下一篇: IDEA中安装配置Jrebel热部署插件