著名電子商務網站高併發千萬級大型資料庫經驗之- 讀寫分離

edagarli發表於2014-03-13

由於公司的主伺服器責任重大,而且滿負荷跑了接近2年了,怕萬一有閃失主伺服器出現硬體故障後重新購買新伺服器訂貨到貨週期可能會比較長,所以公司在春節期間購買了一臺更強大的新伺服器來當備用伺服器,購買的初衷就是防止出現硬體故障。

      春節前新伺服器就採購到位了,由於手上事情比較多根本忙不過來配置新伺服器,春節休息期間看了一些資料同步的資料,準備把主資料庫的讀寫分離,當初主要思路見下圖。

很多需要讀取的都從另外一個伺服器讀取,這樣主伺服器的壓力會小很多,2臺伺服器之間進行讀寫分離。

     以前習慣了什麼事情都自己親自操刀,也想也改變一下思維模式,把資料庫映象、讀寫分離的工作安排給部門裡的其他人員去實施,自己只是丟擲了一些主導核心思想,結果折騰了很久沒能那麼順利實現,期間主要問題有:

     1: 讀寫分離,進行了複製訂閱後,同步的週期非常長,在主伺服器繁忙時,3分鐘都無法進行同步。

     2:主伺服器無形中額外增加了更嚴重的資料同步負擔,沒能達到預期的效果,反而效果更糟糕。

     3:伺服器維護人員對資料庫也不是很精通,主要精通硬體及網路配置維護,他們平時的各種維護管理工作也非常繁雜,無法集中精力專門搞定這個任務。

    經過第一次讀寫分離接近失敗後,思考了2-4周時間,還是打算親自操刀一下否則沒有非常狠的力度。

     1:分析主伺服器最影響效能效率的SQL語句,幾乎把所有常用的語句都整理出來,分析公司的核心業務、核心資料表。

     2:把最核心的少數幾個表同步到新伺服器,這樣同步的效率高一些,主伺服器的壓力也小一些,而不是選擇同步所有的表,同步所有的表意義不大。

     3:把推送模式修改為從主伺服器拉的模式進行同步,由於新伺服器的效能更好,承擔的工作壓力更小,所以新伺服器主動去拉資料的模式。

     4:把主伺服器上的所有SQL語句、索引都進行優化,主伺服器的效能提升了接近4倍,然後再進行資料同步工作相對輕鬆了很多,效率也高了很多。

     5:把所有實時性要求不高的,數量龐大的,操作頻繁的SQL語句都從新伺服器讀取,解放主伺服器的磁碟讀寫壓力。

     6:新伺服器的效能非常強大,所以一部分磁碟用來做映象、另外一部分磁碟做資料同步,這樣新伺服器的磁碟也充分利用起來了,沒有閒置的磁碟。

     7:新伺服器裝了2個SQL2008例項,一套用來資料同步,一套用來資料映象,這樣丟失資料的概率降低到極點、同時也不擔心發生硬體故障資料丟失了。

     

    其實說說複製訂閱很簡單一樣,一晚上折騰了5-6次,耗時4-5個小時才能成功同步,很多東西不是親自動手是不知道其中的痛苦,嘴巴說說也就幾句話,這就是為什麼需要有工作經驗的開發人員,而不是理論知識夠能紙上談兵就可以了,實戰才是最鍛鍊人的。

      第一次設定資料庫的釋出訂閱,以前工作上也沒這個需要,設定成功了,進行了幾次測試都正常這時候已經是深夜2點了,新伺服器正常開始運轉,又檢測了幾天複製訂閱的執行情況都良好,不管在業務高峰期還流量不大時,執行狀態都比較穩定,把主網站上的一些需要大量讀取資料的程式進行了調整,從新伺服器讀取,讀寫分離成功了。

      耗費了巨資購買的新伺服器,從2-3個月的接近閒置空閒狀態進入了忙碌的工作狀態了,舒服了很多心也不堵了,資料庫映象也做好了,資料庫同步讀寫分離也如願了,主伺服器的磁碟I/O壓力接近降低了10倍以上最高時降低了100倍,對主機的磁碟壽命、整個網站的穩定高效性執行打了牢固的基礎,接著應該一年半年內不用優化也可以了,也不用購買新伺服器,這2個伺服器足夠用2-3年的甚至更長時間也沒關係。

      在主伺服器優化前經常有超過2秒執行的SQL語句非常多,有時還有耗時20-30秒的SQL語句,經過一週的優化後,主伺服器上幾乎看不到超過2秒的,絕大部分都能在0.5秒以內能執行完畢了。

      經過這次優化,有2個心得體會,一方面決策很重要、另一方面執行力也很重要;沒有強勁的執行力決策就是漂浮在空中的無法落地。遇到任何困難不能妥協、堅決想辦法克服各種困難,每次突破就是一次職業生涯上的一次昇華。

     其實公司裡有不少人想加薪、獲得更好的待遇;也總是抱怨自己的水平無法施展什麼的;其實公司裡需要做的事情很多,需要去主動承擔很多艱鉅的任務、去做一些自己並不擅長的事情;例如我也不是專業DBA的工作崗位,以前也從來沒優化過這麼大併發量的電子商務網站的核心資料庫,但是需要去突破,克服困難,把一個個難題解決掉,別人其實都能看到你做出貢獻了。

 

相關文章