摘要:因?yàn)閭鹘y(tǒng)的數(shù)據(jù)庫(kù)管理方式在當(dāng)前這種架構(gòu)下依靠手工或者借助簡(jiǎn)單的工具是無(wú)法應(yīng)對(duì)多活架構(gòu)大規(guī)模管理帶來(lái)的復(fù)雜性,因此平臺(tái)化顯得非常重。我們?cè)谧龅姆桨笗r(shí)做了充分調(diào)查及論證,最終沒(méi)有選擇這種方式。
蔡鵬,2015年加入餓了么,見(jiàn)證了餓了么業(yè)務(wù)&技術(shù)從0到1的發(fā)展過(guò)程,并全程參與了數(shù)據(jù)庫(kù)及DBA團(tuán)隊(duì)高速發(fā)展全過(guò)程。同時(shí)也完成個(gè)人職能的轉(zhuǎn)型-由運(yùn)維DBA到DEV-DBA的轉(zhuǎn)變,也從DB的維穩(wěn)轉(zhuǎn)變到專心為DBA團(tuán)隊(duì)及DEV團(tuán)隊(duì)的賦能。
從時(shí)間軸上看我們每年會(huì)有一個(gè)比較大的前進(jìn),我們從人肉->工具化->平臺(tái)化->自助化只用了兩年半時(shí)間完成全部迭代,其中平臺(tái)化&自助化+數(shù)據(jù)庫(kù)多活改造我們一口氣用了8個(gè)月的時(shí)間完成全部開(kāi)發(fā)及改造工作。
在完成平臺(tái)化改造的同時(shí),我們數(shù)據(jù)庫(kù)架構(gòu)也從傳統(tǒng)的主從架構(gòu)發(fā)展到異地多活架構(gòu),這對(duì)DBA的挑戰(zhàn)是巨大的,但這也是平臺(tái)必須能夠解決的。
因?yàn)閭鹘y(tǒng)的數(shù)據(jù)庫(kù)管理方式在當(dāng)前這種架構(gòu)下依靠 DBA 手工或者借助簡(jiǎn)單的工具是無(wú)法應(yīng)對(duì)多活架構(gòu) + 大規(guī)模管理帶來(lái)的復(fù)雜性,因此平臺(tái)化顯得非常重。
隨著平臺(tái)化的推進(jìn),DBA 職能角色發(fā)也在生變化,過(guò)去 DBA 在運(yùn)維和維護(hù)上消耗,現(xiàn)在 DBA 更加專注業(yè)務(wù)做價(jià)值輸出。
這里個(gè)人覺(jué)得 DBA 長(zhǎng)期在運(yùn)維層面過(guò)多花費(fèi)時(shí)間不斷修補(bǔ)各種層面漏缺,其實(shí)是不健康的,雖然每天很忙但是新問(wèn)題依舊會(huì)很多。
整體功能的概覽
DB-Agent:數(shù)據(jù)采集 + 進(jìn)程管理 + 遠(yuǎn)程腳本 & Linux 命令調(diào)用 + 與平臺(tái)耦合的接口
MM-OST:無(wú)傷 DDL 系統(tǒng)根據(jù) gh-ost 源碼改造實(shí)現(xiàn)多活場(chǎng)景下的數(shù)據(jù)庫(kù)發(fā)布
Tinker:go 重寫了 linux crontab 的邏輯支持到秒級(jí) + 管理接口與平臺(tái)整合實(shí)現(xiàn)調(diào)度集群管理日常任務(wù)調(diào)度
Checksum:多機(jī)房數(shù)據(jù)一致性檢查
SQLReview:go 實(shí)現(xiàn)的類似開(kāi)源的Inception SQL審核工具并做了功能上的增強(qiáng)
Luna:優(yōu)化后的報(bào)警系統(tǒng)(大規(guī)模實(shí)例下如何減少報(bào)警且不漏關(guān)鍵報(bào)警)
VDBA:報(bào)警自動(dòng)處理系統(tǒng),代替DBA完成對(duì)線上DB的冒煙&報(bào)警的處理
今天沒(méi)有去講一些方法論,這不是我擅長(zhǎng)的,我覺(jué)得還是能給大家介紹一些具體點(diǎn)的內(nèi)容,這樣可能了解的能清楚一些。
實(shí)時(shí)監(jiān)控&快速排障
這對(duì)于DBA是非常常見(jiàn)的事情,一般出問(wèn)題或者接到報(bào)警,通常都要登錄到服務(wù)器,一通命令敲下來(lái)可能花的時(shí)間最少兩分鐘,然后得出一個(gè)有慢SQL或者其他什么原因。
其實(shí)這個(gè)診斷過(guò)程完全可以被自動(dòng)化掉,日常處理問(wèn)題的核心原則是“快”(我們高峰期線上故障一分鐘損失幾萬(wàn)單)。
而平臺(tái)必須能提供這樣的能力,出問(wèn)題時(shí)盡量減少 DBA 思考的時(shí)間直接給出現(xiàn)象 + 原因縮短決策時(shí)間(甚至必要時(shí)系統(tǒng)可以自動(dòng)處理掉有些問(wèn)題都不必DBA參與)。
基于我們的監(jiān)控大盤 DBA 可以清晰的知道當(dāng)前全服所有實(shí)例是否有異常,那些有異常及是什么類型的異?;蛎盁煻紩?huì)清晰呈現(xiàn)。
監(jiān)控大盤將 DBA 日常管理過(guò)程中所有的命令集都整合到一起。
DBA 只需要簡(jiǎn)單的點(diǎn)點(diǎn)按鈕系統(tǒng)就會(huì)自動(dòng)執(zhí)行所有命令并做好 sql 執(zhí)行計(jì)劃分析、鎖分析、sql執(zhí)行時(shí)間分布、歷史趨勢(shì)分析,數(shù)據(jù)庫(kù)歷史 processlist 快照查看等常見(jiàn)操作。
雖然這些功能看似簡(jiǎn)單但是卻非常實(shí)用,提高了DBA故障定位的效率。
報(bào)警處理自動(dòng)化
報(bào)警處理自動(dòng)化目前主要包括:
空間問(wèn)題自動(dòng)處理
未提交事物處理
長(zhǎng)查詢自動(dòng)kill
CPU/連接數(shù)據(jù)/thread runing過(guò)多分析及處理
復(fù)制無(wú)損修復(fù)(1032,1062)
過(guò)去在處理復(fù)制數(shù)據(jù)不一致異常時(shí)同行都是 skip掉,但是這樣缺陷很多同時(shí)會(huì)留下數(shù)據(jù)不一致的隱患。
目前我們采用的是解析 binlog的方式來(lái)做到較精確修復(fù),避免了傳統(tǒng)的skip方式的缺陷。有人可能會(huì)說(shuō)目前社區(qū)有很多開(kāi)源的東西能解決你前面提到的報(bào)警問(wèn)題,為啥非要自己寫一個(gè)呢?
比如 pt 工具能幫你處理,auto kill 一些數(shù)據(jù)庫(kù)有問(wèn)題的sql,也能幫你跳過(guò)復(fù)制的錯(cuò)誤,或者 github 上也有開(kāi)源的實(shí)現(xiàn)能做到無(wú)損修復(fù)復(fù)制問(wèn)題?
這里的關(guān)于重復(fù)造輪的問(wèn)題我覺(jué)得是對(duì)待開(kāi)源態(tài)度的問(wèn)題,開(kāi)源固然能解決一些問(wèn)題,但是不同的場(chǎng)景對(duì)應(yīng)不同的開(kāi)源工具。 當(dāng)你把這些輪子拼湊到一起時(shí)難以形成一個(gè)有機(jī)整體。
尤其是你在進(jìn)行平臺(tái)化建設(shè)時(shí)必須要考慮清楚這個(gè)問(wèn)題,否則純粹的開(kāi)源堆砌出來(lái)的系統(tǒng)是難以維護(hù)的不可靠的,對(duì)于開(kāi)源我們可以用其思想造自己合適的輪子。
MHA自動(dòng)化管理
在 8.0 之前絕大部分公司高可用實(shí)現(xiàn)還是基于HHA。MHA實(shí)現(xiàn)不可避免的要解決部署的問(wèn)題。
最初我們是搞一個(gè)部署腳本在跳板機(jī)上,mysql 安裝時(shí)就打通與跳板機(jī)的互信工作然后由該腳本在來(lái)打通集群節(jié)點(diǎn)間的互信工作,然后在一個(gè)slave 上啟動(dòng) mha 管理進(jìn)程。
或者是將該管理進(jìn)程固定在集群外面的某一個(gè)或者多個(gè)服務(wù)器上集中部署&監(jiān)控,然而這樣會(huì)有什么問(wèn)題呢?
重度依賴ssh
搭建過(guò)程復(fù)雜
manager 管理節(jié)點(diǎn)外溢到一臺(tái)或多臺(tái)機(jī)器后影響可靠性的因素增多
維護(hù)復(fù)雜,配置有效性存疑會(huì)因此造成穩(wěn)定性風(fēng)險(xiǎn)
與平臺(tái)整合過(guò)于復(fù)雜,平臺(tái)如果要管理監(jiān)控manager節(jié)點(diǎn)需要借助ssh或多帶帶實(shí)現(xiàn)一個(gè)agent。
這種架構(gòu)管理幾十套或者上百套集群時(shí)還能勉強(qiáng)應(yīng)付。當(dāng)上千套時(shí)管理就很復(fù)雜整體很脆弱出問(wèn)題后維護(hù)工作量大。
我們?cè)谧鯩HA的方案時(shí)做了充分調(diào)查及論證,最終沒(méi)有選擇這種方式。
最終我們決定多帶帶搞一套管理方式出來(lái),大致邏輯是依托 agent 來(lái)做到,
其基本原理如下:
每個(gè) db-agent 上都獨(dú)立實(shí)現(xiàn)如下接口
獲取集群拓?fù)浣Y(jié)構(gòu)&—(self *MHA)GetDBTopology()
生成配置文件—(self *MHA)BuildMHAConfig()
節(jié)點(diǎn)互信—(self *MHA)WriteRsaPubilcKey()
啟動(dòng)—(self *MHA)StartMHA()
MHA進(jìn)程實(shí)時(shí)監(jiān)控—(self *MHA)MHAProcessMonitor()
定時(shí)配置文件與拓?fù)浣Y(jié)構(gòu)匹配巡查—(self *MHA)InspectMHAConfigIsOK()
關(guān)閉—(self *MHA)StopMHA()
切換—(self *MHA)SwitchMHA()
2. 平臺(tái)按照一定順序依次調(diào)用上述接口來(lái)完成整個(gè)MHA的從搭建到管理的全部過(guò)程,整個(gè)過(guò)程完全由平臺(tái)來(lái)完成,極大的減少了 DBA 維護(hù) MHA 的成本。過(guò)去DBA要配置或者M(jìn)HA切換后的維護(hù)時(shí)間在2-10分鐘左右現(xiàn)在控制在3秒以內(nèi)。
基于 Agent 的管理更加輕量級(jí),也避免了manager 節(jié)點(diǎn)外溢帶來(lái)的各種問(wèn)題也避免了傳統(tǒng)的部署方式上的復(fù)雜性,維護(hù)0成本,與平臺(tái)整合非常簡(jiǎn)單。
平臺(tái)在將上述接口調(diào)用封裝成獨(dú)立的 API 后可供其他自動(dòng)化平臺(tái)調(diào)用這將為下一步的完全無(wú)人管理提供支持。
資源池&一鍵安裝
過(guò)去業(yè)務(wù)擴(kuò)容需要100臺(tái)機(jī)器,提交給 base 需求兩天后給你一個(gè) Excel 或者一個(gè) wiki 頁(yè)面,我們拿到機(jī)器之后去寫一些腳本,通過(guò)一些工具或者自動(dòng)化平臺(tái)刷資源環(huán)境檢查和安裝腳本,但是每個(gè)人可能做法不一樣,做出來(lái)東西五花八門,非常不統(tǒng)一。
別人維護(hù)的時(shí)候覺(jué)得沒(méi)有問(wèn)題,當(dāng)換你維護(hù)時(shí)候覺(jué)得很奇怪,為什么這樣做?不夠整齊劃一,標(biāo)準(zhǔn)化推行不是太好。
我們現(xiàn)在 DBA 基本上不需要關(guān)心這些,DBA只需要看我們資源池是否有空閑機(jī)器,如果資源不足只要負(fù)責(zé)申請(qǐng)資源即可,其他工作基本都可以由agent自動(dòng)完成。
擴(kuò)容與遷移
我們 2015年 到 2016年先后經(jīng)歷了遷移到 CDB 然后又遷移到 RDS 最后又做自己的數(shù)據(jù)庫(kù)災(zāi)備系統(tǒng),期間遷移的集群數(shù)超過(guò) 3000+ 套,平均每套集群遷移兩到三次,這么多遷移量,通過(guò)人很難完成的。
以災(zāi)備為例,做災(zāi)備時(shí)候公司給我們 DBA 的團(tuán)隊(duì)遷移時(shí)間是兩周之內(nèi),那時(shí)候?qū)⒔?300 多套集群全部遷移到災(zāi)備機(jī)房里面去,實(shí)際上我們只用兩天時(shí)間。
當(dāng)時(shí)我們一個(gè)人用了不到一個(gè)小時(shí)的時(shí)間寫了一個(gè)從集群搭建到調(diào)用數(shù)據(jù)庫(kù)遷移接口的腳本快速的拉起全部遷移任務(wù)。
自動(dòng)遷移會(huì)依托我們調(diào)度集群來(lái)完成全部的遷移工作。對(duì)于日常的自動(dòng)擴(kuò)容遷移,DBA只需要一鍵即可完成全部遷移過(guò)程。
這里我們思考一下有什么手段可以完全避免DBA來(lái)點(diǎn)這一下按鈕呢?這里我個(gè)人覺(jué)得對(duì)于平臺(tái)化的過(guò)程其實(shí)也是所有操作API化的一個(gè)過(guò)程,對(duì)于這點(diǎn)按鈕的動(dòng)作本身就是調(diào)用一個(gè)API,假設(shè)我們現(xiàn)在有一套更加高度自動(dòng)化的系統(tǒng)(有的大公司稱為智能系統(tǒng)^_^)能自動(dòng)判斷出容量不足時(shí)自動(dòng)調(diào)用該API不就完全自動(dòng)擴(kuò)容了嗎?
DBA 都不需要去人工觸發(fā),雖然這是小小的一個(gè)操作也能被省略(那么 DBA 后面該何去何從呢?)。
我們現(xiàn)在可以說(shuō)依靠平臺(tái)基本上完成了絕大部分標(biāo)準(zhǔn)化、規(guī)范化的工作,任何一個(gè) DBA 只要通過(guò)平臺(tái)來(lái)完成日常必要的工作,做出來(lái)的東西都是整齊劃一的,完全避免人的因素導(dǎo)致的差異。
誤操作閃回
2018年至今我們已經(jīng)做了差不多有4次線上誤操作,我們都在很快的時(shí)間幫用戶做到快速回滾。
目前社區(qū)有很多關(guān)于回滾的解決方案,但是充分調(diào)研之后我還是決定自己造輪子(這里又回到前面提到的關(guān)于開(kāi)源及造輪子的問(wèn)題)。
這里簡(jiǎn)單闡述原因:
開(kāi)源的優(yōu)點(diǎn)是通用性普適性比較強(qiáng),但是場(chǎng)景化的定制一般比較麻煩
目前的開(kāi)源工具都是基于命令行來(lái)完成必要的操作的,當(dāng)真的線上需要緊急回滾時(shí)還要登錄掉服務(wù)器然后在輸入一堆的參數(shù)解析……
這不符合我對(duì)平臺(tái)化的要求,既然是平臺(tái)化,這一系列的操作起碼必須是能在界面里面選一選、點(diǎn)一點(diǎn)就能完成的。
也就是說(shuō)使用要足夠簡(jiǎn)單,尤其這類緊急操作花費(fèi)的時(shí)間要足夠短,沒(méi)必要當(dāng)著一堆開(kāi)發(fā)的面把命令行敲的賊溜來(lái)秀肌肉。
我們的場(chǎng)景復(fù)雜舉例說(shuō)明:我們有一套集群?jiǎn)伪矸制?1024 片,總共分了32套集群,有一天開(kāi)發(fā)突然找來(lái)說(shuō)有部分?jǐn)?shù)據(jù)被誤操作了你該如何進(jìn)行處理?
這里表是被sharding的,開(kāi)發(fā)可能是不知道這批數(shù)據(jù)落在哪個(gè)sharding片里面。所以你必須解析全部的 32 個(gè)節(jié)點(diǎn)上的 binlog, 這時(shí)你通過(guò)開(kāi)源的腳本吭哧吭哧起了32個(gè)進(jìn)程然后你的cpu爆了,網(wǎng)卡爆了……這里分片解析實(shí)際上32個(gè)進(jìn)程是不行的。
如果解析腳本不支持對(duì)解析的 rowsEvent.Table表名的正則匹配的話恐怕要起1024個(gè)進(jìn)程……
考慮到上述場(chǎng)景有合適自己場(chǎng)景的解析工具是非常必要的。
這里我用go來(lái)實(shí)現(xiàn)采用了 github.com/siddontang/go-mysql/replication 解析模塊,實(shí)現(xiàn)后的解析工具是一個(gè)服務(wù)化的組件,可以多節(jié)點(diǎn)部署應(yīng)對(duì)上述sharding的解析場(chǎng)景,被服務(wù)化后可以被平臺(tái)直接調(diào)用。
當(dāng)真的出現(xiàn)誤操作時(shí),DBA操作時(shí)也不用揪心手抖……所以造每個(gè)輪子都有他的理由而不僅僅是愛(ài)好。
任務(wù)調(diào)度
我們的調(diào)度服務(wù)其實(shí)是用 go 重寫了 linux Crontab 的邏輯并且支持到了秒級(jí),同時(shí)也為了方便管理加了一些管理模塊實(shí)現(xiàn)服務(wù)化,主要還是方便平臺(tái)調(diào)用(也是避免 DBA 手工去配置 crontab )。
平臺(tái)對(duì)調(diào)度節(jié)點(diǎn)進(jìn)行整合實(shí)現(xiàn)一個(gè)邏輯上的調(diào)度集群(后續(xù)會(huì)改造成真正意義上的調(diào)度集群,其實(shí)改造方式也簡(jiǎn)單,只要在調(diào)度節(jié)點(diǎn)里面加上節(jié)點(diǎn)自動(dòng)注冊(cè)然后加一個(gè)簡(jiǎn)單的任務(wù)分發(fā)器實(shí)現(xiàn)負(fù)載均衡即可),同時(shí)對(duì)日志功能做了增強(qiáng),通過(guò)調(diào)度可以自動(dòng)的把執(zhí)行過(guò)程中輸出的日志記錄下來(lái)方便日后追溯原因。
同時(shí)也支持捕獲并記錄調(diào)度腳本 exit code 方便對(duì)于有些特殊腳本并非只有成功or 失敗兩種狀態(tài)的記錄。
舉個(gè)例子比如一個(gè)腳本執(zhí)行過(guò)程中可能有會(huì)有很多種 panic 的可能,但是如果把這些panic的原因都?xì)w結(jié)為腳本執(zhí)行異常并exit(-1)[系統(tǒng)默認(rèn)的退出碼],這樣似乎也是可以的。
但是這樣 DBA 在檢查自己的任務(wù)狀態(tài)時(shí)發(fā)現(xiàn)異常時(shí)不能直接的定位錯(cuò)誤而是要去翻具體的執(zhí)行錯(cuò)誤日志,顯得不夠快捷(這也是用戶體驗(yàn)的點(diǎn))。
因此 DBA 在只需要在平臺(tái)里面定義好錯(cuò)誤代碼對(duì)照表即可在painc時(shí)捕獲異常然后exit(exit_code)即可,當(dāng)DBA巡查自己的任務(wù)時(shí)能清晰的知道錯(cuò)誤原因。
SqlReview
最初我們的 Sql 審核由開(kāi)源的 Inception 來(lái)實(shí)現(xiàn),但是由于我們需要加入更多校驗(yàn)規(guī)則,需要做一些定制修改,但是團(tuán)隊(duì)內(nèi)對(duì)又不太了解 c,所以很多情況下開(kāi)發(fā)提交發(fā)布 sql 工單后都是由我們的 DBA 在來(lái)人肉審核一遍的,我們現(xiàn)在平均每天100+的DDL DBA根本審核不過(guò)來(lái)即使審核到了還是會(huì)漏很多規(guī)則,人工是不能保證一定可靠的。
所以搞自己的審核系統(tǒng)是很必要的,但是要獨(dú)立寫一個(gè)sql-parser模塊難度還是非常大的,在充分調(diào)研了 python&go 的開(kāi)源實(shí)現(xiàn)后最終選擇了tidb的解析模塊,于是項(xiàng)目很快就落地了。在完全覆蓋Inception的規(guī)則后也做了相關(guān)擴(kuò)展也就是加入我們自定義的規(guī)則
擴(kuò)展索引的相關(guān)校驗(yàn)
冗余索引的校驗(yàn)(如ix_a(a),ix_ab(a,b))
索引中枚舉類型的校驗(yàn)
組合索引中不能包含主鍵或者索引
建表時(shí)必須包含自增id的主鍵
重復(fù)索引的校驗(yàn)(如啼笑皆非的ix_a(a), ix_aa(a)求開(kāi)發(fā)的心里陰影面積?)
組合索引列不能超過(guò)3個(gè)
組合索引列時(shí)間等可能涉及范圍查詢的列(類型)必須放在最后一位(如ix_created_time_userid(created_time,userid)這樣的索引意義大嗎?)
索引泛濫攔截(恨不得每個(gè)字段都建立一個(gè)索引……)
varchar(N>128)攔截或者提示(警惕!開(kāi)發(fā)可能要寫like了……)
索引命名規(guī)范檢查(開(kāi)發(fā)取的索引名稱五花八門,甚至有用的劣質(zhì)orm框架生成一個(gè)uuid的索引名稱,當(dāng)DBA在進(jìn)行執(zhí)行explain時(shí)看到這個(gè)很頭疼根部看不出到底使用了什么索引,往往還要多執(zhí)行一次show……)
風(fēng)險(xiǎn)識(shí)別攔截或者放行
刪索引會(huì)根據(jù)元數(shù)據(jù)來(lái)判斷是否表或者索引是否在使用(這依托大量的元數(shù)據(jù)收集&分析,過(guò)去DBA看見(jiàn)刪除操作很頭疼要各種驗(yàn)證最終在操作時(shí)還要集群內(nèi)灰度操作)
禁止刪列操作
Modify操作損失進(jìn)度檢查(如text->varchar,varchar(100)->varchar(10)等都是禁止的)
Modify操作丟失屬性檢查(改問(wèn)題很隱蔽可能有天開(kāi)發(fā)說(shuō)default值丟失了那多半是某次ddl時(shí)modify語(yǔ)句沒(méi)有帶上原字段屬性導(dǎo)致的,當(dāng)這引發(fā)故障時(shí)肯定有人會(huì)指責(zé)DBA為啥你沒(méi)審核到?MMP)
禁止跨庫(kù)操作(防止開(kāi)發(fā)通過(guò)create table Notmydb.table來(lái)意外的給別人創(chuàng)建表)
禁止一切Truncate,Drop操作
內(nèi)建規(guī)范檢查
大字段使用規(guī)范約束(比如一個(gè)表里面超過(guò)一定比例的varchar,包含longtext等大文本類型)
DB,表,索引命名規(guī)范約束檢查
多活必要的字段及屬性檢查
歷史校驗(yàn)結(jié)果數(shù)據(jù)沉淀
通過(guò)數(shù)據(jù)分析準(zhǔn)確的知道哪些產(chǎn)研或者開(kāi)發(fā)在上述方面犯錯(cuò)最多(DBA跟開(kāi)發(fā)的關(guān)系往往也是斗智斗勇的關(guān)系你懂得……)
這里不得不說(shuō)的是過(guò)去我們?yōu)榱朔乐归_(kāi)發(fā)違反上述規(guī)則除了人肉審核外還對(duì)開(kāi)發(fā)去培訓(xùn)但是這往往都沒(méi)有用該犯的錯(cuò)誤還是會(huì)不斷的犯,所以我們現(xiàn)在基本不在去搞什么培訓(xùn)了,完全由系統(tǒng)自動(dòng)來(lái)完成審核。
這里我一直強(qiáng)調(diào)的是任何標(biāo)準(zhǔn)化/規(guī)范化都是必須能夠?qū)戇M(jìn)代碼里的否則實(shí)施起來(lái)必然有缺漏。
多活下的發(fā)布系統(tǒng)
數(shù)據(jù)庫(kù)多活的架構(gòu)大致是這樣M?DRC?M這里drc是我們的多機(jī)房數(shù)同步工具,這里可以把數(shù)據(jù)庫(kù)多活理解成雙Master系統(tǒng)只是用drc代替了雙master下的原生復(fù)制。
這種架構(gòu)下對(duì)DBA的維護(hù)挑戰(zhàn)還是非常大的時(shí)間關(guān)系只分享關(guān)于數(shù)據(jù)庫(kù)發(fā)布的相關(guān)內(nèi)容這也是最重要的一塊。
說(shuō)到數(shù)據(jù)庫(kù)發(fā)布基本上就是在說(shuō)DDL對(duì)吧,一直以來(lái)DDL對(duì)開(kāi)發(fā)來(lái)說(shuō)都是非常頭疼的,DBA往往會(huì)選擇pt工具來(lái)完成DDL操作,但是受到pt是基于觸發(fā)器實(shí)現(xiàn)的影響DDL期間會(huì)產(chǎn)生鎖等待現(xiàn)象這會(huì)造成業(yè)務(wù)上的影響,過(guò)去我們也在這上面吃過(guò)很多次虧。
Alter通過(guò)什么方式來(lái)進(jìn)行?
原生DDL多機(jī)房并行執(zhí)行
DRC不支持
機(jī)房間延遲不可可控,機(jī)房?jī)?nèi)延遲巨大
PT-OSC多機(jī)房并行執(zhí)行
″ Row模式下大表的DDL會(huì)產(chǎn)生大量的binlog IDC間的網(wǎng)絡(luò)瓶頸造成全局性影響
″ Pt工具在不同機(jī)房間最終的rename階段時(shí)間點(diǎn)不同造成機(jī)房間數(shù)據(jù)結(jié)構(gòu)不一致導(dǎo)致DRC復(fù)制失敗最終導(dǎo)致不可控的數(shù)據(jù)延遲
″ 基于觸發(fā)器的實(shí)現(xiàn)會(huì)產(chǎn)生額外的鎖-對(duì)業(yè)務(wù)影響明顯
″ 基于Pt源碼改造困難也難以與平臺(tái)整合(3P語(yǔ)言只剩下了python……)
Gh-ost多機(jī)房并行執(zhí)行(基于go實(shí)現(xiàn))
″ 增量數(shù)據(jù)基于binlog解析實(shí)現(xiàn)避免觸發(fā)器的影響
″ 基于Go實(shí)現(xiàn)為改造提供可能
關(guān)于go-ost這里不打算多講大家可以去githup上看作者對(duì)實(shí)現(xiàn)原理的說(shuō)明
這里還是簡(jiǎn)要提一下其大致工作流程
創(chuàng)建中間表臨時(shí)表
對(duì)該臨時(shí)表進(jìn)行DDL
在master或者slave上注冊(cè)slave接收binlog并解析對(duì)應(yīng)表的events事件
apply events 到臨時(shí)表
從原表copy數(shù)據(jù)到臨時(shí)表
cut-over(我們的改造點(diǎn)從這里開(kāi)始)相當(dāng)于pt的rename階段
我們做了一個(gè)協(xié)調(diào)器,每個(gè)gh-ost 在 ddl 過(guò)程中都上報(bào)自己的執(zhí)行進(jìn)度,同時(shí)我們?cè)?cut-over 前加了一層攔截。
必須等待多個(gè) gh-ost 都完成數(shù)據(jù) copy 后,多個(gè) gh-ost 節(jié)點(diǎn)才會(huì)同時(shí)進(jìn)入 cut-over 階段。
這樣就保證了多機(jī)房同步 rename 進(jìn)而來(lái)避免延遲的產(chǎn)生(事實(shí)上我們機(jī)房間的延遲都控制在秒級(jí))。這里大家可能會(huì)有疑問(wèn)直接在一個(gè)機(jī)房做不行嗎?可以依靠drc同步???
這里首先drc不支持DDL操作這樣就決定了沒(méi)法通過(guò)drc同步方式來(lái)進(jìn)行,其次機(jī)房間帶寬有限D(zhuǎn)DL期間產(chǎn)生大量binlog會(huì)造成帶寬打滿的問(wèn)題。
我們?cè)谶M(jìn)行雙機(jī)房同步DDL時(shí)為了防止DRC應(yīng)用了gh-ost產(chǎn)生的events DRC會(huì)主動(dòng)丟棄gh-ost產(chǎn)生的binlog具體是根據(jù)tablename
命名規(guī)則來(lái)區(qū)分。
對(duì) gh-ost 的改造還包含添加多機(jī)房負(fù)載均衡功能,由于DB 是多機(jī)房部署的,你 gh-ost 工具肯定不能部署在一個(gè)機(jī)房里(解析binlog速度太慢,copy 數(shù)據(jù)過(guò)程非常慢主要是消耗在網(wǎng)絡(luò)上的延時(shí)了)。
但是多機(jī)房部署也還是不夠的,還得是每個(gè)機(jī)房都部署幾套 gh-ost 系統(tǒng)。
因?yàn)楫?dāng)開(kāi)發(fā)同時(shí) DDL的量比較大時(shí),單臺(tái) gh-ost 系統(tǒng)會(huì)因?yàn)橐馕龅?binlog 量非常大導(dǎo)致 cpu、網(wǎng)卡流量非常高,影響性能(跟前面提到的閃回功能是同一個(gè)道理)。
搞定發(fā)布系統(tǒng)后 DBA 再也不用苦逼的值班搞發(fā)布了,起初我們搞了一個(gè)自動(dòng)化執(zhí)行系統(tǒng),每天系統(tǒng)會(huì)自動(dòng)完成絕大多數(shù)的工單發(fā)布工作。后來(lái)我們完全交給開(kāi)發(fā)自行來(lái)執(zhí)行。
現(xiàn)在從開(kāi)發(fā)申請(qǐng)發(fā)布到最終發(fā)布完全由開(kāi)發(fā)自助完成自助率平均在95%左右極少有DBA干預(yù)的情況。
隨著數(shù)據(jù)庫(kù)的不斷進(jìn)步與完善甚至開(kāi)始往selfdrive上發(fā)展加之這兩年devops,AIops的快速發(fā)展也許留給傳統(tǒng)運(yùn)維DBA的時(shí)間真的不多了(不是我在鼓吹相信大家也能感受的到),我想除了時(shí)刻的危機(jī)感 + 積極擁抱變化外沒(méi)有其他捷徑了。
聲明:文章收集于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系小編及時(shí)處理,謝謝!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/3945.html
摘要:數(shù)人云告別人肉運(yùn)維上海的實(shí)錄第二彈來(lái)啦本次分享的嘉賓是餓了么團(tuán)隊(duì)負(fù)責(zé)人虢國(guó)飛。虢國(guó)飛餓了么團(tuán)隊(duì)負(fù)責(zé)人從事數(shù)據(jù)庫(kù)領(lǐng)域年,主要關(guān)注于數(shù)據(jù)庫(kù)管理自動(dòng)化建設(shè)和等領(lǐng)域的研究。本次主題關(guān)于數(shù)據(jù)安全的保障。在這一層,餓了么做了一些數(shù)據(jù)方面相關(guān)的保護(hù)。 數(shù)人云告別人肉運(yùn)維上海Meetup的實(shí)錄第二彈來(lái)啦!本次分享的嘉賓是餓了么DBA團(tuán)隊(duì)負(fù)責(zé)人虢國(guó)飛。實(shí)錄將從用戶訪問(wèn)、數(shù)據(jù)庫(kù)架構(gòu)體系、數(shù)據(jù)備份、數(shù)據(jù)流轉(zhuǎn)...
摘要:數(shù)人云告別人肉運(yùn)維上海的實(shí)錄第二彈來(lái)啦本次分享的嘉賓是餓了么團(tuán)隊(duì)負(fù)責(zé)人虢國(guó)飛。虢國(guó)飛餓了么團(tuán)隊(duì)負(fù)責(zé)人從事數(shù)據(jù)庫(kù)領(lǐng)域年,主要關(guān)注于數(shù)據(jù)庫(kù)管理自動(dòng)化建設(shè)和等領(lǐng)域的研究。本次主題關(guān)于數(shù)據(jù)安全的保障。在這一層,餓了么做了一些數(shù)據(jù)方面相關(guān)的保護(hù)。 數(shù)人云告別人肉運(yùn)維上海Meetup的實(shí)錄第二彈來(lái)啦!本次分享的嘉賓是餓了么DBA團(tuán)隊(duì)負(fù)責(zé)人虢國(guó)飛。實(shí)錄將從用戶訪問(wèn)、數(shù)據(jù)庫(kù)架構(gòu)體系、數(shù)據(jù)備份、數(shù)據(jù)流轉(zhuǎn)...
摘要:另外小程序云應(yīng)用有一套高可用架構(gòu),提供監(jiān)控預(yù)警能力。自主可控小程序云應(yīng)用提供服務(wù)器,開(kāi)發(fā)者可以擁有登錄或重啟,也可以修改密碼。也就是說(shuō),服務(wù)器是由小程序云應(yīng)用提供,但使用權(quán)歸開(kāi)發(fā)者?! ∏安痪糜幸粋€(gè)朋友問(wèn)我,到底是做什么端的小程序比較好? 我只問(wèn)了一句,你的產(chǎn)品里是否涉及錢和服務(wù),如果涉及這兩者,建議你選擇支付寶小程序。你可以通過(guò)其他小程序玩裂變,但如果你想做服務(wù)和商業(yè),一定要考慮支付寶...
摘要:那么還有最后一個(gè)問(wèn)題,那我之前設(shè)置的定時(shí)器怎么辦呢定時(shí)器執(zhí)行的是這個(gè)函數(shù),而這個(gè)函數(shù)又會(huì)通過(guò)進(jìn)行一次判斷。 我們?cè)谔幚硎录臅r(shí)候,有些事件由于觸發(fā)太頻繁,而每次事件都處理的話,會(huì)消耗太多資源,導(dǎo)致瀏覽器崩潰。最常見(jiàn)的是我們?cè)谝苿?dòng)端實(shí)現(xiàn)無(wú)限加載的時(shí)候,移動(dòng)端本來(lái)滾動(dòng)就不是很靈敏,如果每次滾動(dòng)都處理的話,界面就直接卡死了。 因此,我們通常會(huì)選擇,不立即處理事件,而是在觸發(fā)一定次數(shù)或一定時(shí)間...
摘要:有一次別人的云服務(wù)器被攻擊,提供商竟然重啟了物理機(jī)然后又諸多悲劇出現(xiàn)。造成微博服務(wù)短暫不可用。通過(guò)建立工具來(lái)診斷問(wèn)題,并創(chuàng)建一種復(fù)盤事故的文化來(lái)推動(dòng)并作出改進(jìn),防止未來(lái)發(fā)生故障。 showImg(https://segmentfault.com/img/bV0jif?w=900&h=385); 相信小伙伴們?cè)谏暇W(wǎng)或者玩游戲的時(shí)候一定都遇到過(guò)無(wú)法訪問(wèn)的情況。服務(wù)器炸了的原因有各種各樣,下...
閱讀 965·2023-04-25 22:13
閱讀 2401·2019-08-30 15:56
閱讀 2287·2019-08-30 11:21
閱讀 713·2019-08-30 11:13
閱讀 2074·2019-08-26 14:06
閱讀 2027·2019-08-26 12:11
閱讀 2349·2019-08-23 16:55
閱讀 595·2019-08-23 15:30