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

来源: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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...