1. 程式人生 > >噹噹網資深DBA:DB運維四大現代化的實現(有彩蛋)

噹噹網資深DBA:DB運維四大現代化的實現(有彩蛋)

講師介紹

趙鋼

趙鋼

噹噹網資深DBA

  • OCP 9i認證專家,十年以上Oracle及Linux/HP-UX技術經驗。
  • 曾負責管理電信通訊話單資料庫、中國移動簡訊營銷資料庫、足彩福彩支付資料庫、多語種部落格社群資料庫。

各位好,今天我的主題是 《DB運維的四個現代化》 ,看標題就能明白,是關於DBA自動化運維平臺的事情。

主要是分享下我在噹噹想到做到的一些事情,很多都是兄弟們一起努力的結果, 這篇文章也是對我們工作進行一次總結,整個平臺的實現方法並沒有用到什麼高大上的框架,有亮點的地方我會著重說明,當然,有興趣瞭解的同學,直接提問就好。

本次分享將分為以下三部分進行:

  1. 解密DB管理四大現代化
  2. 例項分析實踐痛點
  3. 從資訊展現開始一步步解決

DB管理四大現代化

首先先聊下DB在專案中的地位:

DB

  • 99%的軟體,處理的資料最終是需要落地
  • 從人員結構來說,DBA支援公司多專案
  • 資料要安全,資料要及時,許可權要收口

於是,DBA的工作經常成為專案進展的瓶頸。

然而,在錯綜複雜的電商環境中, 資料庫又獨具特色。一提到電商: 自然想到,雙11,秒殺,大促等等,   於是下面3個特點也就不言而喻。

電商資料庫運維特色

在噹噹網,我們的DB規模是這樣的,資料截止到2016年3月,而現在又在增長……T_T

運維DB

因此就會有這樣的工作需求:

  • 商品單品專案組、新來的開發同學,需要了解單品專案的表設計結構;
  • 購物車專案管理的同學需要同步最新資料,檢查專案執行效果;
  • 訂單專案的同學需要檢查實時資料,監控訂單量(授權給radar監控資料來源);
  • 測試的同學需要檢查迴歸測試的資料效果。

例項分析實踐痛點

商品分類專案程式出現了bug,導致分類錯誤, 最有效的辦法莫過於:DB中需要修改幾條資料。

  • 專案擴容,需要部署從庫,專案遷移,需要切換到從庫;
  • 硬體故障,需要切換;
  • 所有專案大大小小 500+個DB例項   (ノ゚⊿゚)ノ  So,不理想的狀態下, 以上工作×500倍;
  • DBA負責按工單匯出資料,工單多了就放開查詢許可權,
  • 人員流動(←_←),於是一堆不明許可權,資料安全無法保證。

於是,DBA們也在思考,和開發專案拼人肉數目,肯定不切實際,我們需要自動化的平臺。

根據以上問題,我們做了幾個選擇:

  • 哪些資訊是可以共享給開發部門的。
  • 哪些操作DBA可以自動,符合標準的進行。
  • 用什麼方法儘可能保證資料的實時準確性

用下圖來回答:

DB

平臺主要分為:資訊收集展現,DBA管理工具兩大部分。

資料庫的元資料可以被全體技術部乃至業務部訪問。但資料細節,只能有限訪問(許可權申請需要經過審批)這些只讀的訪問,一次授權,即可自助進行。

對於資料庫管理(部署,備份,恢復),DBA也要編寫指令碼,按標準進行。後面會盡量詳細介紹。

從資訊展現開始一步步解決

1、資訊收集展現

先說明下,關於資料庫元資料的展現:

資訊收集

上圖可見,借用phpmyadmin工具(右圖),對於元資料的展現還是很完美的。完全可以替代左圖的命令列模式。

當然,這裡的phpmyadmin是經過修剪功能的版本,去掉了諸多管理,展示資料細節的部分。

對於申請過許可權的使用者,才可以訪問到受限的資料細節。

同時對於資料本身,也進行了限制性修改 ,僅能訪問 500行的資料:

資料

對於元資料也進行了抓取和歸檔(主要用shell+python定時執行 實現),這樣做有幾個好處:

1、便於在整個公司專案範圍內,巨集觀的、快速的、模糊的查詢想要的元資料。

2、基於元資料的定期歸檔,可得出資料空間變化的規律。

例如我們平臺的如下功能:

資料庫資訊

9

3、還可以對元資料進行統計,迅速得出那些是我們急需調優的目標(需水平拆分的大表,需垂直拆分的寬表,需要刪除的重複索引,需要擴容的autoid等等)。

例如,我們平臺的如下功能:

元資料統計

展示出來就是這樣(圖表展示我採用highchart,MySQL只負責用SQL吐資料,展示的活,就交給highchart 了):

highchart 了 highchart 了

4、管理伺服器列表,對於所有伺服器的固定埠(資料庫埠)進行掃描,及登陸測試,獲取庫名,角色(主or從),等資訊。

管理伺服器列表

對於效能和監控資料,採用同樣的方法進行抓取和分析,(資料來源取自zabbix監控資料庫)

這樣做的好處是:

  1. 看出近期那些效能指標頻繁報警,需要擴容,需要調優
  2. 那些伺服器是過載,那些卻過分規劃即使大促也是輕載。

資源管理

管理伺服器列表

(上圖遮蔽的主要是一些ip和庫名資訊.)

2、DBA管理工具

這部分我們也在進行中,目前DB的安裝/部署的基本已經實現指令碼化,主要包括下面的指令碼。

DBA管理工具

下面是部分指令碼的功能說明:

指令碼

該指令碼的主要功能:

  1. 根據標準初始化完成的系統,自動安裝相關軟體包,備份時部署在叢集的從庫,且無域名的從庫優先,
  2. 關於備份空間的判斷,先根據資料量估算本次備份所需空間,如果備份空間滿足,則備份到該從庫的本地,如果不滿足則集中備份到大空間伺服器。

備份會保留多個備份週期的備份集. 如空間吃緊,備份前,則會優先刪除日期靠前的備份集。

指令碼

該指令碼的主要功能:

  1. 初始化MySQL時候生成環境檢查
  2. 根據記憶體大小動態計算buffer pool大小以及隨機值server-id

    innoDB_buffer_pool_size=記憶體*80%

    server-id=[IP點分十進的後兩段]+三個隨機數

  3. 公共使用者許可權匯入以及匯入後驗證

指令碼

該指令碼的主要功能:

  1. 從備份檔案{logical,xtrabackup}恢復一個例項;
  2. 從一個從庫直接{logical,xtrabackup}建立一個從庫;
  3. 從一個主庫直接{logical,xtrabackup}建立一個從庫。

對於日常比較頻繁執行的DML語句,通常處於開發部門修改資料解決線上bug的問題,我們採用了inception的部分功能,結合已經收集到的伺服器列表.,只需指定將SQL即可,平臺會自動送到該庫指向的主庫上執行DML語句。

採用inception的功能主要是對SQL的稽核功能,例如,如果該SQL的影響行數超限,則終止執行。

平臺則對SQL執行進行歷史記錄。

SQL

DBA管理工具這邊也在逐步完成對上述管理指令碼的平臺化。

我的分享基本就是這些, 關於平臺及工具的程式碼,我們也在逐步做脫敏工作,爭取形成一個可以開源出來的產品, 希望對大家有些啟發,也希望拋磚引玉。

Q&A

Q1:目前的高可用是用什麼方案?

A1:我們預期用MHA,目前還未有這方面的架構。

Q2:你們是如何進行跨機房的管理的?slave的延遲如何保證在業務可忍受的範圍內的?

A2:slave延遲的問題主要從開發方面分解大事務解決。跨機房方面我們目前也儘量避免跨機房的主從架構搭建。

Q3:如何設計MySQL架構來滿足如搶購類的高併發的業務?

A3:大促、秒殺業務這些方面,主要靠提前壓測,並觀察效能瓶頸,擴容和回收也是以效能(cpu,網路連線,磁碟)為依據來進行。

Q4:目前應對大促,秒殺業務,資料庫層面擴容縮容,能否給出一些建議。

A4:這方面需要時間來改進,我們目前還很不完善,其實很多功能也是噹噹架構特色來設計的。即使開源也是為內部版本控制考慮。所以還未有這份精力配合。

Q5:如果要分庫分表,推進這些東西開發會配合嗎?

A5:我們架構部有這方面的中間價,叫sharding-JDBC,可以關注下github上的專案。

Q6:MySQL一個表最多存多少記錄算大資料?有哪些合適的分表方式?

A6:存多少不重要,關鍵要看怎麼使用它,是讀多,寫多,還是改多,對於一般的系統,最起碼把讀寫分離開吧。

Q7:請問你們在線上如何解決DDL和批量delete or update 100萬級的資料的?

A7:DDL是靠pt-online-schema-change工具,百萬級的delete也是靠這個工具分配進行的。

文章出處:DBAplus社群(訂閱號ID: dbaplus)