閱讀420 返回首頁    go 小米 go 小米6


微店MySQL自動化運維體係的構建之路

前言 

 

互聯網時代,數據庫如何滿足敏捷開發、敏捷交付的要求?傳統靠DBA人肉執行的方式,但在麵對大量業務需求時,DBA手速再快,記憶力再好估計也不能提供好的數據庫服務。在介紹自動化運維之前,我們先來了解下如何使用數據庫。

 

數據庫的使用方式主要有兩種:

 

應用混合部署(實例):有新數據庫需求時,很多人都會選擇找個實例,建個數據庫和帳號提供給業務。

 

好處是能快速提供數據庫服務,這種方式在數據庫運維的過程中會出現一些問題:

  • 第一,相互影響,個別應用有問題會影響所有數據庫;

  • 第二, 應用DB的性能指標(QPS,TPS,RT...)不能獲取;

  • 第三,定位問題源困難;

  • 第四,資源使用不合理。

 

為了解決以上問題,最終會有拆庫的過程,拆過庫的同學都知道,一個拆庫動作需要確認很多東西,所花費的時間是非常多的,過程中容易產生故障。

 

應用獨享(實例):在虛擬化,微服務深入人心的今天,應用獨享實例是數據庫給出的解決辦法。我們做到的是所有應用獨享實例(分庫分表的應用如:分成32個庫的應用,業務初期階段會分布在幾個實例中,業務確實需要更多資源時再進行自動化拆庫擴容)。這種方式需要大量的實例,傳統單機單實例的運維體係就需要演變成單機多實例的方式。

 

由此引出會有一係列問題需要解決:

  • 如何快速提供數據庫服務?

  • 如何避免數據庫資源合理分配?

  • 數據庫監控怎麼做?

  • 多實例數據庫HA怎麼做?

 

MySQL的標準化與自動化 

 

我們實現的MySQL自動化運維體係能夠解決規模化的痛點,主要包括實例創建、部署、監控、備份、HA切換、遷移、擴容等方麵的自動化,所有模塊的主發點是要能“自動化”的方式運作,盡量少的人為參與。

 

一、標準化

 

數據庫上了一定規模後,數據庫的各方麵都需要標準規範起來,才能接下去做自動化。實例上的標準化我們主要做了以下幾點:

 

1、應用獨享實例

 

2、數據庫M<==>S結構,備庫不提供業務流量(異地容災除外)

 

很多人會選擇一主多備,備庫提供讀流量。這種架構引起的故障挺多的,因為備庫一定會存在延時,備庫機器也會掛掉。事實上大部分時候流量都在主庫是沒問題,如果確實主庫壓力真的太大怎麼辦,我們應該及時發現問題並作出應對(方法可以是緩存+拆庫)。

 

3、MySQL標準化(帶thread_pool 功能MySQL)

 

  • 數據庫版本一致

  • “相同”的my.cnf(除個別個性參數如server_id,buffer_pool_size等)

  • 文件目錄一致

 

二、構建MySQL自動化運維體係

 

一套好的大規模運維體係DBManage,整體思路是讓一切自動化起來,不需要打通機器間的信任關係,避免或減少人為參與。

 

20161227095454616.jpg

 

1、多實例創建

 

一台機器上麵開啟多個不同的端口,運行多個MySQL服務進程,共用MySQL程序,使用不同配置文件,提供服務。

 

關鍵點:

  • “相同”的my.cnf(除個別個性參數如server_id,buffer_pool_size等)

  • 數據文件目錄標準化

  • 創建實例(1.初始化一個標準的數據庫,2.新建實例通過rsync控製速率,通過修改 " my.cnf " 文件新建不同實例,因為mysql_install_db安裝新實例會占用過多IO)    

 

2、元數據與監控

 

數據庫監控沒有采用類似“lepus”的方式,中心控製的方式對於規模化精細化數據庫管理衝突。

 

中心化存在問題:

  1. 增加實例需要手動錄入;

  2. 不能獲取響應時間RT(tcprstat);

  3. 不能獲取主機性能數據等等。

 

我們采用自研 db_agent 實現實例的自動發現,各項元數據及性能數據采集,告別人工處理。

 

每台數據庫服務器上運行db_agent;自動發現實例,自動采集實例數據,主機數據,磁盤數據,自動添加監控。db_agent主要實現以下功能。

 

  • 采集實例信息(數據庫列表,複製信息,表元數據等等)

  • 心跳更新(每秒更新,因為show slave status的延時是不可靠的)

  • 數據庫性能數據( QPS, TPS......)

  • 數據庫響應時間RT(tcprstat)

  • 實時慢SQL

  • 主機性能數據(告別Zabbix)

 

3、備份

 

數據庫機器部署備份腳本(不區分是否主備機器),告別手動配置。

 

  • 隻備份備庫(備份前判斷腳色)

  • 多實例並發控製(控製速率及時間)

  • 直接寫入HDFS 或Server(推薦HDFS存儲)

 

4、本地執行agent

 

遠程操作DB機器(創建實例,恢複數據庫,etc),通過自定義一些消息調起DB機器對應腳本進行操作。

 

5、監控告警

 

基於db_agent采集數據,性能畫圖及告警。性能數據寫入graphite。

 

6、MySQL高可用

 

傳統的使用MHA做MySQL HA架構是比較通用的方案,主要特點:通過Health Check 監控MySQL集群,應用通過VIP訪問MySQL,VIP通過keepalive選主。這裏不展開這種方式和一些改進型(Zookeeper +MHA)的痛點,主要講下多實例下基於Zookeeper是怎麼實現MySQL自動化高可用。

 

改造後的HA架構,跟通常架構的區別在於我們去掉了MySQL集群裏的VIP,使用VDDS替代;完全去掉MHA。通過Zookeeper分布式,實現ha_console的高可用。

 

20161227095511173.jpg

 

整個流程是:

 

  • VDDS(微店分布式數據庫) 新建應用配置

  • ha_agent向Zookeeper注冊臨時節點,並實時更新實例信息。

 

{

    "source_db_role": "slave",

    "master_instance": "192.168.1.12_3306",

    "repl_status": "ok",

    "h_time_delay": 0,

    "repl_delay": 0,

    "last_change_time": "2016-10-15-01:00:45"

}

 

  • ha_console根據Zookeeper節點信息構造切換元數據(包括延時,切換對象,複製狀態)

 

"192.168.1.11_3306": "{

    "source_db_role": "master",

    "master_instance": "192.168.1.12_3306",

    "repl_status": "ok",

    "h_time_delay": 0,

    "repl_delay": 0,

    "last_change_time": "2016-10-15-01:00:45"

}"

 

  • ha_console監聽alive目錄臨時節點

  • alive目錄臨時節點消失進行切換(判斷延時及複製狀態,不符合條件不切換),切換VDDS和數據庫

  • 切換前記錄切換信息(slave:master_log_file: mysql-bin.000007,exec_master_log_pos: 57830。主庫恢複後,用來生成日誌解析)

 

場景一:實例Crash,實例所在的服務器正常運行,ha_agent運行正常。

 

實例Crash,ha_agent 正常運行,主動刪除Zookeeper 臨時節點,ha_console 判斷數據庫角色,是主庫走切換流程。原實例起來之後,作為備庫運行。 

 

場景二:實例所在的主機Crash。(實例和ha_agent同時Crash)

 

此時,由於ha_agent和實例同時Crash,Zookeeper到ha_agent間的通訊失敗。Zookeeper 等待超過租約的時間,ha_console 判斷數據庫角色,是主庫走切換流程。原實例起來之後,作為備庫運行。 

 

場景三:實例正常,網絡異常。

 

網絡異常會發生大量實例掉線或部份異常。大量節點異常:ha_console判斷時間範圍內異常實例數量,超過閥值不進行切換,同時切換過程:切換腳本會去判斷數據庫狀態,避免誤切。(Zookeeper client 連接掉線後,盡管實例及ha_agent正常運行,節點不能重用必須等待超時)

 

特點:完全不需要人工建入,切換元數據自動構建,所有實例自動注冊,構造完整的切換元數據,避免了繁鎖的配置或配置出錯導致不能切換。

 

7、DBTask

 

通過DBTask 替代人工操作。實現了數據庫創建,配置VDDS, 數據庫遷移,拆庫擴容,恢複等等。整體思路是分解動作,每個腳本幹一件事,再串起所有腳本。以數據庫遷移為例我們可以分解為各個子任務,串起任務就是一個完整的自動化數據庫遷移任務。

 

數據庫遷移:

  • 申請可用資源

  • 實例創建

  • 恢複備庫A

  • 恢複備庫B

  • 配置數據源(VDDS)

  • 切換前檢查

  • 切換

  • 清除VDDS配置

  • 關閉老實例

 

數據庫資源申請:

  • 申請可用資源

  • 實例創建

  • 新建庫,MySQL帳號

  • 配置數據源(VDDS)

 

成果及展望 

 

全套自動化運維體係采用:後台由python+shell+go(實時慢SQL解析部分);前端采用laravel+angularjs。 目前單機日常環境運行100+實例,agent的資源占用不多;業務申請數據庫資源<1分鍾完成;自動化拆庫(部份老的合在一起的還是要拆的)等等。

 

另外隨著MySQL自動化運維的深入,我們慢慢地發現這將會演變數據庫成私有雲平台。對於如何更好地服務業務,如何診斷業務數據庫等還需要我們去完善。

 原文發布時間為:2016-12-27

本文來自雲棲社區合作夥伴DBAplus

最後更新:2017-05-13 08:42:33

  上一篇:go  阿裏雲將增設馬來西亞數據中心 納吉布總理大讚中國技術
  下一篇:go  為什麼說產品化是私有IaaS的唯一出路?