資料庫的讀寫分離

2022-02-01 01:27:39 字數 2193 閱讀 6251

隨著乙個**的業務不斷擴充套件,資料不斷增加,資料庫的壓力也會越來越大,對資料庫或者sql的基本優化可能達不到最終的效果,我們可以採用讀寫分離的策 略來改變現狀。讀寫分離現在被大量應用於很多大型**,這個技術也不足為奇了。ebay就做得非常好。ebay用的是oracle,聽說是用quest share plex 來實現主從複製資料。

讀寫分離簡單的說是把對資料庫讀和寫的操作分開對應不同的資料庫伺服器,這樣能有效地減輕資料庫壓力,也能減輕io壓力。主資料庫提供寫操作,從資料庫提 供讀操作,其實在很多系統中,主要是讀的操作。當主資料庫進行寫操作時,資料要同步到從的資料庫,這樣才能有效保證資料庫完整性。quest shareplex就是比較牛的同步資料工具,聽說比oracle本身的流複製還好,mysql也有自己的同步資料技術。mysql只要是通過二進位制日誌來複製資料。通過日誌在從資料庫重複主資料庫的操作達到複製資料目的。這個複製比較好的就是通過非同步方法,把資料同步到從資料庫。

主資料庫同步到從資料庫後,從資料庫一般由多台資料庫組成這樣才能達到減輕壓力的目的。讀的操作怎麼樣分配到從資料庫上?應該根據伺服器的壓力把讀的操作分配到伺服器,而不是簡單的隨機分配。mysql提供了mysql-proxy實現讀寫分離操作。不過mysql-proxy好像很久不更新了。oracle可以通過f5有效分配讀從資料庫的壓力。

上面說的資料庫同步複製,都是在從同一種資料庫中,如果我要把oracle的資料同步到mysql中,其實要實現這種方案的理由很簡單,mysql免費,oracle太貴。好像quest shareplex也實現不了改功能吧。好像現在市面還沒有這個工具吧。那樣應該怎麼實現資料同步?其實我們可以考慮自己開發一套同步資料元件,通過訊息,實現非同步複製資料。其實這個實現起來要考慮很多方面問題,高併發的問題,失敗記錄等。其實這種方法也可以同步資料到memcache中。聽說oracle的stream也能實現,不過沒有試過。

讀寫分離,基本的原理是讓主資料庫處理事務性增、改、刪操作(insert、update、delete),而從資料庫處理select查詢操作。資料庫複製被用來把事務性操作導致的變更同步到集群中的從資料庫。

為什麼要分庫、分表、讀寫分?

單錶的資料量限制,當單錶資料量到一定條數之後資料庫效能會顯著下降。資料多了之後,對資料庫的讀、寫就會很多。分庫減少單台資料庫的壓力。接觸過幾個分庫分表的系統,都是通過主鍵進行雜湊分褲分表的。這類資料比較特殊,主鍵就是唯一的獲取該條資訊的主要途徑。比如:京東的訂單、財付通的交易記錄等。。。該類資料的用法,就是通過訂單號、交易號來查詢該筆訂單、交易。

還有一類資料,比如使用者資訊,每個使用者都有系統內部的乙個userid,與userid對應的還有使用者看到的登入名。那麼如果分庫分表的時候單純通過userid進行雜湊分庫,那麼根據登入名來獲取使用者的資訊,就無法知道該使用者處於哪個資料庫中。

或許有朋友會說,我們可以維護乙個email----userid的對映關係,根據email先查找到userid,在根據userid的分庫分表規則到對應庫的對應表來獲取使用者的記錄資訊。這麼做是可以的,但是這個對映關係的條數本身也是個瓶頸,原則上是沒有減少單錶內資料的條數,算是乙個單點。並且要維護這個對映關係和使用者資訊的一致性(修改登入名、多登入名等其他特殊需求),最大乙個原因,其實使用者資訊是乙個讀大於寫的庫,web2.0都是以使用者為中心,所有資訊都和使用者資訊相關聯,所以對使用者資訊拆分還是有一定侷限性的。

對於這類讀大於寫並且資料量增加不是很明顯的資料庫,推薦採用讀寫分離+快取的模式,試想一下乙個使用者註冊、修改使用者資訊、記錄使用者登入時間、記錄使用者登入ip、修改登入密碼,這些是寫操作。但是以上這些操作次數都是很小的,所以整個資料庫的寫壓力是很小的。唯一乙個比較大的就是記錄使用者登入時間、記錄使用者登入ip這類資訊,只要把這些經常變動的資訊排除在外,那麼寫操作可以忽略不計。所以讀寫分離首要解決的就是經常變化的資料的拆分,比如:使用者登入時間、記錄使用者登入ip。這類資訊可以單獨獨立出來,記錄在持久化類的快取中(可靠性要求並不高,登陸時間、ip丟了就丟了,下次來了就又來了)

以oracle為例,主庫負責寫資料、讀資料。讀庫僅負責讀資料。每次有寫庫操作,同步更新cache,每次讀取先讀cache在讀db。寫庫就乙個,讀庫可以有多個,採用dataguard來負責主庫和多個讀庫的資料同步。

資料庫讀寫分離

隨著乙個 的業務不斷擴充套件,資料不斷增加,資料庫的壓力也會越來越大,對資料庫或者sql的基本優化可能達不到最終的效果,我們可以採用讀寫分離的策略來改變現狀。讀寫分離現在被大量應用於很多大型 這個技術也不足為奇了。ebay就做得非常好。ebay用的是oracle,聽說是用 quest share p...

資料庫讀寫分離

隨著乙個 的業務不斷擴充套件,資料不斷增加,資料庫的壓力也會越來越大,對資料庫或者sql的基本優化可能達不到最終的效果,我們可以採用讀寫分離的策略來改變現狀。讀寫分離現在被大量應用於很多大型 這個技術也不足為奇了。ebay就做得非常好。ebay用的是oracle,聽說是用 quest share p...

資料庫讀寫分離

隨著乙個 的業務不斷擴充套件,資料不斷增加,資料庫的壓力也會越來越大,對資料庫或者sql的基本優化可能達不到最終的效果,我們可以採用讀寫分離的策 略來改變現狀。讀寫分離現在被大量應用於很多大型 這個技術也不足為奇了。ebay就做得非常好。ebay用的是oracle,聽說是用 quest share ...