MySQL分佈式數據庫高可用實踐:架構、複製機制、多機房

下載網站:www.SyncNavigator.CN 
 客服QQ1793040
----------------------------------------------------------git


關於HKROnline SyncNavigator 註冊機價格的問題redis

 

 

HKROnline SyncNavigator 8.4.1 非破解版 註冊機 受權激活教程
 算法

 

 

 

最近一直在研究數據庫同步的問題,在網上查了不少資料,也請教了不少人,找到了一種經過快照複製的方法。研究了一番後發現以前就是用的這個方法,效果不是很好,果斷放棄。通過了一番尋覓和他人指點,最後從一位熱心網友那裏得知一款很好用的軟件—— SyncNavigator。sql

 

 

好東西就要拿出來跟你們分享,因此今天向你們介紹一下這款軟件,及其一些使用方法。下面先看看它有什麼強大的功能吧!數據庫

 

SyncNavigator的基本功能:後端

 

自動同步數據/定時同步數據
不管是實時同步/24小時不間斷同步,仍是根據計劃任務(每小時/每日/每週/等)定時自動同步都能徹底勝任。緩存

完整支持 Microsoft SQL Server
完整支持 Microsoft SQL Server 2000 2005 2008 數據庫類型。並能在不一樣數據庫版本之間相互同步數據。服務器

支持 MySQL 4.1 以上版本
支持 MySQL 4.1 5.0 5.1 5.4 5.5。並能在不一樣數據庫版本之間相互同步數據。網絡

無人值守和故障自動恢復
當數據庫故障或網絡故障之後,無需人工干預(或操做)自動恢復同步並確保數據徹底準確,可靠。架構

同構數據庫同步/異構數據庫同步
SQL Server to SQL Server, MySQL to MySQL, SQL Server to MySQL 等都能輕鬆實現。

斷點續傳和增量同步
當同步完成(或中斷)後,再次同步時能繼續上一次的位置增量同步,避免每次都須要從頭開始的問題。

你們好!我是網易數據運維工程師杜明友,你們能夠叫我老杜。首先介紹一下網易雲,是網易集團旗下雲計算和大數據品牌,本文要深刻分析的案例是網易雲旗下的即時通信雲平臺業務,開發者經過集成客戶端SDK和雲端OPEN API,便可快速實現強大的IM功能,做爲PaaS服務模式的網易雲信全面支持Android、iOS、Web、PC等多平臺。還提供了高級通信功能,包括實時音視頻、互動直播、教學白板、專線電話、短信、專屬雲在內的獨家功能以及更多其餘服務。網易雲信知足包括遊戲、協同辦公、在線醫療、在線客服、在線教育、娛樂、諮詢、生活服務、物流、旅遊、金融等各行業各類產品的即時通信服務需求。客戶案例有順豐、寶寶樹、挖財網、網易雲音樂、網易雲課堂等等。分佈式數據庫架構介紹  

做爲時下最火爆的IM雲服務,網易雲無時不刻不在爲百萬商家億級終端用戶提供便捷的即時通訊服務。商家產品爆款、用戶活躍交流都在考驗着咱們的業務系統。如何保障系統的穩定運行,支撐更大的併發,提供真正的可擴展的IM雲服務一直是咱們很是關注的一個問題。

做爲互聯網的一支老牌勁旅,咱們在大併發海量互聯網系統構建方面也有着很是深厚的積累與經驗。在數據庫選擇上咱們使用了網易私有云中的分佈式數據庫服務(雲DDB)

其架構圖以下

MySQL分佈式數據庫高可用實踐:架構、複製機制、多機房

雲DDB主要包括五個組件: NLB、SQL Proxy、DBN、Master、SYSDB

  1. NLB是負載均衡服務,基於LVS打造,負責將應用請求轉發到後端SQL Proxy, 同時定時檢測後端SQL Proxy的可用性,及時將故障機器從集羣中摘除。
  2. SQL Proxy實現了MySQL協議,接收客戶端請求,同時負責將請求路由到具體的後端數據庫節點,並返回數據給客戶端。若是數據請求分佈在多個節點,則可能使用2PC協議進行分佈式事務(保障數據一致性)。
  3. DBN則是底層真正負責數據存取的服務,一般是一個關係型數據庫,目前支持MySQL、Oracle。
  4. Master是管理服務,負責管理集羣,好比新建表、設置數據路由策略、設置客戶端鏈接池參數、DBN切換、配置變動通知等,操做結果(集羣元數據)將持久化到SYSDB。
  5. SYSDB是一個數據庫,負責存儲分佈式數據庫的元數據信息,包括表、字段、權限、數據路由等信息

DBN與SYSDB使用的是網易私有云RDS,其它組件則部署在使用雲主機上,雲DDB服務的核心組件SQL Proxy以及DBN都是可擴展的,而且高可用的。

DDB處理邏輯簡單來講就是應用請求經過NLB轉發到具體SQL Proxy上,SQL Proxy解析SQL生成執行計劃,下發請求至底層節點,收到DBN數據後作必定的處理返回給客戶端。

高可用分佈式DB服務構建指南  

網易IM雲服務目標是支持彈性擴展、消息必達,那就須要在保證高吞吐、高性能的同時,那就須要數據的高可用性:簡單而言就是數據存儲服務要高可用而且數據不丟失。

由於關係型數據庫發展幾十年在穩定性方面對比其餘數據存儲方案來講存在很是大的優點,基於此,業務不少對數據一致性的場景都是直接依賴於DB。

好比爲了保證消息準確到達,發送方的消息須要先持久化到DB,再發送到接收方,接收方收到以後更新爲已接收狀態,所以對數據庫是重度依賴。

對關係型數據庫來講高性能高可用跟數據不丟失又每每是魚跟熊掌的關係,要保證數據徹底不丟失的話,數據必然是要同時寫入到主庫與從庫纔算完成,此時若是從機異常,數據寫入將失敗,這將致使數據庫服務不可用,相信不多有人能接受。

因此一般在數據一致性與服務可用性上會作必定的妥協,即正常狀況下表現爲主從強一致性模式,異常狀況下則退化爲異步模式。這在MySQL裏面咱們稱之爲Semi sync複製,Oracle 複製(DataGuard) 裏面則爲最大保護模式。

在保證數據服務高性高吞吐的狀況下儘可能避免數據丟失,咱們對網易雲DDB底層DBN作了以下設置:

  1. 將sync_binlog與innodb_flush_log_at_trx_commit同時設置爲1,每次數據庫寫操做都會持久化binlog與redo log到磁盤上,保證數據的持久性。
  2. 開啓VSR(virtual sync replication),保證主從能實時一致。
  3. 開啓Group Commit,以及從庫的並行複製,提高主從性能。

第2點裏的VSR,這個是網易MySQL分支InnoSQL的一個特性,InnoSQL在官方半同步複製(semi sync)基礎上作了部分改進,改善了主庫宕機時主從數據不一致問題,實現機制如圖所示:

MySQL分佈式數據庫高可用實踐:架構、複製機制、多機房

簡單來講,MySQL5.5版本中官方semi sync是在binlog與redo都寫完後再將binlog傳輸到從庫,而vsr則是在binlog寫完後與redo log寫以前傳輸binlog,這樣作的好處是能夠避免事務日誌提交後主庫宕機恢復後數據幻讀問題。(在官方MySQL5.7中這個問題獲得解決,見rpl_semi_sync_master_wait_point參數解釋)

固然這樣作也有缺點,事務須要等待數據傳輸到從庫後再返還,確定會增長必定的延遲時間,針對這個問題,優化方法就是第三點開啓group commit。開啓後多個事務的binlog一次性提交到磁盤跟傳輸至從庫,這樣能夠減小磁盤fsync次數並提高吞吐量。

如下是sync_group (vsr+group commit) 與原生semi sync、 sync(vsr) 、async(不開啓semi sync) 之間性能對比圖,能夠看到 vsr + group commit性能與異步複製幾無差異:

MySQL分佈式數據庫高可用實踐:架構、複製機制、多機房

同時爲了從庫及時同步數據,咱們在從庫上打開並行複製,主庫上事務並行提交從庫上也能夠並行恢復,這樣大併發寫入下從庫沒有基本延時。

隨着業務的暴漲,數據量規模及QPS也暴漲幾百倍,通過屢次擴容後,爲了提高DDB性能及容量,咱們將IM雲底層DBN節點從RDS遷移到物理機,而且使用大量的SSD做爲底層存儲。遷出RDS後DDB底層節點便再也不擁有高可用這一特性,爲此咱們本身開發了一套DDB底層節點監控與切換工具DDB Monitor,此時DB高可用架構圖變成

MySQL分佈式數據庫高可用實踐:架構、複製機制、多機房

DDB Monitor可用於執行平常數據庫擴容切換、故障切換、狀態監控等工做

故障切換模式下會定時(幾秒) 作以下事情:

  1. 狀態檢測,包括檢測DBN存活狀態,主從複製關係,binlog位置點,semi狀態等
  2. 模擬數據寫入,檢查主庫是否可寫

在判斷MySQL主從什麼時候能夠切換方面,與其它開源工具可能有些不一樣,須要知足如下狀況纔可能觸發故障切換:

  1. DBN主節點沒法鏈接,錯誤號爲2000-3000間指定幾個(避免max connection等服務端反回的錯誤號形成誤判)
  2. DBN主節點指定時間內重試屢次仍沒法寫入
  3. 從庫接收到的binlog已經應用完成或者在若干秒時間內應用完成
  4. 上一次數據庫vsr(semi sync)狀態正常或上一次從庫收到的binglog落後主庫若干字節內 (根據業務數據重要程度設置)
  5. 若是主庫沒法鏈接,從庫show slave status中Slave_IO_Running狀態需爲NO (從庫與DDB Monitor工具同時監控主庫是否宕機,避免腦裂問題)
  6. 從庫Slave_SQL_Running狀態需爲 Yes

其中條件1與條件2 須要知足至少1者。 4中表示若是對主從一致性要求很高須要知足上次檢測vsr(semi sync)正常才能切換,而若是能夠容忍必定的數據丟失那麼能夠設置檢測上次主從同步binlog差值在指定範圍內便可切換。

故障切換後,SQL Proxy收到Master消息會從新創建到正確DBN的鏈接,主庫宕機狀況下基本能夠在秒級別完成切換。

固然除了上面這些說的這些部署上保障高可用外以外,增強數據庫設計與監控也是保障數據庫穩定運行很是重要的一環。

數據庫設計方面的措施主要有:

  1. 按照數據庫設計規範進行表、SQL設計。表設計儘可能精簡,從數據訪問角度設計表結構,在範式與反範式間要作合理的取捨
  2. 數據請求儘可能精簡快,並減小垮節點訪問,提高數據庫真正的服務時間
  3. 高頻查詢須要添加緩存,用戶配置、羣信息配置等少更新高訪問請求走要緩存
  4. 對數據一致性要求不高以及數據分析統計類的請求放到從庫查詢
  5. 非核心功能、核心但數量少頻次低模塊走RDS,避免相互影響
  6. 與應用合做,添加對DB衝擊較大業務場景(好比聊天室)提供限流支持

數據庫監控方面咱們主要作了以下如下幾個方面:

  1. DDB各個組件的網絡、系統層面通用性指標監控
  2. SQL Proxy、DDB Master jvmgc信息、鏈接數、cpu、請求量、響應時間內存使用率日誌等監控
  3. DBN節點(MySQL) Global status、processlist、innodb engine status、slowlog、數據增加率、表分區、文件句柄等監控
  4. 數據運維平臺上報表展現基於海量監控數據下經過必定算法獲得數據庫容量、運行狀態、重要指標不一樣時間同比環比,風險點分析提示,風險SQL指示等

一套DDB內一般包含幾百個維度的指標監控及幾十個維度的報警項

多機房高可用實踐  

在過往的運維經歷中,咱們遇到過機櫃掉電、機房大面積故障等事情,這種狀況的發生會嚴重影響產品可用性。因此對於雲信等重要產品,單機房高可用顯然沒法知足業務追求

多機房是個很是複雜的工程,不只須要在部署上有多機房部署,在應用層面也須要支持多機房架構,雖然咱們在產品發展初期就開始了多機房高可用建設,但到目前咱們並無徹底作到自動化故障切換

這裏介紹下咱們作的工做也是拍磚引玉,但願你們提出寶貴意見

咱們多機房高可用主要作到的工做

  1. 備機房距主機房至少需隔兩百千米距離,機房間必須有專線
  2. 服務入口多機房,客戶端請求根據流量配置轉發到不一樣機房服務器
  3. 應用與依賴組件多機房高可用部署(MQ、Hbase、對象存儲服務等),部分組件須要應用雙寫多機房,好比Hbase、對象存儲的寫入等
  4. 應用訪問數據服務經過配置管理服務(DISCONF)獲取,數據庫與緩存經過使用功能(MySQL)或複製工具(緩存) 作跨機房數據複製
  5. 監控多機房組件的可用性,PE與DBA部署好自動化切換工具
  6. 肯定基於binlog與應用日誌的重要數據校驗與補償機制

最後數據庫高可用架構圖:

MySQL分佈式數據庫高可用實踐:架構、複製機制、多機房

人工切換始終會存在必定的延時,不過咱們運維部強大的運維協做工具Stone支持移動端執行服務器命令,能夠隨時隨地執行切換操做:

MySQL分佈式數據庫高可用實踐:架構、複製機制、多機房

以上就是我這次分享的所有內容,感謝你們的參與,謝謝你們

QA環節

Q1:有什麼好的方案能在保證業務不中斷的狀況下實現跨機房大數據庫遷移,在這過程當中又如何保證數據的實時性呢?

A1: 數據庫的實時性 能夠有專線網絡 + DB複製 來保障, 不終端服務實現跨機房的話 就須要系統相關的全部組件都支持跨機房高可用,而且須要實現自動化切換。補充一點, 跨機房服務部終端,會犧牲必定的數據一致性。我:

Q2:請問大家都有哪些本身研發的模塊開源呢?很想學習下

A2:網易InnoSQL是開源的,另外redis複製遷移工具 redis-migration也是開源的

Q3:關係型數據庫MySQL很流行,可是也有不足,咱們最近在考慮有沒有替換的方案。可否將它和其餘的對比一下?大家是怎樣作的選擇?

A3:首先我以爲最好是選擇你最熟悉的,能搞定的數據庫。GitLab數據丟失事故 我認爲很大的緣由是由於他們的工程師對postgresql 不是很懂。 另外MySQL發展其實很是快的,5.7 有不少很是好的特性,不少東西都借鑑了Oracle。

Q4:大家有什麼開源的跨機房數據實時同步工具嗎。

A4:咱們網易內部有一套本身開發的數據複製工具DTS, 目前尚未開源, 緩存複製工具備開源 是 redis-migration。git 上你們能夠搜一下

Q5:大家的數據訪問高峯是何時呢?仍是說一直比較平緩?還有,有沒有大規模遷移數據庫的經歷,能夠講一講嗎?

A5:業務確定有高峯低估的,通常晚上黃金時段是高峯期,凌晨是低谷。數據遷移的話其實作好工具後,數據大小量沒有太大的差異,數據量大的話 須要作限流。

Q6:從技術上選擇MySQL和PG有什麼區別?選擇他們的時候大家是選了最熟悉的仍是作了技術選型的調研?

A6:咱們選擇了最熟悉而且最適合咱們的。PG跟MySQL都很是優秀,性能上也差很少。

Q7:能不能講講上次大規模故障的事情?多長時間內完成恢復?有哪些措施?數據如何備份?

A7: 故障恢復一般須要作好預案, 好比當你沒法作到自動化切換的時候,就須要有一套切換的腳本,另外故障切換後一般須要作好必定的限流,不能切完再掛。 數據備份方面:咱們一套數據庫備份系統, 數據庫的備份會備份到存儲服務上

Q8:大家的採用分佈式數據庫與單節點數據庫能徹底兼容嗎?

A8:大部分都能兼容,少數極端的case不兼容

Q9:大家線上業務單表數據量能去到多少?是如何對這些表進行優化?

A9:通常咱們都會分表, 一張大表可能有幾十到幾百張字表,百億級表不少的,好比咱們的消息表。 表優化: 1 將歷史數據遷移到離線數據庫 2 精確好字段長度 3 儘可能以primary key 或者聯合索引去訪問表

Q10:爲何不在sql proxy層使用mycat?最近使用了mycat感受還不錯

A10:SQL Proxy跟咱們DDB各組件是集成在一塊兒的, DDB是2006年開始研發的,比市面上任何一款分庫分表工具都悠久,咱們對比過SQL Proxy跟mycat,  各有優缺點。

相關文章
相關標籤/搜索