前言
在實(shí)際的生產(chǎn)環(huán)境中,對(duì)數(shù)據(jù)庫(kù)的讀和寫(xiě)都在同一個(gè)數(shù)據(jù)庫(kù)服務(wù)器中,是不能滿足實(shí)際需求的。無(wú)論是在安全性、高可用性還是高并發(fā)等各個(gè)方面都是完全不能滿足實(shí)際需求的。因此,通過(guò)主從復(fù)制的方式來(lái)同步數(shù)據(jù),再通過(guò)讀寫(xiě)分離來(lái)提升數(shù)據(jù)庫(kù)的并發(fā)負(fù)載能力。有點(diǎn)類(lèi)似于rsync,但是不同的是rsync是對(duì)磁盤(pán)文件做備份,而mysql主從復(fù)制是對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)、語(yǔ)句做備份。
一、讀寫(xiě)分離概述
1. 什么是讀寫(xiě)分離?
- 讀寫(xiě)分離,基本的原理是讓主數(shù)據(jù)庫(kù)處理事務(wù)性增、改、刪操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫(kù)處理SELECT查詢操作。
- 數(shù)據(jù)庫(kù)復(fù)制被用來(lái)把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫(kù)。
2. 為什么要讀寫(xiě)分離呢?
- 因?yàn)閿?shù)據(jù)庫(kù)的“寫(xiě)”(寫(xiě)10000條數(shù)據(jù)可能要3分鐘)操作是比較耗時(shí)的。
- 但是數(shù)據(jù)庫(kù)的“讀”(讀10000條數(shù)據(jù)可能只要5秒鐘)。
- 所以讀寫(xiě)分離,解決的是,數(shù)據(jù)庫(kù)的寫(xiě)入,影響了查詢的效率。
3. 什么時(shí)候要讀寫(xiě)分離?
- 數(shù)據(jù)庫(kù)不一定要讀寫(xiě)分離,如果程序使用數(shù)據(jù)庫(kù)較多時(shí),而更新少,查詢多的情況下會(huì)考慮使用。
- 利用數(shù)據(jù)庫(kù)主從同步,再通過(guò)讀寫(xiě)分離可以分擔(dān)數(shù)據(jù)庫(kù)壓力,提高性能。
4. 主從復(fù)制與讀寫(xiě)分離
- 在實(shí)際的生產(chǎn)環(huán)境中,對(duì)數(shù)據(jù)庫(kù)的讀和寫(xiě)都在同一個(gè)數(shù)據(jù)庫(kù)服務(wù)器中,是不能滿足實(shí)際需求的。無(wú)論是在安全性、高可用性還是高并發(fā)等各個(gè)方面都是完全不能滿足實(shí)際需求的。
- 因此,通過(guò)主從復(fù)制的方式來(lái)同步數(shù)據(jù),再通過(guò)讀寫(xiě)分離來(lái)提升數(shù)據(jù)庫(kù)的并發(fā)負(fù)載能力。
- 有點(diǎn)類(lèi)似于rsync,但是不同的是rsync是對(duì)磁盤(pán)文件做備份,而mysql主從復(fù)制是對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)、語(yǔ)句做備份。
5. mysq支持的復(fù)制類(lèi)型
- (1)STATEMENT:基于語(yǔ)句的復(fù)制。在服務(wù)器上執(zhí)行sql語(yǔ)句,在從服務(wù)器上執(zhí)行同樣的語(yǔ)句,mysql默認(rèn)采用基于語(yǔ)句的復(fù)制,執(zhí)行效率高。
- (2)ROW:基于行的復(fù)制。把改變的內(nèi)容復(fù)制過(guò)去,而不是把命令在從服務(wù)器上執(zhí)行一遍。
- (3)MIXED:混合類(lèi)型的復(fù)制。默認(rèn)采用基于語(yǔ)句的復(fù)制,一旦發(fā)現(xiàn)基于語(yǔ)句無(wú)法精確復(fù)制時(shí),就會(huì)采用基于行的復(fù)制。
6. 主從復(fù)制的工作過(guò)程
- (1)Master節(jié)點(diǎn)將數(shù)據(jù)的改變記錄成二進(jìn)制日志(bin log),當(dāng)Master上的數(shù)據(jù)發(fā)生改變時(shí),則將其改變寫(xiě)入二進(jìn)制日志中。
- (2)Slave節(jié)點(diǎn)會(huì)在一定時(shí)間間隔內(nèi)對(duì)Master的二進(jìn)制日志進(jìn)行探測(cè)其是否發(fā)生改變,如果發(fā)生改變,則開(kāi)始一個(gè)I/O線程請(qǐng)求 Master的二進(jìn)制事件。
- (3)同時(shí)Master節(jié)點(diǎn)為每個(gè)I/O線程啟動(dòng)一個(gè)dump線程,用于向其發(fā)送二進(jìn)制事件,并保存至Slave節(jié)點(diǎn)本地的中繼日志(Relay log)中,Slave節(jié)點(diǎn)將啟動(dòng)SQL線程從中繼日志中讀取二進(jìn)制日志,在本地重放,即解析成 sql 語(yǔ)句逐一執(zhí)行,使得其數(shù)據(jù)和 Master節(jié)點(diǎn)的保持一致,最后I/O線程和SQL線程將進(jìn)入睡眠狀態(tài),等待下一次被喚醒。
注:
- 中繼日志通常會(huì)位于 OS 緩存中,所以中繼日志的開(kāi)銷(xiāo)很小。
- 復(fù)制過(guò)程有一個(gè)很重要的限制,即復(fù)制在 Slave上是串行化的,也就是說(shuō) Master上的并行更新操作不能在 Slave上并行操作。
7. MySQL主從復(fù)制延遲
發(fā)生MySQL主從復(fù)制延遲的幾種原因
- master服務(wù)器高并發(fā),形成大量事務(wù)
- 網(wǎng)絡(luò)延遲
- 主從硬件設(shè)備導(dǎo)致
cpu主頻、內(nèi)存io、硬盤(pán)io - 本來(lái)就不是同步復(fù)制、而是異步復(fù)制
解決辦法:
- 從庫(kù)優(yōu)化Mysql參數(shù)。比如增大innodb_buffer_pool_size,讓更多操作在Mysql內(nèi)存中完成,減少磁盤(pán)操作。
- 從庫(kù)使用高性能主機(jī)。包括cpu強(qiáng)悍、內(nèi)存加大。避免使用虛擬云主機(jī),使用物理主機(jī),這樣提升了i/o方面性。
- 從庫(kù)使用SSD磁盤(pán)
- 網(wǎng)絡(luò)優(yōu)化,避免跨機(jī)房實(shí)現(xiàn)同步
二、主從復(fù)制配置方法
- 首先做時(shí)間同步
rpm -q ntp ntpdate #首先確定安裝這兩個(gè)工具如果沒(méi)有安裝的話yum安裝一下
yum -y install ntp ntpdate
vim /etc/ntp.conf ##ntp的配置文件
在主服務(wù)器配置文件里修改
修改好之后,重啟服務(wù)
從服務(wù)器直接 ntpdate 主機(jī)IP 同步主機(jī)的即可
需要注意
客戶機(jī)要等幾分鐘再與新啟動(dòng)的 ntp 服務(wù)器進(jìn)行時(shí)間同步,否則會(huì)提示 no server suitable for synchronization found 錯(cuò)誤。
客戶端同步時(shí)間
將時(shí)間同步命令放入計(jì)劃任務(wù)內(nèi)每30分鐘執(zhí)行一次同步
systemctl restart crond ##重啟crond服務(wù)
主服務(wù)器配置
vim /etc/my.cnf
重啟服務(wù)然后登錄mysql
在里面輸入
從服務(wù)器配置
修改配置文件后重啟服務(wù)器
然后登錄mysql配置同步
start slave; #啟動(dòng)同步,如有報(bào)錯(cuò)執(zhí)行 reset slave;
show slave status\G #查看 Slave 狀態(tài)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-503279.html
#一般 Slave_IO_Running: No 的可能性:
1、網(wǎng)絡(luò)不通
2、my.cnf配置有問(wèn)題
3、密碼、file文件名、pos偏移量不對(duì)
4、防火墻沒(méi)有關(guān)閉文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-503279.html
到了這里,關(guān)于MySQL數(shù)據(jù)庫(kù)——主從復(fù)制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!