噹噹網資深DBA:DB運維四大現代化的實現(有彩蛋)
講師介紹
趙鋼
噹噹網資深DBA
- OCP 9i認證專家,十年以上Oracle及Linux/HP-UX技術經驗。
- 曾負責管理電信通訊話單資料庫、中國移動簡訊營銷資料庫、足彩福彩支付資料庫、多語種部落格社群資料庫。
各位好,今天我的主題是 《DB運維的四個現代化》 ,看標題就能明白,是關於DBA自動化運維平臺的事情。
主要是分享下我在噹噹想到做到的一些事情,很多都是兄弟們一起努力的結果, 這篇文章也是對我們工作進行一次總結,整個平臺的實現方法並沒有用到什麼高大上的框架,有亮點的地方我會著重說明,當然,有興趣瞭解的同學,直接提問就好。
本次分享將分為以下三部分進行:
- 解密DB管理四大現代化
- 例項分析實踐痛點
- 從資訊展現開始一步步解決
一DB管理四大現代化
首先先聊下DB在專案中的地位:
- 99%的軟體,處理的資料最終是需要落地
- 從人員結構來說,DBA支援公司多專案
- 資料要安全,資料要及時,許可權要收口
於是,DBA的工作經常成為專案進展的瓶頸。
然而,在錯綜複雜的電商環境中, 資料庫又獨具特色。一提到電商: 自然想到,雙11,秒殺,大促等等, 於是下面3個特點也就不言而喻。
在噹噹網,我們的DB規模是這樣的,資料截止到2016年3月,而現在又在增長……T_T
因此就會有這樣的工作需求:
- 商品單品專案組、新來的開發同學,需要了解單品專案的表設計結構;
- 購物車專案管理的同學需要同步最新資料,檢查專案執行效果;
- 訂單專案的同學需要檢查實時資料,監控訂單量(授權給radar監控資料來源);
- 測試的同學需要檢查迴歸測試的資料效果。
二例項分析實踐痛點
商品分類專案程式出現了bug,導致分類錯誤, 最有效的辦法莫過於:DB中需要修改幾條資料。
- 專案擴容,需要部署從庫,專案遷移,需要切換到從庫;
- 硬體故障,需要切換;
- 所有專案大大小小 500+個DB例項 (ノ゚⊿゚)ノ So,不理想的狀態下, 以上工作×500倍;
- DBA負責按工單匯出資料,工單多了就放開查詢許可權,
- 人員流動(←_←),於是一堆不明許可權,資料安全無法保證。
於是,DBA們也在思考,和開發專案拼人肉數目,肯定不切實際,我們需要自動化的平臺。
根據以上問題,我們做了幾個選擇:
- 哪些資訊是可以共享給開發部門的。
- 哪些操作DBA可以自動,符合標準的進行。
- 用什麼方法儘可能保證資料的實時準確性
用下圖來回答:
平臺主要分為:資訊收集展現,DBA管理工具兩大部分。
資料庫的元資料可以被全體技術部乃至業務部訪問。但資料細節,只能有限訪問(許可權申請需要經過審批)這些只讀的訪問,一次授權,即可自助進行。
對於資料庫管理(部署,備份,恢復),DBA也要編寫指令碼,按標準進行。後面會盡量詳細介紹。
三從資訊展現開始一步步解決
1、資訊收集展現
先說明下,關於資料庫元資料的展現:
上圖可見,借用phpmyadmin工具(右圖),對於元資料的展現還是很完美的。完全可以替代左圖的命令列模式。
當然,這裡的phpmyadmin是經過修剪功能的版本,去掉了諸多管理,展示資料細節的部分。
對於申請過許可權的使用者,才可以訪問到受限的資料細節。
同時對於資料本身,也進行了限制性修改 ,僅能訪問 500行的資料:
對於元資料也進行了抓取和歸檔(主要用shell+python定時執行 實現),這樣做有幾個好處:
1、便於在整個公司專案範圍內,巨集觀的、快速的、模糊的查詢想要的元資料。
2、基於元資料的定期歸檔,可得出資料空間變化的規律。
例如我們平臺的如下功能:
3、還可以對元資料進行統計,迅速得出那些是我們急需調優的目標(需水平拆分的大表,需垂直拆分的寬表,需要刪除的重複索引,需要擴容的autoid等等)。
例如,我們平臺的如下功能:
展示出來就是這樣(圖表展示我採用highchart,MySQL只負責用SQL吐資料,展示的活,就交給highchart 了):
4、管理伺服器列表,對於所有伺服器的固定埠(資料庫埠)進行掃描,及登陸測試,獲取庫名,角色(主or從),等資訊。
對於效能和監控資料,採用同樣的方法進行抓取和分析,(資料來源取自zabbix監控資料庫)
這樣做的好處是:
- 看出近期那些效能指標頻繁報警,需要擴容,需要調優
- 那些伺服器是過載,那些卻過分規劃即使大促也是輕載。
(上圖遮蔽的主要是一些ip和庫名資訊.)
2、DBA管理工具
這部分我們也在進行中,目前DB的安裝/部署的基本已經實現指令碼化,主要包括下面的指令碼。
下面是部分指令碼的功能說明:
該指令碼的主要功能:
- 根據標準初始化完成的系統,自動安裝相關軟體包,備份時部署在叢集的從庫,且無域名的從庫優先,
- 關於備份空間的判斷,先根據資料量估算本次備份所需空間,如果備份空間滿足,則備份到該從庫的本地,如果不滿足則集中備份到大空間伺服器。
備份會保留多個備份週期的備份集. 如空間吃緊,備份前,則會優先刪除日期靠前的備份集。
該指令碼的主要功能:
- 初始化MySQL時候生成環境檢查
- 根據記憶體大小動態計算buffer pool大小以及隨機值server-id
innoDB_buffer_pool_size=記憶體*80%
server-id=[IP點分十進的後兩段]+三個隨機數
- 公共使用者許可權匯入以及匯入後驗證
該指令碼的主要功能:
- 從備份檔案{logical,xtrabackup}恢復一個例項;
- 從一個從庫直接{logical,xtrabackup}建立一個從庫;
- 從一個主庫直接{logical,xtrabackup}建立一個從庫。
對於日常比較頻繁執行的DML語句,通常處於開發部門修改資料解決線上bug的問題,我們採用了inception的部分功能,結合已經收集到的伺服器列表.,只需指定將SQL即可,平臺會自動送到該庫指向的主庫上執行DML語句。
採用inception的功能主要是對SQL的稽核功能,例如,如果該SQL的影響行數超限,則終止執行。
平臺則對SQL執行進行歷史記錄。
DBA管理工具這邊也在逐步完成對上述管理指令碼的平臺化。
我的分享基本就是這些, 關於平臺及工具的程式碼,我們也在逐步做脫敏工作,爭取形成一個可以開源出來的產品, 希望對大家有些啟發,也希望拋磚引玉。
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)