asp.net實現資料庫讀寫分離(SQLSERVER2005,ORACLE)【轉】

來源:互聯網
上載者:User

標籤:style   http   color   使用   io   資料   ar   問題   

很多時間我們肯定希望資料庫的讀寫與程式是分離,這樣可以提高業務量同時提高伺服器效能,下面我來以SQL Server 2005為執行個體來介紹資料庫讀寫分離方法,大家可參考。

下面我們重點介紹Sql Server 2005是如何?負載平衡的。

 
Sql Server 2005的新特性

SQL Server 2005對端到端(P2P)拓撲結構上事務性的複製加強了支援。P2P的拓撲結構支援無限的發行伺服器,它們彼此之間可以互相交換事務。

P2P拓撲是SQL Server的一個巨大進步。現在,多端點伺服器可以更改資料,並且向其他的發行者複製事務。這就是說,訂閱伺服器不再被限制在主要的報告環境中,可以通過事務性負載全球共用的方式將伺服器分布開來。當使用者的數量增加的時候,只要簡單地向這個群體中添加伺服器即可。

除了將負載分布之外,這個拓撲結構還增加了可用性。如果任何一個點的伺服器不可達,則池中其他伺服器就會共用這個負載,因為每個伺服器都有其他所有伺服器上可獲得的全部資料集合。

 資料庫鏡像和快照

SQL Server 2005引入了資料庫鏡像的概念,來協助獲得高可用性。特別提醒的是,只要它正式發布了,資料庫鏡像就可以在SQL Server 2005上使用。然而,只有到SQL Server 2005 Service Pack 1才會支援鏡像。

資料庫快照集是SQL Server 2005中引入的另一項特性。快照是某一個時間點上的資料庫的複製。只要對鏡像資料庫進行了快照,就可以讓使用者查詢快照。快照的產生通常只需要幾秒鐘,因為它實際上在這個過程中並沒有拷貝任何資料。因此,要把負載分布到主伺服器和待命伺服器上,就可以將資料庫做鏡像,然後階段性地對備份伺服器進行快照。而且還可以使用快照在主伺服器上進行報告。

 軟體實現SQL Server 2005的負載平衡

 中介層

實現資料庫的負載平衡技術,首先要有一個可以控制串連資料庫的控制端。在這裡,它截斷了資料庫和程式的直接連接,由所有的程式來訪問這個中介層,然後再由中介層來訪問資料庫。這樣,我們就可以具體控制訪問某個資料庫了,然後還可以根據資料庫的當前負載來調整每次串連到哪個資料庫。好處在兩個方面:首先,它成功地將資料庫放到了內網之中,更好地保護了資料庫的安全性。如果資料庫也在公網上,1433連接埠是很容易被攻擊的,所以要保護資料庫與之的串連,就用到了中介層。它可以將資料庫更加好地保護在內網。其次,串連資料庫的所有串連都可以控制,更方便DBA對資料的管理,看哪些串連更耗費資料庫資源,以便更好地最佳化代碼。

但是,也有兩點要注意:第一,必須要做成Windows的服務程式。Windows發展到今天,如果以一個整合的大系統來講,做成服務程式更加穩定,也更加安全,這樣做即使使用者不登入機器,也可以使用。第二,必須要使用多個中介層。從中介層的作用可以看出,它承接了資料庫的所有串連,所以,一旦出了問題,就會導致整個系統癱瘓。所以做多個中介層是必要的,這樣,如果一個壞了可以登入到另一個。

 

實現多據庫資料同步

中介層有了,下一步的工作是設定構建資料庫叢集。對於負載平衡,最重要的就是所有伺服器的資料都是同步的。這是一個叢集所必需的,因為,如果資料不同步,那麼使用者從一台伺服器讀出的資料,就有別於從另一台伺服器讀出的資料,這是不能允許的。所以必須實現一個資料庫的資料同步。這裡設定一個用於寫入的資料庫,設定兩個用於讀出的資料庫,因為據統計,一般來講,70%的資料庫操作為讀操作。

首先,在寫入資料庫上做一個發行伺服器,主要基於SQL Server 2005的複製技術,將即將用到的表都選上。注意,在串連上要選用類比使用者,然後共用時選擇sa使用者,這樣就可以將資料共用了。

其次,在兩個讀伺服器上做訂閱服務,要注意同樣的事項,這樣一個“一寫兩讀”的資料庫叢集就完成了。

 

資料庫的安全備份

在一個大的系統中,系統的無故障性是很重要的,但是在剛才的系統下,如果用於寫的伺服器突然壞了,整個系統就會出現問題,所以,再做個備份是必要的。

資料庫鏡像是SQL Server 2005大力推出的,它就是要實現資料庫的安全轉移,所以需要再單獨拿出一台機器來做備份伺服器,將完全鏡像寫入該伺服器,這樣,即使寫入伺服器壞了,它也可以自動轉移到備份伺服器上來,保證不影響使用者。

這實際上就相當於實現了對伺服器的容災管理,但是有一點需要注意,在這種鏡像的體系中,必須要有一台伺服器作為監視伺服器,以便察看哪台伺服器壞了,用以在機器出錯之後迅速調整。

 

回傳資料庫的狀態

資料庫伺服器均已配完,整體的機器叢集架構已經構建,接下來的工作就是配置程式。

首先,在讀和寫的伺服器都放上一個監控程式,它同樣必須是Windows的服務,這樣更穩定;其次,它可以設定成每隔30秒或者一定時間,將伺服器的CPU、記憶體、網卡流量和當前資料庫狀態等資訊發送回來。在這裡需要設定一個權值,用以衡量CPU、記憶體利用率等資訊的各自比例。在這個系統中,建議以CPU利用率為準。

 

中介層實現的負載平衡

到此為止,所有的準備工作都已完成,包括資料庫的建立和配置,中介層的位置,下面所作的就是用軟體來實現這個負載平衡。

首先,當一個使用者有資料庫請求時,先判斷是讀還是寫,如果是寫的話,就直接返回寫入伺服器,這樣當寫伺服器寫完資料以後,差不多可以在3秒內返回其他兩台機器。

其次,當遇到一個讀的請求時,根據監控返回來的資料判斷,根據剛才的權值返回一個當前最閒置機器。需要注意的是,這時最好做一個記錄器,用以保持一段時間的數值,可以讓管理員自行設定,更好地做到幾台資料庫的壓力平衡。

最後,如果為主的寫入伺服器突然壞掉,程式可以自動把備份的伺服器切換過來,用剛才的備份伺服器當作寫伺服器,然後做一個警示系統,用以通知管理員。同樣,當監控伺服器發現其他兩台讀伺服器壞掉時,也會自動通知管理員,來處理伺服器的異常情況,這樣就可以保證系統的穩定運行,而且易於管理和維護。

總之,用軟體和微軟SQL Server 2005的一些新技術,可以很輕鬆地實現負載平衡,這樣不但可以不用硬體來實現,方便管理員的操控,更有利於DBA管理資料庫,及時發現問題。

代碼

 

 代碼如下 複製代碼
/// <summary>
    /// 資料庫服務工廠
    /// 版本:2.0
    /// <author>
    ///        <name>shecixiong</name>
    ///        <date>2013.05.28</date>
    /// </author>
    /// </summary>
    public class DataFactory
    {
        /// <summary>
        /// 從配置資訊擷取連接字串
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        private static string GetConfig(string key)
        {
            return ConfigHelper.GetAppSettings(key);
        }
        /// <summary>
        /// 連結 SqlServer 資料庫
        /// 操作寫入
        /// </summary>
        /// <returns></returns>
        public static IDbHelper SqlServerRead()
        {
            return new SqlServerHelper(GetConfig("SqlServer_IP_Read"));
        }
        /// <summary>
        /// 連結 SqlServer 資料庫
        /// 操作讀取
        /// </summary>
        /// <returns></returns>
        public static IDbHelper SqlServerWrite()
        {
            return new SqlServerHelper(GetConfig("SqlServer_IP_Write"));
        }
        /// <summary>
        /// 連結 Oracle 資料庫
        /// 操作寫入
        /// </summary>
        /// <returns></returns>
        public static IDbHelper OracleRead()
        {
            return new OracleHelper(GetConfig("Oacle_IP_Read"));
        }
        /// <summary>
        /// 連結 Oracle 資料庫
        /// 操作讀取
        /// </summary>
        /// <returns></returns>
        public static IDbHelper OracleWrite()
        {
            return new OracleHelper(GetConfig("Oacle_IP_Read"));
        }
    }
}

App.config

 代碼如下 複製代碼


<!-- 連接字串是否加密-->
        <add key="ConStringEncrypt" value="false"/>
        <!-- 連接字串-->
        <add key="SqlServer_IP_Read" value="Server=192.168.1.11;Database=RM_DB;Uid=sa;Pwd=qwertyuiop"/>
        <add key="SqlServer_IP_Write" value="Server=192.168.1.10;Database=RM_DB;Uid=sa;Pwd=qwertyuiop"/>
        <add key="Oacle_IP_Read" value="Data Source=IP1;User ID=system;Password=qwertyuiop;"/>
<add key="Oacle_IP_Read" value="Data Source=IP2;User ID=system;Password=qwertyuiop;"/>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.