国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

留給傳統 DBA 的時間不多了?看餓了么如何構建數據庫平臺自動化

explorer_ddf / 906人閱讀

摘要:因為傳統的數據庫管理方式在當前這種架構下依靠手工或者借助簡單的工具是無法應對多活架構大規模管理帶來的復雜性,因此平臺化顯得非常重。我們在做的方案時做了充分調查及論證,最終沒有選擇這種方式。

蔡鵬,2015年加入餓了么,見證了餓了么業務&技術從0到1的發展過程,并全程參與了數據庫及DBA團隊高速發展全過程。同時也完成個人職能的轉型-由運維DBA到DEV-DBA的轉變,也從DB的維穩轉變到專心為DBA團隊及DEV團隊的賦能。

從時間軸上看我們每年會有一個比較大的前進,我們從人肉->工具化->平臺化->自助化只用了兩年半時間完成全部迭代,其中平臺化&自助化+數據庫多活改造我們一口氣用了8個月的時間完成全部開發及改造工作。

在完成平臺化改造的同時,我們數據庫架構也從傳統的主從架構發展到異地多活架構,這對DBA的挑戰是巨大的,但這也是平臺必須能夠解決的。

因為傳統的數據庫管理方式在當前這種架構下依靠 DBA 手工或者借助簡單的工具是無法應對多活架構 + 大規模管理帶來的復雜性,因此平臺化顯得非常重。

隨著平臺化的推進,DBA 職能角色發也在生變化,過去 DBA 在運維和維護上消耗,現在 DBA 更加專注業務做價值輸出。

這里個人覺得 DBA 長期在運維層面過多花費時間不斷修補各種層面漏缺,其實是不健康的,雖然每天很忙但是新問題依舊會很多。

整體功能的概覽

DB-Agent:數據采集 + 進程管理 + 遠程腳本 & Linux 命令調用 + 與平臺耦合的接口

MM-OST:無傷 DDL 系統根據 gh-ost 源碼改造實現多活場景下的數據庫發布

Tinker:go 重寫了 linux crontab 的邏輯支持到秒級 + 管理接口與平臺整合實現調度集群管理日常任務調度

Checksum:多機房數據一致性檢查

SQLReview:go 實現的類似開源的Inception SQL審核工具并做了功能上的增強

Luna:優化后的報警系統(大規模實例下如何減少報警且不漏關鍵報警)

VDBA:報警自動處理系統,代替DBA完成對線上DB的冒煙&報警的處理

今天沒有去講一些方法論,這不是我擅長的,我覺得還是能給大家介紹一些具體點的內容,這樣可能了解的能清楚一些。

實時監控&快速排障

這對于DBA是非常常見的事情,一般出問題或者接到報警,通常都要登錄到服務器,一通命令敲下來可能花的時間最少兩分鐘,然后得出一個有慢SQL或者其他什么原因。

其實這個診斷過程完全可以被自動化掉,日常處理問題的核心原則是“快”(我們高峰期線上故障一分鐘損失幾萬單)。

而平臺必須能提供這樣的能力,出問題時盡量減少 DBA 思考的時間直接給出現象 + 原因縮短決策時間(甚至必要時系統可以自動處理掉有些問題都不必DBA參與)。

基于我們的監控大盤 DBA 可以清晰的知道當前全服所有實例是否有異常,那些有異常及是什么類型的異常或冒煙都會清晰呈現。

監控大盤將 DBA 日常管理過程中所有的命令集都整合到一起。

DBA 只需要簡單的點點按鈕系統就會自動執行所有命令并做好 sql 執行計劃分析、鎖分析、sql執行時間分布、歷史趨勢分析,數據庫歷史 processlist 快照查看等常見操作。

雖然這些功能看似簡單但是卻非常實用,提高了DBA故障定位的效率。

報警處理自動化

報警處理自動化目前主要包括:

空間問題自動處理

未提交事物處理

長查詢自動kill

CPU/連接數據/thread runing過多分析及處理

復制無損修復(1032,1062)

過去在處理復制數據不一致異常時同行都是 skip掉,但是這樣缺陷很多同時會留下數據不一致的隱患。

目前我們采用的是解析 binlog的方式來做到較精確修復,避免了傳統的skip方式的缺陷。有人可能會說目前社區有很多開源的東西能解決你前面提到的報警問題,為啥非要自己寫一個呢?

比如 pt 工具能幫你處理,auto kill 一些數據庫有問題的sql,也能幫你跳過復制的錯誤,或者 github 上也有開源的實現能做到無損修復復制問題?

這里的關于重復造輪的問題我覺得是對待開源態度的問題,開源固然能解決一些問題,但是不同的場景對應不同的開源工具。 當你把這些輪子拼湊到一起時難以形成一個有機整體。

尤其是你在進行平臺化建設時必須要考慮清楚這個問題,否則純粹的開源堆砌出來的系統是難以維護的不可靠的,對于開源我們可以用其思想造自己合適的輪子。

MHA自動化管理

在 8.0 之前絕大部分公司高可用實現還是基于HHA。MHA實現不可避免的要解決部署的問題。

最初我們是搞一個部署腳本在跳板機上,mysql 安裝時就打通與跳板機的互信工作然后由該腳本在來打通集群節點間的互信工作,然后在一個slave 上啟動 mha 管理進程。

或者是將該管理進程固定在集群外面的某一個或者多個服務器上集中部署&監控,然而這樣會有什么問題呢?

重度依賴ssh

搭建過程復雜

manager 管理節點外溢到一臺或多臺機器后影響可靠性的因素增多

維護復雜,配置有效性存疑會因此造成穩定性風險

與平臺整合過于復雜,平臺如果要管理監控manager節點需要借助ssh或多帶帶實現一個agent。

這種架構管理幾十套或者上百套集群時還能勉強應付。當上千套時管理就很復雜整體很脆弱出問題后維護工作量大。

我們在做MHA的方案時做了充分調查及論證,最終沒有選擇這種方式。

最終我們決定多帶帶搞一套管理方式出來,大致邏輯是依托 agent 來做到,

其基本原理如下:

每個 db-agent 上都獨立實現如下接口

獲取集群拓撲結構&—(self *MHA)GetDBTopology()

生成配置文件—(self *MHA)BuildMHAConfig()

節點互信—(self *MHA)WriteRsaPubilcKey()

啟動—(self *MHA)StartMHA()

MHA進程實時監控—(self *MHA)MHAProcessMonitor()

定時配置文件與拓撲結構匹配巡查—(self *MHA)InspectMHAConfigIsOK()

關閉—(self *MHA)StopMHA()

切換—(self *MHA)SwitchMHA()

2. 平臺按照一定順序依次調用上述接口來完成整個MHA的從搭建到管理的全部過程,整個過程完全由平臺來完成,極大的減少了 DBA 維護 MHA 的成本。過去DBA要配置或者MHA切換后的維護時間在2-10分鐘左右現在控制在3秒以內。

基于 Agent 的管理更加輕量級,也避免了manager 節點外溢帶來的各種問題也避免了傳統的部署方式上的復雜性,維護0成本,與平臺整合非常簡單。

平臺在將上述接口調用封裝成獨立的 API 后可供其他自動化平臺調用這將為下一步的完全無人管理提供支持。

資源池&一鍵安裝

過去業務擴容需要100臺機器,提交給 base 需求兩天后給你一個 Excel 或者一個 wiki 頁面,我們拿到機器之后去寫一些腳本,通過一些工具或者自動化平臺刷資源環境檢查和安裝腳本,但是每個人可能做法不一樣,做出來東西五花八門,非常不統一。

別人維護的時候覺得沒有問題,當換你維護時候覺得很奇怪,為什么這樣做?不夠整齊劃一,標準化推行不是太好。

我們現在 DBA 基本上不需要關心這些,DBA只需要看我們資源池是否有空閑機器,如果資源不足只要負責申請資源即可,其他工作基本都可以由agent自動完成。

擴容與遷移

我們 2015年 到 2016年先后經歷了遷移到 CDB 然后又遷移到 RDS 最后又做自己的數據庫災備系統,期間遷移的集群數超過 3000+ 套,平均每套集群遷移兩到三次,這么多遷移量,通過人很難完成的。

以災備為例,做災備時候公司給我們 DBA 的團隊遷移時間是兩周之內,那時候將近 300 多套集群全部遷移到災備機房里面去,實際上我們只用兩天時間。

當時我們一個人用了不到一個小時的時間寫了一個從集群搭建到調用數據庫遷移接口的腳本快速的拉起全部遷移任務。

自動遷移會依托我們調度集群來完成全部的遷移工作。對于日常的自動擴容遷移,DBA只需要一鍵即可完成全部遷移過程。

這里我們思考一下有什么手段可以完全避免DBA來點這一下按鈕呢?這里我個人覺得對于平臺化的過程其實也是所有操作API化的一個過程,對于這點按鈕的動作本身就是調用一個API,假設我們現在有一套更加高度自動化的系統(有的大公司稱為智能系統^_^)能自動判斷出容量不足時自動調用該API不就完全自動擴容了嗎?

DBA 都不需要去人工觸發,雖然這是小小的一個操作也能被省略(那么 DBA 后面該何去何從呢?)。

我們現在可以說依靠平臺基本上完成了絕大部分標準化、規范化的工作,任何一個 DBA 只要通過平臺來完成日常必要的工作,做出來的東西都是整齊劃一的,完全避免人的因素導致的差異。

誤操作閃回

2018年至今我們已經做了差不多有4次線上誤操作,我們都在很快的時間幫用戶做到快速回滾。

目前社區有很多關于回滾的解決方案,但是充分調研之后我還是決定自己造輪子(這里又回到前面提到的關于開源及造輪子的問題)。

這里簡單闡述原因:

開源的優點是通用性普適性比較強,但是場景化的定制一般比較麻煩

目前的開源工具都是基于命令行來完成必要的操作的,當真的線上需要緊急回滾時還要登錄掉服務器然后在輸入一堆的參數解析……

這不符合我對平臺化的要求,既然是平臺化,這一系列的操作起碼必須是能在界面里面選一選、點一點就能完成的。

也就是說使用要足夠簡單,尤其這類緊急操作花費的時間要足夠短,沒必要當著一堆開發的面把命令行敲的賊溜來秀肌肉。

我們的場景復雜舉例說明:我們有一套集群單表分片是 1024 片,總共分了32套集群,有一天開發突然找來說有部分數據被誤操作了你該如何進行處理?

這里表是被sharding的,開發可能是不知道這批數據落在哪個sharding片里面。所以你必須解析全部的 32 個節點上的 binlog, 這時你通過開源的腳本吭哧吭哧起了32個進程然后你的cpu爆了,網卡爆了……這里分片解析實際上32個進程是不行的。

如果解析腳本不支持對解析的 rowsEvent.Table表名的正則匹配的話恐怕要起1024個進程……

考慮到上述場景有合適自己場景的解析工具是非常必要的。

這里我用go來實現采用了 github.com/siddontang/go-mysql/replication 解析模塊,實現后的解析工具是一個服務化的組件,可以多節點部署應對上述sharding的解析場景,被服務化后可以被平臺直接調用。

當真的出現誤操作時,DBA操作時也不用揪心手抖……所以造每個輪子都有他的理由而不僅僅是愛好。

任務調度

我們的調度服務其實是用 go 重寫了 linux Crontab 的邏輯并且支持到了秒級,同時也為了方便管理加了一些管理模塊實現服務化,主要還是方便平臺調用(也是避免 DBA 手工去配置 crontab )。

平臺對調度節點進行整合實現一個邏輯上的調度集群(后續會改造成真正意義上的調度集群,其實改造方式也簡單,只要在調度節點里面加上節點自動注冊然后加一個簡單的任務分發器實現負載均衡即可),同時對日志功能做了增強,通過調度可以自動的把執行過程中輸出的日志記錄下來方便日后追溯原因。

同時也支持捕獲并記錄調度腳本 exit code 方便對于有些特殊腳本并非只有成功or 失敗兩種狀態的記錄。

舉個例子比如一個腳本執行過程中可能有會有很多種 panic 的可能,但是如果把這些panic的原因都歸結為腳本執行異常并exit(-1)[系統默認的退出碼],這樣似乎也是可以的。

但是這樣 DBA 在檢查自己的任務狀態時發現異常時不能直接的定位錯誤而是要去翻具體的執行錯誤日志,顯得不夠快捷(這也是用戶體驗的點)。

因此 DBA 在只需要在平臺里面定義好錯誤代碼對照表即可在painc時捕獲異常然后exit(exit_code)即可,當DBA巡查自己的任務時能清晰的知道錯誤原因。

SqlReview

最初我們的 Sql 審核由開源的 Inception 來實現,但是由于我們需要加入更多校驗規則,需要做一些定制修改,但是團隊內對又不太了解 c,所以很多情況下開發提交發布 sql 工單后都是由我們的 DBA 在來人肉審核一遍的,我們現在平均每天100+的DDL DBA根本審核不過來即使審核到了還是會漏很多規則,人工是不能保證一定可靠的。

所以搞自己的審核系統是很必要的,但是要獨立寫一個sql-parser模塊難度還是非常大的,在充分調研了 python&go 的開源實現后最終選擇了tidb的解析模塊,于是項目很快就落地了。在完全覆蓋Inception的規則后也做了相關擴展也就是加入我們自定義的規則

擴展索引的相關校驗

冗余索引的校驗(如ix_a(a),ix_ab(a,b))

索引中枚舉類型的校驗

組合索引中不能包含主鍵或者索引

建表時必須包含自增id的主鍵

重復索引的校驗(如啼笑皆非的ix_a(a), ix_aa(a)求開發的心里陰影面積?)

組合索引列不能超過3個

組合索引列時間等可能涉及范圍查詢的列(類型)必須放在最后一位(如ix_created_time_userid(created_time,userid)這樣的索引意義大嗎?)

索引泛濫攔截(恨不得每個字段都建立一個索引……)

varchar(N>128)攔截或者提示(警惕!開發可能要寫like了……)

索引命名規范檢查(開發取的索引名稱五花八門,甚至有用的劣質orm框架生成一個uuid的索引名稱,當DBA在進行執行explain時看到這個很頭疼根部看不出到底使用了什么索引,往往還要多執行一次show……)

風險識別攔截或者放行

刪索引會根據元數據來判斷是否表或者索引是否在使用(這依托大量的元數據收集&分析,過去DBA看見刪除操作很頭疼要各種驗證最終在操作時還要集群內灰度操作)

禁止刪列操作

Modify操作損失進度檢查(如text->varchar,varchar(100)->varchar(10)等都是禁止的)

Modify操作丟失屬性檢查(改問題很隱蔽可能有天開發說default值丟失了那多半是某次ddl時modify語句沒有帶上原字段屬性導致的,當這引發故障時肯定有人會指責DBA為啥你沒審核到?MMP)

禁止跨庫操作(防止開發通過create table Notmydb.table來意外的給別人創建表)

禁止一切Truncate,Drop操作

內建規范檢查

大字段使用規范約束(比如一個表里面超過一定比例的varchar,包含longtext等大文本類型)

DB,表,索引命名規范約束檢查

多活必要的字段及屬性檢查

歷史校驗結果數據沉淀

通過數據分析準確的知道哪些產研或者開發在上述方面犯錯最多(DBA跟開發的關系往往也是斗智斗勇的關系你懂得……)

這里不得不說的是過去我們為了防止開發違反上述規則除了人肉審核外還對開發去培訓但是這往往都沒有用該犯的錯誤還是會不斷的犯,所以我們現在基本不在去搞什么培訓了,完全由系統自動來完成審核。

這里我一直強調的是任何標準化/規范化都是必須能夠寫進代碼里的否則實施起來必然有缺漏。

多活下的發布系統

數據庫多活的架構大致是這樣M?DRC?M這里drc是我們的多機房數同步工具,這里可以把數據庫多活理解成雙Master系統只是用drc代替了雙master下的原生復制。

這種架構下對DBA的維護挑戰還是非常大的時間關系只分享關于數據庫發布的相關內容這也是最重要的一塊。

說到數據庫發布基本上就是在說DDL對吧,一直以來DDL對開發來說都是非常頭疼的,DBA往往會選擇pt工具來完成DDL操作,但是受到pt是基于觸發器實現的影響DDL期間會產生鎖等待現象這會造成業務上的影響,過去我們也在這上面吃過很多次虧。

Alter通過什么方式來進行?

原生DDL多機房并行執行

DRC不支持

機房間延遲不可可控,機房內延遲巨大

PT-OSC多機房并行執行

″ Row模式下大表的DDL會產生大量的binlog IDC間的網絡瓶頸造成全局性影響

″ Pt工具在不同機房間最終的rename階段時間點不同造成機房間數據結構不一致導致DRC復制失敗最終導致不可控的數據延遲

″ 基于觸發器的實現會產生額外的鎖-對業務影響明顯

″ 基于Pt源碼改造困難也難以與平臺整合(3P語言只剩下了python……)

Gh-ost多機房并行執行(基于go實現)

″ 增量數據基于binlog解析實現避免觸發器的影響

″ 基于Go實現為改造提供可能

關于go-ost這里不打算多講大家可以去githup上看作者對實現原理的說明

這里還是簡要提一下其大致工作流程

創建中間表臨時表

對該臨時表進行DDL

在master或者slave上注冊slave接收binlog并解析對應表的events事件

apply events 到臨時表

從原表copy數據到臨時表

cut-over(我們的改造點從這里開始)相當于pt的rename階段

我們做了一個協調器,每個gh-ost 在 ddl 過程中都上報自己的執行進度,同時我們在 cut-over 前加了一層攔截。

必須等待多個 gh-ost 都完成數據 copy 后,多個 gh-ost 節點才會同時進入 cut-over 階段。

這樣就保證了多機房同步 rename 進而來避免延遲的產生(事實上我們機房間的延遲都控制在秒級)。這里大家可能會有疑問直接在一個機房做不行嗎?可以依靠drc同步啊?

這里首先drc不支持DDL操作這樣就決定了沒法通過drc同步方式來進行,其次機房間帶寬有限DDL期間產生大量binlog會造成帶寬打滿的問題。

我們在進行雙機房同步DDL時為了防止DRC應用了gh-ost產生的events DRC會主動丟棄gh-ost產生的binlog具體是根據tablename

命名規則來區分。

對 gh-ost 的改造還包含添加多機房負載均衡功能,由于DB 是多機房部署的,你 gh-ost 工具肯定不能部署在一個機房里(解析binlog速度太慢,copy 數據過程非常慢主要是消耗在網絡上的延時了)。

但是多機房部署也還是不夠的,還得是每個機房都部署幾套 gh-ost 系統。

因為當開發同時 DDL的量比較大時,單臺 gh-ost 系統會因為要解析的 binlog 量非常大導致 cpu、網卡流量非常高,影響性能(跟前面提到的閃回功能是同一個道理)。

搞定發布系統后 DBA 再也不用苦逼的值班搞發布了,起初我們搞了一個自動化執行系統,每天系統會自動完成絕大多數的工單發布工作。后來我們完全交給開發自行來執行。

現在從開發申請發布到最終發布完全由開發自助完成自助率平均在95%左右極少有DBA干預的情況。

隨著數據庫的不斷進步與完善甚至開始往selfdrive上發展加之這兩年devops,AIops的快速發展也許留給傳統運維DBA的時間真的不多了(不是我在鼓吹相信大家也能感受的到),我想除了時刻的危機感 + 積極擁抱變化外沒有其他捷徑了。

聲明:文章收集于網絡,如有侵權,請聯系小編及時處理,謝謝!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/3945.html

相關文章

  • 活動實錄|拒絕"刪庫到跑路",探究餓了么數據安全保障體系

    摘要:數人云告別人肉運維上海的實錄第二彈來啦本次分享的嘉賓是餓了么團隊負責人虢國飛。虢國飛餓了么團隊負責人從事數據庫領域年,主要關注于數據庫管理自動化建設和等領域的研究。本次主題關于數據安全的保障。在這一層,餓了么做了一些數據方面相關的保護。 數人云告別人肉運維上海Meetup的實錄第二彈來啦!本次分享的嘉賓是餓了么DBA團隊負責人虢國飛。實錄將從用戶訪問、數據庫架構體系、數據備份、數據流轉...

    xiaowugui666 評論0 收藏0
  • 活動實錄|拒絕"刪庫到跑路",探究餓了么數據安全保障體系

    摘要:數人云告別人肉運維上海的實錄第二彈來啦本次分享的嘉賓是餓了么團隊負責人虢國飛。虢國飛餓了么團隊負責人從事數據庫領域年,主要關注于數據庫管理自動化建設和等領域的研究。本次主題關于數據安全的保障。在這一層,餓了么做了一些數據方面相關的保護。 數人云告別人肉運維上海Meetup的實錄第二彈來啦!本次分享的嘉賓是餓了么DBA團隊負責人虢國飛。實錄將從用戶訪問、數據庫架構體系、數據備份、數據流轉...

    qc1iu 評論0 收藏0
  • 小程序上云,有點猛

    摘要:另外小程序云應用有一套高可用架構,提供監控預警能力。自主可控小程序云應用提供服務器,開發者可以擁有登錄或重啟,也可以修改密碼。也就是說,服務器是由小程序云應用提供,但使用權歸開發者。  前不久有一個朋友問我,到底是做什么端的小程序比較好?   我只問了一句,你的產品里是否涉及錢和服務,如果涉及這兩者,建議你選擇支付寶小程序。你可以通過其他小程序玩裂變,但如果你想做服務和商業,一定要考慮支付寶...

    jsdt 評論0 收藏0
  • Debounce vs Throttle

    摘要:那么還有最后一個問題,那我之前設置的定時器怎么辦呢定時器執行的是這個函數,而這個函數又會通過進行一次判斷。 我們在處理事件的時候,有些事件由于觸發太頻繁,而每次事件都處理的話,會消耗太多資源,導致瀏覽器崩潰。最常見的是我們在移動端實現無限加載的時候,移動端本來滾動就不是很靈敏,如果每次滾動都處理的話,界面就直接卡死了。 因此,我們通常會選擇,不立即處理事件,而是在觸發一定次數或一定時間...

    xcold 評論0 收藏0
  • SegmentFault 技術周刊 Vol.39 - 什么!服務器炸了?

    摘要:有一次別人的云服務器被攻擊,提供商竟然重啟了物理機然后又諸多悲劇出現。造成微博服務短暫不可用。通過建立工具來診斷問題,并創建一種復盤事故的文化來推動并作出改進,防止未來發生故障。 showImg(https://segmentfault.com/img/bV0jif?w=900&h=385); 相信小伙伴們在上網或者玩游戲的時候一定都遇到過無法訪問的情況。服務器炸了的原因有各種各樣,下...

    1treeS 評論0 收藏0

發表評論

0條評論

explorer_ddf

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<