資料庫高可用實戰案例-------架構優化之清爽一夏

来源:http://www.cnblogs.com/double-K/archive/2016/08/29/5803956.html
-Advertisement-
Play Games

說到高可用,看官們會想到很多方案,也許是自親身經歷過系統從單機變成高可用的痛苦過程,也許有的看官只是在自己的虛機上搭建過測試的玩具。今天本篇用我自己的真實經歷給大家講述,不管怎麼樣實戰和測試玩耍還是很大的區別的!可能你覺得搭建一套高可用方案很簡單,配置配置就OK了,但在真正的複雜系統中一切就沒有那麼 ...


  說到高可用,看官們會想到很多方案,也許是自親身經歷過系統從單機變成高可用的痛苦過程,也許有的看官只是在自己的虛機上搭建過測試的玩具。今天本篇用我自己的真實經歷給大家講述,不管怎麼樣實戰和測試玩耍還是很大的區別的!可能你覺得搭建一套高可用方案很簡單,配置配置就OK了,但在真正的複雜系統中一切就沒有那麼輕鬆了! 

  文章主要講述升級並搭建AlwaysOn高可用的過程,以實施的思路為主。文中並沒有搭建集群的步驟,搭建步驟請自行學習(個人認為會搭建可用組並不是關鍵,而一系列的調研細節才是項目成功的關鍵)

--------------博客地址---------------------------------------------------------------------------------------

原文地址: http://www.cnblogs.com/double-K/

如有轉載請保留原文地址! 

 

 

廢話不多說,直接開整-----------------------------------------------------------------------------------------

背景

  客戶的現有方案是一套使用發佈訂閱構建的讀寫分離方案,總體來說系統構建的很不錯。也是在SQL2012之前很常見的一套架構。

  架構圖如下:

   

  

 

 

 

  客戶的需求:SQL server 2008 R2 升級到SQL SERVER 2014 使用AlwaysOn 替換現有發佈訂閱架構。實現本地高可用、讀寫分離,異地災備等,並應用部分2014的新功能,如記憶體優化表等提升系統性能和併發能力等。

前期調研

數據收集

  前期對系統的瞭解很重要!那麼怎麼樣對系統有一個初步直觀並且詳細的瞭解呢?用腳本收集?這是時候就體現出工具的專業和協作價值。工欲善其事,必先利其器!

 

  

 

  

  

  

 

 

確定方案

  通過前期的需求分析,並對客戶系統結構有了一個初步的瞭解後,我們用了將近一周的時間從架構的複雜度,易用性,客戶程式改動程度,性能,穩定性等多個角度敲定了最終的方案。

  架構圖如下:

   

 

   

 

  從原來那麼複雜的架構變成如此清爽的架構,使用AlwaysOn取代複雜的發佈訂閱,使用AlwaysOn的只讀節點實現讀寫分離,另外使用異地災備節點取代原有的異地發佈資料庫,很不錯吧!這也是用戶最傾向的架構,因為複雜度低,相對穩定易於維護。這裡要註意!凡事有利必有弊!要說“但是”了。

  但是,升級改動的成本大大提升!

  為什麼這麼說?我們接著看!

詳細調研

  這樣的一個複雜的系統前期的詳細調研是需要很長時間的,幾套系統不僅僅是架構上設計的比較複雜,功能應用、介面等更是複雜!下麵是主要的一些梳理過程:

原有系統結構

  我們首先要對原有系統的設計有透徹的瞭解,客戶在兩地分別有一個數據中心,三套系統有大量的業務要使用其他系統的數據,所以這裡使用發佈訂閱準時時的把其他系統中的數據發佈到系統中的一個資料庫,並使用同義詞指向訂閱來的數據。這種結構降低了使用鏈接伺服器跨實例甚至跨機房訪問的性能消耗!並且多份數據訂閱到多個只讀的節點,從而實現了報表、介面等業務的讀寫分離。

 

系統對象整理

  因為要做升級遷移,所以對象的整理是很重要的工作,業務對象的遺漏可能會帶來不可輓回的災難!甚至可能會導致整個升級,架構部署的回滾!幾套系統中涉及的對象列表過於龐大,比如帳號幾十個,幾十個作業,上百個同義詞,實例級觸發器等等.....

伺服器劃分:

  • 主庫對象
  • 讀寫分離各個只讀庫對象
  • 發佈到其他業務系統的數據伺服器配置對象
  • 其他應用程式對象

對象劃分:

  • 資料庫帳號
  • 鏈接伺服器
  • 實例級觸發器
  • 作業
  • 系統參數
  • 維護計劃
  • cdc
  • BI相關
  • 同義詞
  • 程式集
  • 郵件
  • 操作員
  • 只讀庫多出來的索引、視圖等對象
  • 等等等

測試過程

搭建測試環境

  所有的升級、高可用項目測試環節都是必不可少的。首先是測方案配合業務的可行性,因為作為第三方公司不能對用戶所有的應用關係,系統架構瞭如指掌,甚至客戶方自己的工程師可能也做不到這一點。其次是測試功能在新環境下是否出現異常。還有就是對收集並遷移的系統對象進行一次查缺補漏。這樣也可以儘量保證系統上線時發生故障的概率!

  測試環境無疑是任何升級、架構變更的必要步驟,也只有經過充分的測試才能做到心中有數,進而實現零故障上線。

上線演練

  上線演練?這是個什麼東西?

  首先資料庫的操作一定要確定可實施的時間視窗!保證在固定的時間視窗完成工作很重要,那麼這就是上線演練的最大好處,我們使用準備出的新機器完全模擬上線的全部步驟,並記錄每個步驟使用的時間,可能出現的風險,最遲的完成時間等等。其次搭建完成後我們可以用這個環境(就是完成後正式環境的配置)進行壓力測試。

  上線演練是一個很必要的步驟,但這個步驟要視實際的情況而定,比如升級的方式,環境的配置等。在這樣的一個項目中我們做了兩輪的上線演練!

實施過程

制定性能基線

  這樣一個大的變動,資料庫在各個階段的性能指標是什麼樣子的呢? 這裡我們依然使用 Expert for SQL Server 工具對每一個階段實施前後性能進行對比,這樣不僅能對實施的影響進行監控,更能清晰地分析出每個實施階段對性能的影響!

  

 

  

 

對每個指標也都做相應的對比分析,指標比較多這裡不一一介紹了,請參見優化系列文章:

SQL SERVER全面優化-------Expert for SQL Server 診斷系列

性能優化

  這裡的性能優化,我們主要針對語句系統的一些常規參數、慢語句進行第一輪的優化!另外一個重點就是為了應對升級到2014後可能變慢的語句進行調整!具體什麼樣的語句可能變慢? 這個...

  • 系統的重點語句(執行最頻繁的)
  • 語句複雜的
  • 大面積測試吧.....哈哈哈

  這裡為什麼要在升級前就作這樣的優化工作而不是升級後系統運行時在針對慢的語句進行分析呢? 這個道理很簡單,如果上線了才發現如果變慢的功能很多,或變慢的是頻繁的功能那麼上線的效果就是倆個字"失敗"。雖然有的看官知道可以使用提示或降低相容級別解決這個問題,但是這隻是特殊場景下的極端手段,而並不是解決的根本。所以建議如果你有升級到2014的需要,那麼這樣的優化手段一定要提前做!

升級到2014

  升級資料庫完全可以寫成好幾篇博客,甚至寫本小書都可以了!這裡只做簡單介紹,和一些要重點註意的問題!

  升級方式

  升級方式有2種:in place 和side by side,這裡採用的是side by side! 通俗地說就是準備新的伺服器,安裝對應版本的資料庫,然後把數據還原上去。side by side的好處就是升級不會影響原有的環境,即使失敗也能修改程式指向回退到原環境!

  

 

  升級2014 最大的一個問題

  2014 的新特性 “參數估計” !這個讓人興奮又苦惱的新功能會導致很多語句在升級到2014 後變慢,因為前面的優化階段已經對這部分重點關註了,所以這部分的問題基本已經消滅!但是萬惡的分區表(200多個分區)依然導致了批處理的性能嚴重問題!

集群搭建

  集群搭建可能沒有過多的可說支出,正常創建故障轉移集群,搭建AlwaysOn等,但這其中的細節還是很多的,比如仲裁的方式?異地節點的虛擬IP設置?節點個數與業務的配合?等等等的問題,這裡也就不一一細說了。

程式修改

  這個架構的修改也必然導致程式上的變化,這也是前文中提到的為什麼客戶最傾向的架構,因為複雜度低而使成本大大提升。原始系統中的關聯性無法通過發佈訂閱實現本地化訪問,又不能使用性能非常差的鏈接伺服器。那麼路只有一條,那就是修改程式訪問方式,簡單理解為在程式中分別在各自的資料庫中查出相應的數據,然後通過程式在記憶體中操作處理。

細節問題處理

  總體的實施步驟可以說就是這樣了,但是在這個整體步驟中充斥著無數的細節,每一個細節可能都決定著方案的可行性,升級、架構變更的成敗。限於篇幅這裡只舉幾個可能常見的問題說明一下!

  • CDC功能與AlwaysOn:官方文檔上說CDC與AlwaysOn可以實現轉移後CDC不間斷,但是經過測試CDC作業在AlwaysOn切換後多次執行失敗則不會再一次自動運行,CDC的logreader和發佈訂閱時一樣的,但在沒有發佈訂閱存在的情況下只有CDC作業會出現上述問題。解決辦法:配置調控作業(節點切換作業控制)
  • 重建索引操作:由於配置異地節點。日誌重建變成問題,測試中重建索引的日誌量是單機下日誌量的好幾倍!這樣會導致異地日誌隊列過長。解決辦法:使用手工腳本拆分細化索引重建,根據隊列大小和傳輸速率控制每天的日誌量。
  • 2014下語句變慢:具體就不細說了,2014參數估計和200+分區表組合產生的語句變慢問題至今沒有答案。目前只是使用一些方法避免了這個問題!(這個問題也請遇到的朋友給些思路,謝謝
  • 只讀副本上有寫操作:由於一些報表操作使用中間臨時表,這裡臨時表不是#temp 這種而是真正的物理表作為臨時表。解決方案:修改為臨時表,或創建單獨資料庫(不在可用性組中),在使用同義詞指向新庫實現寫操作。

 

  遇到的問題真的是各種多,這也是為什麼說當你的常規技術手段都掌握的時候,踩過的坑就是你的成長了!

 

--------------博客地址---------------------------------------------------------------------------------------

原文地址: http://www.cnblogs.com/double-K/

如有轉載請保留原文地址! 

 

-----------------------------------------------------------------------------------------------------

 

  總結 : 文章只是簡單分享了一個較為複雜的08到14的升級並搭建高可用的工作,真正的實戰項目和自己搭建的測試系統還是有很大的差別。項目整個工期持續了3個月,所以本文只是簡單的說明思路和步驟,另外介紹了幾個常見的大坑。項目中的主要步驟,個人認為這也是在資料庫高可用方案搭建過程中的必要步驟:

  1. 系統背景調查
  2. 業務調研,生成初版方案
  3. 詳細調研,對象整理
  4. 測試環境搭建
  5. 系統測試,確定方案
  6. 上線演練,確定時間視窗
  7. 壓力測試
  8. 正式上線
  9. 上線後監控
  10. 解決問題,制定維護方案

 

   此項目可以說是比較嚴格的遵循了相關管理的標準,在三個月的實施中,我們秉承這“穩定大於效率”的思想,工作細化到每一步,每一步都有詳細的說明,最終保證了三套系統的上線運行零故障!

  

 文章用到的 Expert FOR SQLSERVER 工具下載鏈接:http://zhuancloud.com/UserAccount/Install

 ----------------------------------------------------------------------------------------------------

註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯請點擊下右下角的推薦,非常感謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • iOS系列 基礎篇 05 視圖鼻祖 - UIView 目錄: 在Cocoa和Cocoa Touch框架中,“根”類時NSObject類。同樣,在UIKit框架中,也存在一個神奇的類——UIView。 從繼承關係上看,UIView是所有視圖的根,我們形象地稱其為“始祖”。 本篇,咱們就一起研究UIVi ...
  • http://www.path8.net/tn/archives/951 MySQL支持大量的列類型,它可以被分為3類:數字類型、日期和時間類型以及字元串(字元)類型。本節首先給出可用類型的一個概述,並且總結每個列類型的存儲需求,然後提供每個類中的類型性質的更詳細的描述。概述有意簡化,更詳細的說明應 ...
  • 增加了一個Tools類,放了一些常用的工具 然後寫了一個比較通用的update方法 懶得寫測試類,肯定好使,相信我~ ...
  • 在使用sqlplus登錄資料庫的時候,輸入sys用戶名出現報錯 解決這個問題就是在輸入用戶名的時候加上as sysdba 這樣就不會出現上面ORA-28009:connection as sys should be as sysdba or sysoper ...
  • 前提條件: 1、Spark Standalone 集群部署完成 2、Intellij Idea 能夠運行 Spark local 模式的程式。 源碼: 這裡主要的思想還是將打包的jar提交到集群。 使用.setJars方法 ...
  • 一、 表設計 二、 索引 三、 SQL語句 四、 散表 五、 其他 FAQ 1-1.庫名、表名、欄位名必須使用小寫字母,“_”分割。 a)MySQL有配置參數lower_case_table_names,不可動態更改,linux系統預設為0,即庫表名以實際情況存儲,大小寫敏感。如果是1,以小寫存儲, ...
  • slave IO流程已經在http://www.cnblogs.com/onlyac/p/5815566.html中有介紹 這次我們要探索註冊slave請求和dump請求的報文格式和主要流程。 一、註冊slave請求 在slave IO連接完資料庫後,slave IO接著在主庫里註冊自己,以便後續不 ...
  • 背景 Microsoft SQL Server 對於數據平臺的開發者來說越來越友好。比如已經原生支持XML很多年了,在這個趨勢下,如今也能在SQLServer2016中使用內置的JSON。尤其對於一些大數據很數據介面的環節來說這顯得非常有價值。與我們現在所做比如在SQL中使用CLR或者自定義的函數來 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...