天天看點

SQL的讀寫分離與負載均衡問題設想。

首先,我們可以了解一下,sql的讀寫分離的工作方式,如下圖所示:

SQL的讀寫分離與負載均衡問題設想。

       總得來說,三種方案,現階段來說,都是單節點寫,多節點讀。sql 2012 的always on還實作了讀負載均衡,但方案投入相對來說較大。

 是以用得最多的應還是第二種方案,表級同步,資料差異幾秒。但有個問題,當隻讀的節點多了時,要如何實作負載均衡?

      真正的負載均衡,需要計算的東西太多,要計算連接配接線程數,要計算cpu使用率等,而這一切都需要你在程式中展現。實作難度相對來說會好大!

除非你用第三方服務軟體來實作,sql現階段來說,這樣的軟體不多,公司也未必會進行投資。

     是以我自己分析了一下代碼級的負載均均衡。

   讀寫分離後的讀均衡的資料層有幾個條件需分析:1、需提前判斷sql語句是寫語句(insert 、update、create、 alter)還是讀語句(select);

存儲過程是寫還是讀的也需區厘清楚。2、剛新增的資料的即時讀需怎麼解決。3、讀的時侯怎麼實作負載均衡?

  對于第三點,負載均衡,首先不會做得太複雜,太複雜的話,沒有第三方軟體,實作起來難度大,性能也難以保證。是以隻想了簡單的方案:

     1、多節點平均線程,忽略了sql查詢的查詢性能及時間,單純計算連接配接線程數。

    2、采用随機算法選出節點,嘎嘎,網上找到的。感覺不太好把握。

     3、采用循環算法,就是節點轉成清單,每次讀庫,記錄上次讀庫用到的節點。這個也忽略了查詢的性能及時間等因素,實作起來簡單。其實同時

實作了多節點平均線程。

   4、還有一種是采用循環及計數算法,需記錄還在活動的查詢線程,讀庫的類在open connection時需計數加1,釋放connection時,需要把計數減1。

以上4種方法,我覺得第3、4種較為好,看項目的需要可以進行改造。

   但還有一個問題,就是寫資料庫的剛寫進卻說的資料同步到讀資料庫中需要間隔時間,如果不做處理,會出現新增後資料找不到的情況。

這個問題的解決比較考驗技藝了,普通的單個新增、更新可以在讀庫類中的新增方法及更新方法中用thread.sleep(1000);讓系統等一下。

但批量新增、更新的就不能用單個新增、更新的方法了!!不然,你就等死吧,呵。