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