十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
MySQL主從同步指的是什么?這個(gè)問(wèn)題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見(jiàn)到的。希望通過(guò)這個(gè)問(wèn)題能讓你收獲頗深。下面是小編給大家?guī)?lái)的參考內(nèi)容,讓我們一起來(lái)看看吧!
創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站制作、成都網(wǎng)站制作與策劃設(shè)計(jì),德安網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:德安等地區(qū)。德安做網(wǎng)站價(jià)格咨詢:18982081108
mysql主從同步的意思為備份,主庫(kù)(Master)將自己庫(kù)中的寫入同時(shí)同步給自己的從庫(kù)(Slave),當(dāng)主庫(kù)發(fā)生某些不可預(yù)知的狀況,導(dǎo)致整個(gè)服務(wù)器無(wú)法使用時(shí),由于從庫(kù)中也有一份數(shù)據(jù),所以數(shù)據(jù)可以做到快速恢復(fù),不造成或者減少造成數(shù)據(jù)的損失。
當(dāng)master(主)庫(kù)的數(shù)據(jù)發(fā)生變化的時(shí)候,變化會(huì)實(shí)時(shí)的同步到slave(從)庫(kù)。
數(shù)據(jù)是一個(gè)應(yīng)用至關(guān)重要的一部分。從目的出發(fā),主從同步有那么點(diǎn)備份的意思,主庫(kù)(Master)將自己庫(kù)中的寫入同時(shí)同步給自己的從庫(kù)(Slave),當(dāng)主庫(kù)發(fā)生某些不可預(yù)知的狀況,導(dǎo)致整個(gè)服務(wù)器無(wú)法使用時(shí),由于從庫(kù)中也有一份數(shù)據(jù),所以數(shù)據(jù)可以做到快速恢復(fù),不造成或者減少造成數(shù)據(jù)的損失。
當(dāng)然,這只是第一個(gè)層面,如果主從庫(kù)的作用僅限于此,那么我個(gè)人認(rèn)為沒(méi)有必要分為兩個(gè)數(shù)據(jù)庫(kù),只需要定期將數(shù)據(jù)庫(kù)內(nèi)容作為快照發(fā)送到另一臺(tái)服務(wù)器,或者每次寫入時(shí)將寫入內(nèi)容實(shí)時(shí)發(fā)送到另一臺(tái)服務(wù)器不就好了嗎,這樣不但可以節(jié)約資源,也可以起到容災(zāi)備份的目的。
當(dāng)然主從同步的作用絕不可能僅限于此,一旦我們配置了主從結(jié)構(gòu),我們通常不會(huì)讓從節(jié)點(diǎn)僅僅只作為備份數(shù)據(jù)庫(kù),我們應(yīng)該還會(huì)相應(yīng)地配置上讀寫分離(可以使用MyCat或者其它中間件,可以自己了解一下,關(guān)于MyCat我在下一篇博客中會(huì)說(shuō)這個(gè),篇幅可能會(huì)有點(diǎn)長(zhǎng),所以就再寫一篇吧)。
在實(shí)際環(huán)境下,對(duì)于數(shù)據(jù)庫(kù)的讀操作數(shù)目遠(yuǎn)大于對(duì)數(shù)據(jù)庫(kù)的寫操作,所以我們可以讓Master只提供寫的功能,然后將所有的讀操作都移到從庫(kù),這就是我們平時(shí)常說(shuō)的讀寫分離,這樣不但可以減輕Master的壓力,還可以做容災(zāi)備份,一舉兩得。
水平擴(kuò)展數(shù)據(jù)庫(kù)的負(fù)載能力。
容錯(cuò),高可用。Failover(失敗切換)/High Availability
數(shù)據(jù)備份。
說(shuō)完了主從同步的概念,下面來(lái)說(shuō)說(shuō)主從同步的原理,其實(shí)原理也非常簡(jiǎn)單,沒(méi)有redis集群那么多的概念。
實(shí)際上當(dāng)我們?cè)贛ySQL中配置了主從之后,只要我們對(duì)Master節(jié)點(diǎn)進(jìn)行了寫操作,這個(gè)操作將會(huì)被保存到MySQL的binary-log(bin-log)日志當(dāng)中,當(dāng)slave連接到master的時(shí)候,master機(jī)器會(huì)為slave開(kāi)啟binlog dump線程。當(dāng)master 的 binlog發(fā)生變化的時(shí)候,Master的dump線程會(huì)通知slave,并將相應(yīng)的binlog內(nèi)容發(fā)送給Slave。而Slave節(jié)點(diǎn)在主從同步開(kāi)啟的時(shí)候,會(huì)創(chuàng)建兩個(gè)線程,一個(gè)I/O線程,一個(gè)SQL線程,這在我們后面的搭建中可以親眼看到。
I/0線程:該線程鏈接到master機(jī)器,master機(jī)器的binlog發(fā)送到slave的時(shí)候,IO線程會(huì)將該日志內(nèi)容寫在本地的中繼日志(Relay log)中。
SQL線程:該線程讀取中繼日志中的內(nèi)容,并且根據(jù)中繼日志中的內(nèi)容對(duì)Slave數(shù)據(jù)庫(kù)做相應(yīng)的操作。
可能造成的問(wèn)題:在寫請(qǐng)求相當(dāng)多的情況下,可能會(huì)造成Slave數(shù)據(jù)和Master數(shù)據(jù)不一致的情況,這是因?yàn)槿罩緜鬏斶^(guò)程中的短暫延遲、或者寫命令較多,系統(tǒng)速度不匹配造成的。
這大致就是MySQL主從同步的原理,真正在其中起到作用的實(shí)際上就是這兩個(gè)日志文件,binlog和中繼日志。
本次搭建主從同步的環(huán)境:CentOS 7 ,MySQL 8.0.18(使用二進(jìn)制包安裝)。
本次將會(huì)搭建MySQL的主從同步,其中一臺(tái)Master,兩臺(tái)Slave。
Master:IP :192.168.43.201 Port:3306 Slave1:IP:192.168.43.202 Port:3306 Slave2:IP:192.168.43.203 Port:3306
修改配置文件
當(dāng)我們安裝好MySQL之后,在/etc/目錄下會(huì)有一個(gè)my.cnf文件,打開(kāi)文件,加入如下內(nèi)容(別忘了修改之前做好備份):
x
#該配置為Master的配置 server-id=201 #Server id 每臺(tái)MySQL的必須不同 log-bin=/var/lib/mysql/mysql-bin.log #代表開(kāi)啟binlog日志 expire_logs_days=10 #日志過(guò)期時(shí)間 max_binlog_size=200M #日志最大容量 binlog_ignore_db=mysql #忽略mysql庫(kù),表示不同步此庫(kù)
y
#該配置為Slave的配置,第二臺(tái)Slave也是這么配置,不過(guò)要修改一下server-id server-id=202 expire_logs_days=10 #日志的緩存時(shí)間 max_binlog_size=200M #日志的最大大小 replicate_ignore_db=mysql #忽略同步的數(shù)據(jù)庫(kù)
新增Slave用戶
打開(kāi)Master節(jié)點(diǎn)的客戶端 ,mysql -u root -p 密碼
創(chuàng)建用戶 create user 'Slave'@'%' identified by '123456';
給新創(chuàng)建的用戶賦權(quán):grant replication slave on '*.*' to 'Slave'@'%';
查看Master節(jié)點(diǎn)狀態(tài)
以上操作都沒(méi)有問(wèn)題后,我們?cè)诳蛻舳酥休斎雜how master status查看master的binlog日志。
配置兩個(gè)Slave節(jié)點(diǎn)
打開(kāi)兩個(gè)Slave節(jié)點(diǎn)客戶端,在我們的另外兩個(gè)Slave節(jié)點(diǎn)中輸入如下命令:
change master to master_user='Slave',master_password='123456',master_host='192.168.43.201',master_log_file='mysql-bin.000005',master_log_pos=155,get_master_public_key=1; #注意,這里的master_log_file,就是binlog的文件名,輸入上圖中的mysql-bin.000005,每個(gè)人的都可能不一樣。 #注意,這里的master_log_pos是binlog偏移量,輸入上圖中的155,每個(gè)人的都可能不一樣。
配置完成后,輸入start slave;開(kāi)啟從節(jié)點(diǎn),然后輸入show slave status\G;查看從節(jié)點(diǎn)狀態(tài)
可以看到,在兩臺(tái)Slave的狀態(tài)中,我們能親眼看到IO線程和SQL線程的運(yùn)行狀態(tài),這兩個(gè)線程必須都是yes,才算配置搭建完成。
通過(guò)上述步驟,就完成了MySQL主從同步的搭建,相對(duì)Redis而言MySQL配置相當(dāng)簡(jiǎn)單。下面我們可以進(jìn)行測(cè)試。
先看看三個(gè)MySQL的數(shù)據(jù)庫(kù)狀態(tài):SHOW DATABASES;
可以看到現(xiàn)在數(shù)據(jù)庫(kù)都是初始默認(rèn)狀態(tài),沒(méi)有任何額外的庫(kù)。
在Master節(jié)點(diǎn)中創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),庫(kù)名可以自己設(shè)置。
CREATE DATABASE testcluster;
可以看到,在Slave中也出現(xiàn)了Master中創(chuàng)建的數(shù)據(jù)庫(kù),說(shuō)明我們的配置沒(méi)有問(wèn)題,主從搭建成功。這里就不再創(chuàng)建表了,大家可以自己試試,創(chuàng)建表再往表中插入數(shù)據(jù),也是沒(méi)有任何問(wèn)題的。
如果出現(xiàn)IO線程一直在Connecting狀態(tài),可以看看是不是三臺(tái)機(jī)器無(wú)法相互連接,如果可以相互連接,那么有可能是Slave賬號(hào)密碼寫錯(cuò)了,重新關(guān)閉Slave然后輸入上面的配置命令再打開(kāi)Slave即可。
如果出現(xiàn)SQL線程為NO狀態(tài),那么有可能是從數(shù)據(jù)庫(kù)和主數(shù)據(jù)庫(kù)的數(shù)據(jù)不一致造成的,或者事務(wù)回滾,如果是后者,先關(guān)閉Slave,然后先查看master的binlog和position,然后輸入配置命令,再輸入set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
,再重新start slave;
即可,如通過(guò)是前者,那么就排查一下是不是存在哪張表沒(méi)有被同步,是否存在主庫(kù)存在而從庫(kù)不存在的表,自己同步一下再重新配置一遍即可。
在寫這篇文章之前自己也被一些計(jì)算機(jī)領(lǐng)域的“名詞”嚇到過(guò),相信有不少同學(xué)都有一樣的體會(huì),碰上某些高大上的名詞總是先被嚇到,例如像“分布式”、“集群”等等等等,甚至在沒(méi)接觸過(guò)nginx之前,連”負(fù)載均衡“、”反向代理“這樣的詞都讓人覺(jué)得,這么高達(dá)上的詞,肯定很難吧,但其實(shí)自己了解了nginx、ribbon等之后才發(fā)現(xiàn),其實(shí)也就那么回事吧,沒(méi)有想象中的那么難。
所以寫這篇文章的初衷是想讓大家對(duì)集群化或者分布式或者其他的一些技術(shù)或者解決方案不要有一種望而卻步的感覺(jué)(感覺(jué)計(jì)算機(jī)領(lǐng)域的詞都有這么一種特點(diǎn),詞匯高大上,但是其實(shí)思想是比較好理解的),其實(shí)自己手動(dòng)配置出一個(gè)簡(jiǎn)單的集群并沒(méi)有那么難。
如果學(xué)會(huì)docker之后再來(lái)配置就更加簡(jiǎn)單了,但是更希望不要只局限于會(huì)配置,配置出來(lái)的東西只能說(shuō)你會(huì)配置了,但是在這層配置底下是前人做了相當(dāng)多的工作,才能使我們通過(guò)簡(jiǎn)單配置就能實(shí)現(xiàn)一些功能,應(yīng)該要深入底層,了解配置下面的工作原理,這個(gè)才是最重要的,也是體現(xiàn)一個(gè)程序員水平的地方。
感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)mysql主從同步指的是什么大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。