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