防止服務(wù)器宕機(jī)時(shí)MySQL數(shù)據(jù)丟失的幾種方案_MySQL教程
推薦:MySQL Semisynchronous Replication介紹這篇文章主要介紹了MySQL Semisynchronous Replication介紹,本文講解了Semisynchronous Replication 定義、,需要的朋友可以參考下 前言 MySQL 5.5版本之前默認(rèn)的復(fù)制是異步(Asynchronous )模式的, MySQL 5.5 以plugins的方式提供了Semisynchronous Replication 模式。
這篇文章主要介紹了防止服務(wù)器宕機(jī)時(shí)MySQL數(shù)據(jù)丟失的幾種方案,結(jié)合實(shí)踐介紹了Replication和Monitor以及Failover這三個(gè)項(xiàng)目的應(yīng)用,需要的朋友可以參考下
對(duì)于多數(shù)應(yīng)用來(lái)說(shuō),MySQL都是作為最關(guān)鍵的數(shù)據(jù)存儲(chǔ)中心的,所以,如何讓MySQL提供HA服務(wù),是我們不得不面對(duì)的一個(gè)問(wèn)題。當(dāng)master當(dāng)機(jī)的時(shí)候,我們?nèi)绾伪WC數(shù)據(jù)盡可能的不丟失,如何保證快速的獲知master當(dāng)機(jī)并進(jìn)行相應(yīng)的故障轉(zhuǎn)移處理,都是需要我們好好思考的。這里,筆者將結(jié)合這段時(shí)間做的MySQL proxy以及toolsets相關(guān)工作,說(shuō)說(shuō)我們現(xiàn)階段以及后續(xù)會(huì)在項(xiàng)目中采用的MySQL HA方案。
Replication
要保證MySQL數(shù)據(jù)不丟失,replication是一個(gè)很好的解決方案,而MySQL也提供了一套強(qiáng)大的replication機(jī)制。只是我們需要知道,為了性能考量,replication是采用的asynchronous模式,也就是寫入的數(shù)據(jù)并不會(huì)同步更新到slave上面,如果這時(shí)候master當(dāng)機(jī),我們?nèi)匀豢赡軙?huì)面臨數(shù)據(jù)丟失的風(fēng)險(xiǎn)。
為了解決這個(gè)問(wèn)題,我們可以使用semi-synchronous replication,semi-synchronous replication的原理很簡(jiǎn)單,當(dāng)master處理完一個(gè)事務(wù),它會(huì)等待至少一個(gè)支持semi-synchronous的slave確認(rèn)收到了該事件并將其寫入relay-log之后,才會(huì)返回。這樣即使master當(dāng)機(jī),最少也有一個(gè)slave獲取到了完整的數(shù)據(jù)。
但是,semi-synchronous并不是100%的保證數(shù)據(jù)不會(huì)丟失,如果master在完成事務(wù)并將其發(fā)送給slave的時(shí)候崩潰,仍然可能造成數(shù)據(jù)丟失。只是相比于傳統(tǒng)的異步復(fù)制,semi-synchronous replication能極大地提升數(shù)據(jù)安全。更為重要的是,它并不慢,MHA的作者都說(shuō)他們?cè)趂acebook的生產(chǎn)環(huán)境中使用了semi-synchronous(這里),所以我覺(jué)得真心沒(méi)必要擔(dān)心它的性能問(wèn)題,除非你的業(yè)務(wù)量級(jí)已經(jīng)完全超越了facebook或者google。在這篇文章里面已經(jīng)提到,MySQL 5.7之后已經(jīng)使用了Loss-Less Semi-Synchronous replication,所以丟數(shù)據(jù)的概率已經(jīng)很小了。
如果真的想完全保證數(shù)據(jù)不會(huì)丟失,現(xiàn)階段一個(gè)比較好的辦法就是使用gelera,一個(gè)MySQL集群解決方案,它通過(guò)同時(shí)寫三份的策略來(lái)保證數(shù)據(jù)不會(huì)丟失。筆者沒(méi)有任何使用gelera的經(jīng)驗(yàn),只是知道業(yè)界已經(jīng)有公司將其用于生產(chǎn)環(huán)境中,性能應(yīng)該也不是問(wèn)題。但gelera對(duì)MySQL代碼侵入性較強(qiáng),可能對(duì)某些有代碼潔癖的同學(xué)來(lái)說(shuō)不合適了:-)
我們還可以使用drbd來(lái)實(shí)現(xiàn)MySQL數(shù)據(jù)復(fù)制,MySQL官方文檔有一篇文檔有詳細(xì)介紹,但筆者并未采用這套方案,MHA的作者寫了一些采用drdb的問(wèn)題,在這里,僅供參考。
在后續(xù)的項(xiàng)目中,筆者會(huì)優(yōu)先使用semi-synchronous replication的解決方案,如果數(shù)據(jù)真的非常重要,則會(huì)考慮使用gelera。
Monitor
前面我們說(shuō)了使用replication機(jī)制來(lái)保證master當(dāng)機(jī)之后盡可能的數(shù)據(jù)不丟失,但是我們不能等到master當(dāng)了幾分鐘才知道出現(xiàn)問(wèn)題了。所以一套好的監(jiān)控工具是必不可少的。
當(dāng)master當(dāng)?shù)糁�,monitor能快速的檢測(cè)到并做后續(xù)處理,譬如郵件通知管理員,或者通知守護(hù)程序快速進(jìn)行failover。
通常,對(duì)于一個(gè)服務(wù)的監(jiān)控,我們采用keepalived或者h(yuǎn)eartbeat的方式,這樣當(dāng)master當(dāng)機(jī)之后,我們能很方便的切換到備機(jī)上面。但他們?nèi)匀徊荒芎芗磿r(shí)的檢測(cè)到服務(wù)不可用。筆者的公司現(xiàn)階段使用的是keepalived的方式,但后續(xù)筆者更傾向于使用zookeeper來(lái)解決整個(gè)MySQL集群的monitor以及failover。
對(duì)于任何一個(gè)MySQL實(shí)例,我們都有一個(gè)對(duì)應(yīng)的agent程序,agent跟該MySQL實(shí)例放到同一臺(tái)機(jī)器上面,并且定時(shí)的對(duì)MySQL實(shí)例發(fā)送ping命令檢測(cè)其可用性,同時(shí)該agent通過(guò)ephemeral的方式掛載到zookeeper上面。這樣,我們可以就能知道MySQL是否當(dāng)機(jī),主要有以下幾種情況:
機(jī)器當(dāng)機(jī),這樣MySQL以及agent都會(huì)當(dāng)?shù)簦琣gent與zookeeper連接自然斷開(kāi)
MySQL當(dāng)?shù)�,agent發(fā)現(xiàn)ping不通,主動(dòng)斷開(kāi)與zookeeper的連接
Agent當(dāng)?shù)�,但MySQL未當(dāng)
上面三種情況,我們都可以認(rèn)為MySQL機(jī)器出現(xiàn)了問(wèn)題,并且zookeeper能夠立即感知。agent與zookeeper斷開(kāi)了連接,zookeeper觸發(fā)相應(yīng)的children changed事件,監(jiān)控到該事件的管控服務(wù)就可以做相應(yīng)的處理。譬如如果是上面前兩種情況,管控服務(wù)就能自動(dòng)進(jìn)行failover,但如果是第三種,則可能不做處理,等待機(jī)器上面crontab或者supersivord等相關(guān)服務(wù)自動(dòng)重啟agent。
使用zookeeper的好處在于它能很方便的對(duì)整個(gè)集群進(jìn)行監(jiān)控,并能即時(shí)的獲取整個(gè)集群的變化信息并觸發(fā)相應(yīng)的事件通知感興趣的服務(wù),同時(shí)協(xié)調(diào)多個(gè)服務(wù)進(jìn)行相關(guān)處理。而這些是keepalived或者h(yuǎn)eartbeat做不到或者做起來(lái)太麻煩的。
使用zookeeper的問(wèn)題在于部署起來(lái)較為復(fù)雜,同時(shí)如果進(jìn)行了failover,如何讓應(yīng)用程序獲取到最新的數(shù)據(jù)庫(kù)地址也是一個(gè)比較麻煩的問(wèn)題。
對(duì)于部署問(wèn)題,我們要保證一個(gè)MySQL搭配一個(gè)agent,幸好這年頭有了docker,所以真心很簡(jiǎn)單。而對(duì)于第二個(gè)數(shù)據(jù)庫(kù)地址更改的問(wèn)題,其實(shí)并不是使用了zookeeper才會(huì)有的,我們可以通知應(yīng)用動(dòng)態(tài)更新配置信息,VIP,或者使用proxy來(lái)解決。
雖然zookeeper的好處很多,但如果你的業(yè)務(wù)不復(fù)雜,譬如只有一個(gè)master,一個(gè)slave,zookeeper可能并不是最好的選擇,沒(méi)準(zhǔn)keepalived就夠了。
Failover
通過(guò)monitor,我們可以很方便的進(jìn)行MySQL監(jiān)控,同時(shí)在MySQL當(dāng)機(jī)之后通知相應(yīng)的服務(wù)做failover處理,假設(shè)現(xiàn)在有這樣的一個(gè)MySQL集群,a為master,b,c為其slave,當(dāng)a當(dāng)?shù)糁�,我們需要做failover,那么我們選擇b,c中的哪一個(gè)作為新的master呢?
原則很簡(jiǎn)單,哪一個(gè)slave擁有最近最多的原master數(shù)據(jù),就選哪一個(gè)作為新的master。我們可以通過(guò)show slave status這個(gè)命令來(lái)獲知哪一個(gè)slave擁有最新的數(shù)據(jù)。我們只需要比較兩個(gè)關(guān)鍵字段Master_Log_File以及Read_Master_Log_Pos,這兩個(gè)值代表了slave讀取到master哪一個(gè)binlog文件的哪一個(gè)位置,binlog的索引值越大,同時(shí)pos越大,則那一個(gè)slave就是能被提升為master。這里我們不討論多個(gè)slave可能會(huì)被提升為master的情況。
在前面的例子中,假設(shè)b被提升為master了,我們需要將c重新指向新的master b來(lái)開(kāi)始復(fù)制。我們通過(guò)CHANGE MASTER TO來(lái)重新設(shè)置c的master,但是我們?cè)趺粗酪獜腷的binlog的哪一個(gè)文件,哪一個(gè)position開(kāi)始復(fù)制呢?
GTID
分享:MySQL延遲關(guān)聯(lián)性能優(yōu)化方法這篇文章主要介紹了MySQL延遲關(guān)聯(lián)性能優(yōu)化方法,本文講解了延遲關(guān)聯(lián)的背景、延遲關(guān)聯(lián)的分析、延遲關(guān)聯(lián)的解決等內(nèi)容,需要的朋友可以參考下 【背景】 某業(yè)務(wù)數(shù)據(jù)庫(kù)load 報(bào)警異常,cpu usr 達(dá)到30-40 ,居高不下。使用工具查看數(shù)據(jù)庫(kù)正在執(zhí)行的sql ,排在前面的大部分是:
- MySQL Semisynchronous Replication介紹
- MySQL延遲關(guān)聯(lián)性能優(yōu)化方法
- MySQL 5.7增強(qiáng)版Semisync Replication性能優(yōu)化
- MySQL Index Condition Pushdown(ICP)性能優(yōu)化方法實(shí)例
- MySQL order by性能優(yōu)化方法實(shí)例
- MySQL slave_net_timeout參數(shù)解決的一個(gè)集群?jiǎn)栴}案例
- 使用innodb_force_recovery解決MySQL崩潰無(wú)法重啟問(wèn)題
- MySQL replace into 語(yǔ)句淺析(二)
- MySQL replace into 語(yǔ)句淺析(一)
- MySQL定期自動(dòng)刪除表
- MySQL中的CONCAT函數(shù)使用教程
- MySQL中的RAND()函數(shù)使用詳解
MySQL教程Rss訂閱編程教程搜索
MySQL教程推薦
- MySQL索引簡(jiǎn)單分析
- mysql中You can’t specify target table for update in FROM clau
- Mysql select in 按id排序?qū)崿F(xiàn)方法
- Java連接MySql的詳細(xì)介紹
- mysql 數(shù)據(jù)庫(kù) (基礎(chǔ)) 筆記
- MySQL編程中的6個(gè)實(shí)用技巧
- @@ROWCOUNT全局變量
- Mysql,phpmyadmin密碼忘了怎么辦
- MySQL數(shù)據(jù)庫(kù)中與 NULL值有關(guān)的幾個(gè)問(wèn)題
- PowerDesigner15_Library.zip是什么?
猜你也喜歡看這些
- SQL參數(shù)化查詢的另一個(gè)理由——命中執(zhí)行計(jì)劃
- SQLServer日志清空語(yǔ)句(sql2000,sql2005,sql2008)
- SQL Server 2005通用分頁(yè)存儲(chǔ)過(guò)程及多表聯(lián)接應(yīng)用
- 收縮數(shù)據(jù)庫(kù)日志文件的方法(僅適用于mssql2005)
- SQL Server 2005安裝實(shí)例環(huán)境圖解
- 解析SQL Server 2008性能和可擴(kuò)展性
- SQL Server 數(shù)據(jù)庫(kù)恢復(fù)日志功能
- 如何掌握SQL Server的鎖機(jī)制和鎖模式
- 揭開(kāi)微軟SQL Server 2008的神秘面紗
- 解讀用最簡(jiǎn)單的步驟備份SQL數(shù)據(jù)庫(kù)的文件到本地
- 相關(guān)鏈接:
復(fù)制本頁(yè)鏈接| 搜索防止服務(wù)器宕機(jī)時(shí)MySQL數(shù)據(jù)丟失的幾種方案
- 教程說(shuō)明:
MySQL教程-防止服務(wù)器宕機(jī)時(shí)MySQL數(shù)據(jù)丟失的幾種方案
。