電商總結(三)構建資料庫的主從架構

來源:互聯網
上載者:User

標籤:

  這段時間,一直在總結電商系統的相關基礎技術和架構,寫了很多東西。但是還是發現一個很重要,很基礎的方面沒有講到,那就是資料庫讀寫分離的主從架構。可能發展到大型成熟的公司之後,主從架構已經落伍了,取而代之的是更加複雜的資料庫叢集。但是作為一個小型電商公司,資料庫的主從架構應該是最基礎的。任何大型的系統架構,都是不斷演化的。主從架構便是資料庫結構描述中,最基礎的架構。所以研究完主從架構,也就能看懂更加複雜的架構了。

 

  首先為什麼要讀寫分離?

  對於一個小型網站,可能單台資料庫伺服器就能滿足需求,但是在一些大型的網站或者應用中,單台的資料庫伺服器可能難以支撐大的訪問壓力,升級伺服器效能,成本又太高,必須要橫向擴充。還有就是,單庫的話,讀、寫都是操作一個資料庫,資料多了之後,對資料庫的讀、寫效能就會有很大影響。同時對於資料安全性,和系統的穩定性,也是挑戰。

 

  資料庫的讀寫分離的好處?

    1. 將讀操作和寫操作分離到不同的資料庫上,避免主伺服器出現效能瓶頸;

    2. 主伺服器進行寫操作時,不影響查詢應用伺服器的查詢效能,降低阻塞,提高並發;

    3. 資料擁有多個容災副本,提高資料安全性,同時當主伺服器故障時,可立即切換到其他伺服器,提高系統可用性;

       

 

  讀寫分離的基本原理就是讓主要資料庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE)操作,而從資料庫處理SELECT查詢操作。資料庫複寫被用來把事務性操作導致的變更同步到其他從資料庫。以SQL為例,主庫負責寫資料、讀資料。讀庫僅負責讀資料。每次有寫庫操作,同步更新到讀庫。寫庫就一個,讀庫可以有多個,採用日誌同步的方式實現主庫和多個讀庫的資料同步。

  一:Sql Server 讀寫分離的配置

    SQL Server 提供了三種技術,可以用於主從架構之間的資料同步的實現:記錄傳送、事務複製和SQL 2012 中新增的功能Always On 技術。各自優劣,具體的大家自己去百度吧,這裡提供一個以記錄傳送方式的資料同步,地址。 

 

  二:C# 資料庫讀寫操作

    C#的請求資料庫操作,單資料庫和主從架構的資料庫還是不一樣的。主從架構的資料庫,為了保證資料一致性,一般主庫可讀可寫,從庫只負責讀,不負責寫入。所以,實際C#在請求資料庫的時候,還是要區別對待。

    1. 最簡單的就是:配置兩個資料庫連接,然後在各個資料庫調用的位置,區分讀寫請求相應的資料庫伺服器,如

    

    2. 第二種解決方案就是判斷SQL語句是寫語句(insert 、update、Create、 Alter)還是讀語句(Select)。demo 下載 (PS:此demo為本人總結,跟實際生產中的DLL 不太相同,但是原理是一樣的,大家位元組總結封裝吧。)

      /// <summary>        /// 根據資料庫的語句,選擇相應的DB        /// </summary>        /// <param name="sql"></param>        /// <param name="commandType"></param>        /// <returns></returns>        public static DB SelectDB(string sql, CommandType commandType)        {            bool redirect2WritableDB = false;            sql = sql.Trim().TrimStart(‘\r‘).TrimStart(‘\n‘);            if (sql.IndexOf("UPDATE", StringComparison.OrdinalIgnoreCase) >= 0)                redirect2WritableDB = true;            if (sql.IndexOf("DELETE", StringComparison.OrdinalIgnoreCase) >= 0)                redirect2WritableDB = true;            if (sql.IndexOf("INSERT", StringComparison.OrdinalIgnoreCase) >= 0)                redirect2WritableDB = true;            if (sql.IndexOf("CREATE", StringComparison.OrdinalIgnoreCase) >= 0)                redirect2WritableDB = true;            if (sql.IndexOf("ALTER", StringComparison.OrdinalIgnoreCase) >= 0)                redirect2WritableDB = true;            //// 如果是預存程序,則預設是取Writable DB。            if (redirect2WritableDB || commandType == CommandType.StoredProcedure)            {                return DBConfiguration.WritableDB;            }            else            {                int random = GenerateRandomNumber();                int dbIndex = random % DBConfiguration.ReadDBs.Count;                return DBConfiguration.ReadDBs[dbIndex];            }        }

    同時,增加相關的資料庫配置

<?xml version="1.0" encoding="utf-8" ?><ConnectionString>  <WritableDB>Data Source=192.168.99.242; Initial Catalog=DBTest; Uid=sa;pwd=test123; MultipleActiveResultSets=True</WritableDB>  <ReadDBs>    <DB>Data Source=192.168.99.241; Initial Catalog=DBTest; Uid=sa;pwd=test123; MultipleActiveResultSets=True</DB>  </ReadDBs></ConnectionString>

 

電商總結(三)構建資料庫的主從架構

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.