一、MySQL主從復(fù)制
1、配置主從復(fù)制的原因:
在企業(yè)應(yīng)用中,成熟的業(yè)務(wù)通常數(shù)據(jù)量都比較大
單臺MySQL在安全性、 高可用性和高并發(fā)方面都無法滿足實際的需求
配置多臺主從數(shù)據(jù)庫服務(wù)器以實現(xiàn)讀寫分離
2、主從復(fù)制原理
1、 MySQL的復(fù)制類型
- 基于語句的復(fù)制(STATEMENT, MySQL默認(rèn)類型)
- 基于行的復(fù)制(ROW)
- 混合類型的復(fù)制(MIXED)
2、 MySQL主從復(fù)制的工作過程;
兩日志、三線程:
(1)在每個事務(wù)更新數(shù)據(jù)完成之前,Master 在二進(jìn)制日志(Binary log)記錄這些改變。寫入二進(jìn)制日志完成后,Master 通知存儲引擎提交事務(wù)。
(2)Slave 將 Master 的復(fù)制到其中繼日志(Relay log)。首先slave 開始一個工作線程(I/O),I/O線程在 Master 上打開一個普通的連接,然后開始 Binlog dump process。Binlog dump process 從 Master 的二進(jìn)制日志中讀取事件,如果已經(jīng)跟上 Master,它會睡眠并等待 Master 產(chǎn)生新的事件,I/O線程將這些事件寫入中繼日志。
(3)SQL slave thread(SQL從線程)處理該過程的最后一步,SQL線程從中繼日志讀取事件,并重放其中的事件而更新 Slave 數(shù)據(jù),使其與 Master 中的數(shù)據(jù)一致,只要該線程與 I/O 線程保持一致,中繼日志通常會位于 OS 緩存中,所以中繼日志的開銷很小。
復(fù)制過程有一個很重要的限制,即復(fù)制在 Slave 上是串行化的,也就是說 Master 上的并行更新操作不能在 Slave 上并行操作。
1、 MySQL主從復(fù)制延遲
1、master服務(wù)器高并發(fā),形成大量事務(wù)
2、網(wǎng)絡(luò)延遲
3、主從硬件設(shè)備導(dǎo)致:cpu主頻、內(nèi)存io、硬盤io等
4、本來就不是同步復(fù)制、而是異步復(fù)制
2、優(yōu)化方案:
從庫優(yōu)化Mysql參數(shù)。比如增大innodb_buffer_pool_size,讓更多操作在Mysql內(nèi)存中完成,減少磁盤操作。
從庫使用高性能主機(jī)。包括cpu強悍、內(nèi)存加大。避免使用虛擬云主機(jī),使用物理主機(jī),這樣提升了i/o方面性。
從庫使用SSD磁盤
網(wǎng)絡(luò)優(yōu)化,避免跨機(jī)房實現(xiàn)同步
問題解決方法
半同步復(fù)制- 解決數(shù)據(jù)丟失的問題
并行復(fù)制—解決從庫復(fù)制延遲的問題
3、 MySQL 有幾種同步方式: 三種
1、異步復(fù)制(Async Replication)
2、同步復(fù)制(sync Replication)
3、半同步復(fù)制(Async Replication)
4、增強半同步復(fù)制(lossless Semi-Sync Replication)、無損復(fù)制
4、異步復(fù)制(Async Replication)
主庫將更新寫入Binlog日志文件后,不需要等待數(shù)據(jù)更新是否已經(jīng)復(fù)制到從庫中,就可以繼續(xù)處理更多的請求。Master將事件寫入binlog,但并不知道Slave是否或何時已經(jīng)接收且已處理。在異步復(fù)制的機(jī)制的情況下,如果Master宕機(jī),事務(wù)在Master上已提交,但很可能這些事務(wù)沒有傳到任何的Slave上。假設(shè)有Master->Salve故障轉(zhuǎn)移的機(jī)制,此時Slave也可能會丟失事務(wù)。MySQL復(fù)制默認(rèn)是異步復(fù)制,異步復(fù)制提供了最佳性能。
5、同步復(fù)制(Sync Replication)
主庫將更新寫入Binlog日志文件后,需要等待數(shù)據(jù)更新已經(jīng)復(fù)制到從庫中,并且已經(jīng)在從庫執(zhí)行成功,然后才能返回繼續(xù)處理其它的請求。同步復(fù)制提供了最佳安全性,保證數(shù)據(jù)安全,數(shù)據(jù)不會丟失,但對性能有一定的影響。
6、半同步復(fù)制(Semi-Sync Replication)
主庫提交更新寫入二進(jìn)制日志文件后,等待數(shù)據(jù)更新寫入了從服務(wù)器中繼日志中,然后才能再繼續(xù)處理其它請求。該功能確保至少有1個從庫接收完主庫傳遞過來的binlog內(nèi)容已經(jīng)寫入到自己的relay log里面了,才會通知主庫上面的等待線程,該操作完畢。
半同步復(fù)制,是最佳安全性與最佳性能之間的一個折中。
MySQL 5.5版本之后引入了半同步復(fù)制功能,主從服務(wù)器必須安裝半同步復(fù)制插件,才能開啟該復(fù)制功能。如果等待超時,超過rpl_semi_sync_master_timeout參數(shù)設(shè)置時間(默認(rèn)值為10000,表示10秒),則關(guān)閉半同步復(fù)制,并自動轉(zhuǎn)換為異步復(fù)制模式。當(dāng)master dump線程發(fā)送完一個事務(wù)的所有事件之后,如果在rpl_semi_sync_master_timeout內(nèi),收到了從庫的響應(yīng),則主從又重新恢復(fù)為增強半同步復(fù)制。
ACK (Acknowledge character)即是確認(rèn)字符。
7、增強半同步復(fù)制(lossless Semi-Sync Replication、無損復(fù)制)
增強半同步是在MySQL 5.7引入,其實半同步可以看成是一個過渡功能,因為默認(rèn)的配置就是增強半同步,所以,大家一般說的半同步復(fù)制其實就是增強的半同步復(fù)制,也就是無損復(fù)制。
增強半同步和半同步不同的是,等待ACK時間不同rpl_semi_sync_master_wait_point = AFTER_SYNC(默認(rèn))
半同步的問題是因為等待ACK的點是Commit之后,此時Master已經(jīng)完成數(shù)據(jù)變更,用戶已經(jīng)可以看到最新數(shù)據(jù),當(dāng)Binlog還未同步到Slave時,發(fā)生主從切換,那么此時從庫是沒有這個最新數(shù)據(jù)的,用戶看到的是老數(shù)據(jù)。
增強半同步將等待ACK的點放在提交Commit之前,此時數(shù)據(jù)還未被提交,外界看不到數(shù)據(jù)變更,此時如果發(fā)送主從切換,新庫依然還是老數(shù)據(jù),不存在數(shù)據(jù)不一致的問題。
3、 Mysql應(yīng)用場景
mysql 數(shù)據(jù)庫
主要的性能是讀和寫,一般場景來說讀請求更多。
根據(jù)主從復(fù)制可以演變成讀寫分離,因為讀寫分離基于主從復(fù)制,使用讀寫分離從而解決高并發(fā)的問題。
mysql架構(gòu)演變的方向:
1、單臺mysql有單點故障
2、集群—》 主從復(fù)制
3、主從復(fù)制渡河寫的壓力不均衡
4、讀寫分離
5、讀寫分離的基礎(chǔ)是主從復(fù)制
6、mysql的高可用架構(gòu)MHA(master HA高可用) MGR MMM
二、讀寫分離
1.概述
讀寫分離,基本的原理是讓主數(shù)據(jù)庫處理事務(wù)性增、改、刪操作(INSERT、UPDATE、DELETE),而從數(shù)據(jù)庫處理SELECT查詢操作。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫。
2.配置讀寫分離的原因
因為數(shù)據(jù)庫的“寫”(寫10000條數(shù)據(jù)可能要3分鐘)操作是比較耗時的。
但是數(shù)據(jù)庫的“讀”(讀10000條數(shù)據(jù)可能只要5秒鐘)。
所以讀寫分離,解決的是,數(shù)據(jù)庫的寫入,影響了查詢的效率。
3.應(yīng)用場景
數(shù)據(jù)庫不一定要讀寫分離,如果程序使用數(shù)據(jù)庫較多時,而更新少,查詢多的情況下會考慮使用。利用數(shù)據(jù)庫主從同步,再通過讀寫分離可以分擔(dān)數(shù)據(jù)庫壓力,提高性能。
4.主從復(fù)制與讀寫分離的關(guān)系
在實際的生產(chǎn)環(huán)境中,對數(shù)據(jù)庫的讀和寫都在同一個數(shù)據(jù)庫服務(wù)器中,是不能滿足實際需求的。無論是在安全性、高可用性還是高并發(fā)等各個方面都是完全不能滿足實際需求的。因此,通過主從復(fù)制的方式來同步數(shù)據(jù),再通過讀寫分離來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力。有點類似于rsync,但是不同的是rsync是對磁盤文件做備份,而mysql主從復(fù)制是對數(shù)據(jù)庫中的數(shù)據(jù)、語句做備份。
5.原理
讀寫分離就是只在主服務(wù)器上寫,只在從服務(wù)器上讀?;镜脑硎亲屩鲾?shù)據(jù)庫處理事務(wù)性操作,而從數(shù)據(jù)庫處理 select 查詢。數(shù)據(jù)庫復(fù)制被用來把主數(shù)據(jù)庫上事務(wù)性操作導(dǎo)致的變更同步到集群中的從數(shù)據(jù)庫。
6.企業(yè) 使用MySQL 讀寫分離場景
目前較為常見的 MySQL 讀寫分離分為以下兩種:
1 、基于程序代碼內(nèi)部實現(xiàn)
在代碼中根據(jù) select、insert 進(jìn)行路由分類,這類方法也是目前生產(chǎn)環(huán)境應(yīng)用最廣泛的。
優(yōu)點是性能較好,因為在程序代碼中實現(xiàn),不需要增加額外的設(shè)備為硬件開支;缺點是需要開發(fā)人員來實現(xiàn),運維人員無從下手。
但是并不是所有的應(yīng)用都適合在程序代碼中實現(xiàn)讀寫分離,像一些大型復(fù)雜的Java應(yīng)用,如果在程序代碼中實現(xiàn)讀寫分離對代碼改動就較大。
2 基于中間代理層實現(xiàn)
代理一般位于客戶端和服務(wù)器之間,代理服務(wù)器接到客戶端請求后通過判斷后轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫,有以下代表性程序。
(1)MySQL-Proxy。MySQL-Proxy 為 MySQL 開源項目,通過其自帶的 lua 腳本進(jìn)行SQL 判斷。
(2)Atlas。是由奇虎360的Web平臺部基礎(chǔ)架構(gòu)團(tuán)隊開發(fā)維護(hù)的一個基于MySQL協(xié)議的數(shù)據(jù)中間層項目。它是在mysql-proxy 0.8.2版本的基礎(chǔ)上,對其進(jìn)行了優(yōu)化,增加了一些新的功能特性。360內(nèi)部使用Atlas運行的mysql業(yè)務(wù),每天承載的讀寫請求數(shù)達(dá)幾十億條。支持事物以及存儲過程。
(3)Amoeba。由陳思儒開發(fā),作者曾就職于阿里巴巴。該程序由Java語言進(jìn)行開發(fā),阿里巴巴將其用于生產(chǎn)環(huán)境。但是它不支持事務(wù)和存儲過程。
由于使用MySQL Proxy 需要寫大量的Lua腳本,這些Lua并不是現(xiàn)成的,而是需要自己去寫。這對于并不熟悉MySQL Proxy 內(nèi)置變量和MySQL Protocol 的人來說是非常困難的。
Amoeba是一個非常容易使用、可移植性非常強的軟件。因此它在生產(chǎn)環(huán)境中被廣泛應(yīng)用于數(shù)據(jù)庫的代理層。
三.實驗
實驗準(zhǔn)備
Master服務(wù)器:192.168.116.50
Slave1服務(wù)器:192.168.116.20
Slave2服務(wù)器:192.168.116.40
Amoeba服務(wù)器:192.168.116.30
客戶端:192.168.116.100
1.主從復(fù)制
(1)mysql主從服務(wù)器時間同步
Master服務(wù)器配置
yum install -y ntp
vim /etc/ntp.conf
#設(shè)置本地為時鐘源(116.0為我局域網(wǎng)網(wǎng)段)
server 127.127.116.0
#設(shè)置時間層級為8(限制在15內(nèi))
fudge 127.127.116.0 stratum 8
service ntpd start
從服務(wù)器設(shè)置
yum install -y ntp ntpdate
service ntpd start
#指定時鐘源地址
/usr/sbin/ntpdate 192.168.116.50
#定時同步
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.116.50
(2)配置Master服務(wù)器
#修改配置文件
vim /etc/my.cnf
[mysqld]
...
server-id=1
log_bin=mysql-bin
binlog_format=MIXED
log-slave-updates=true
expire_logs_days=10
max_binlog_size=500M
#重啟服務(wù)使配置生效
systemctl restart mysqld.service
#給從服務(wù)授權(quán)
mysql -uroot -p123123
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.116.% IDENTIFIED BY '123123';
FLUSH PRIVILEGES;
#查看二進(jìn)制日志文件和pos節(jié)點
show master status;
(3)配置兩臺Slave服務(wù)器
#修改配置文件
vim /etc/my.cnf
server-id = 2
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
relay_log_recovery = 1
#重啟服務(wù)使配置生效
systemctl restart mysqld.service
#登入數(shù)據(jù)庫做salve配置
mysql -uroot -p123123
change master to master_host='192.168.116.50',master_user='myslave',master_password='123123',master_log_file='mysql-bin.000007',master_log_pos=3464;
#開啟slave和查看狀態(tài)
start slave;
show slave status\G
(4)測試
在主服務(wù)器創(chuàng)建庫和表
查看兩臺slave服務(wù)器(存在說明同步成功)
2.配置主從讀寫分離(Amoeba)
(1)安裝jdk1.6環(huán)境
#首先把jdk-6u14-linux-x64.bin放在/usr/local/下
chmod +x /usr/local/jdk-6u14-linux-x64.bin
#執(zhí)行安裝
./jdk-6u14-linux-x64.bin
#添加環(huán)境變量并啟用文件
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6.0_14/
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile
#查看java環(huán)境
java -version
(2)安裝配置amoeba服務(wù)
#先將amoeba-mysql-binary-2.2.0.tar.gz壓縮包放在/opt下
mkdir /usr/local/amoeba
cd /opt
tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
#添加amoeba環(huán)境變量(在上一步的java環(huán)境變量的基礎(chǔ)上修改)
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6.0_14/
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$AMOEBA_HOME/bin:$PATH
source /etc/profile
先在所有主從數(shù)據(jù)庫中授權(quán)amoeba用戶訪問
mysql -uroot -p123123
grant all on *.* to 'amoeba'@'192.168.116.%' identified by '123123';
修改服務(wù)器配置文件/usr/local/amoeba/conf/dbServers.xml
啟動服務(wù)并查看是否開啟成功文章來源:http://www.zghlxwxcb.cn/news/detail-611566.html
/usr/local/amoeba/bin/amoeba start
netstat -nltp |grep 8066
文章來源地址http://www.zghlxwxcb.cn/news/detail-611566.html
到了這里,關(guān)于【簡單認(rèn)識MySQL主從復(fù)制與讀寫分離】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!