久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何解決億級(jí)用戶的分布式數(shù)據(jù)庫數(shù)據(jù)存儲(chǔ)問題

共計(jì) 4582 個(gè)字符,預(yù)計(jì)需要花費(fèi) 12 分鐘才能閱讀完成。

這篇文章給大家介紹如何解決億級(jí)用戶的分布式數(shù)據(jù)庫數(shù)據(jù)存儲(chǔ)問題,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

一、MySQL 復(fù)制

1.MySQL 的主從復(fù)制

MySQL 的主從復(fù)制,就是將 MySQL 主數(shù)據(jù)庫中的數(shù)據(jù)復(fù)制到從數(shù)據(jù)庫中去。

主要目的是實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離,寫操作訪問主數(shù)據(jù)庫,讀操作訪問從數(shù)據(jù)庫,從而使數(shù)據(jù)庫具有更強(qiáng)大的訪問負(fù)載能力,支撐更多的用戶訪問。     

它的主要的復(fù)制原理是:當(dāng)應(yīng)用程序客戶端發(fā)送一條更新命令到數(shù)據(jù)庫的時(shí)候,數(shù)據(jù)庫會(huì)把這條更新命令同步記錄到 Binlog 中,然后由另外一個(gè)線程從 Binlog 中讀取這條日志,然后通過遠(yuǎn)程通訊的方式將它復(fù)制到從服務(wù)器上面去,從服務(wù)器獲得這條更新日志后,將其加入到自己的 Relay log 中,然后由另外一個(gè) SQL 執(zhí)行線程從 Relay log 中讀取這條新的日志,并把它在本地的數(shù)據(jù)庫中重新執(zhí)行一遍。

這樣當(dāng)客戶端應(yīng)用程序執(zhí)行一個(gè) update 命令的時(shí)候,這個(gè)命令會(huì)在主數(shù)據(jù)庫和從數(shù)據(jù)庫上同步執(zhí)行,從而實(shí)現(xiàn)了主數(shù)據(jù)庫向從數(shù)據(jù)庫的復(fù)制,讓從數(shù)據(jù)庫和主數(shù)據(jù)庫保持一樣的數(shù)據(jù)。

2.MySQL 的一主多從復(fù)制

MySQL 的主從復(fù)制是一種數(shù)據(jù)同步機(jī)制,除了可以將一個(gè)主數(shù)據(jù)庫中的數(shù)據(jù)同步復(fù)制到一個(gè)從數(shù)據(jù)庫上,還可以將一個(gè)主數(shù)據(jù)庫上的數(shù)據(jù)同步復(fù)制到多個(gè)從數(shù)據(jù)庫上,也就是所謂的 MySQL 的一主多從復(fù)制。

多個(gè)從數(shù)據(jù)庫關(guān)聯(lián)到主數(shù)據(jù)庫后,將主數(shù)據(jù)庫上的 Binlog 日志同步地復(fù)制到了多個(gè)從數(shù)據(jù)庫上。通過執(zhí)行日志,讓每個(gè)從數(shù)據(jù)庫的數(shù)據(jù)都和主數(shù)據(jù)庫上的數(shù)據(jù)保持了一致。這里面的數(shù)據(jù)更新操作表示的是所有數(shù)據(jù)庫的更新操作,除了不包括 SELECT 之類的查詢讀操作,其他的 INSERT、DELETE、UPDATE 這樣的 DML 寫操作,以及 CREATE TABLE、DROPT ABLE、ALTER TABLE 等 DDL 操作也都可以同步復(fù)制到從數(shù)據(jù)庫上去。

3. 一主多從復(fù)制的優(yōu)點(diǎn)

一主多從復(fù)制有四大優(yōu)點(diǎn),分別是分?jǐn)傌?fù)載、專機(jī)專用、便于冷備和高可用。

a. 分?jǐn)傌?fù)載

將只讀操作分布在多個(gè)從數(shù)據(jù)庫上,從而將負(fù)載分?jǐn)偟蕉嗯_(tái)服務(wù)器上。

b. 專機(jī)專用

可以針對(duì)不同類型的查詢,使用不同的從服務(wù)器。

c. 便于進(jìn)行冷備

即使數(shù)據(jù)庫進(jìn)行了一主多從的復(fù)制,在一些極端的情況下。也可能會(huì)導(dǎo)致整個(gè)數(shù)據(jù)中心的數(shù)據(jù)服務(wù)器都丟失。所以通常說來很多公司會(huì)對(duì)數(shù)據(jù)做冷備,但是進(jìn)行冷備的時(shí)候有一個(gè)困難點(diǎn)在于,數(shù)據(jù)庫如果正在進(jìn)行寫操作,冷備的數(shù)據(jù)就可能不完整,數(shù)據(jù)文件可能處于損壞狀態(tài)。使用一主多從的復(fù)制就就可以實(shí)現(xiàn)零停機(jī)時(shí)間的備份。只需要關(guān)閉數(shù)據(jù)的數(shù)據(jù)復(fù)制進(jìn)程,文件就處于關(guān)閉狀態(tài)了,然后進(jìn)行數(shù)據(jù)文件拷貝,拷貝完成后再重新打開數(shù)據(jù)復(fù)制就可以了。

d. 高可用

如果一臺(tái)服務(wù)器宕機(jī)了,只要不發(fā)請(qǐng)求給這臺(tái)服務(wù)器就不會(huì)出問題。當(dāng)這臺(tái)服務(wù)器恢復(fù)的時(shí)候,重新發(fā)請(qǐng)求到這臺(tái)服務(wù)器。所以,在一主多從的情況下,某一臺(tái)從服務(wù)器宕機(jī)不可用,對(duì)整個(gè)系統(tǒng)的影響是非常小的。

4.MySQL 的主主復(fù)制

但是一主多從只能夠?qū)崿F(xiàn)從服務(wù)器上的這些優(yōu)點(diǎn),當(dāng)主數(shù)據(jù)庫宕機(jī)不可用的時(shí)候,數(shù)據(jù)依然是不能夠?qū)懭氲模驗(yàn)閿?shù)據(jù)不能夠?qū)懭氲綇姆?wù)器上面去,從服務(wù)器是只讀的。

為了解決主服務(wù)器的可用性問題,我們可以使用 MySQL 的主主復(fù)制方案。所謂的主主復(fù)制方案是指兩臺(tái)服務(wù)器都當(dāng)作主服務(wù)器,任何一臺(tái)服務(wù)器上收到的寫操作都會(huì)復(fù)制到另一臺(tái)服務(wù)器上。     

如上主主復(fù)制原理圖,當(dāng)客戶端程序?qū)χ鞣?wù)器 A 進(jìn)行數(shù)據(jù)更新操作的時(shí)候,主服務(wù)器 A 會(huì)把更新操作寫入到 Binlog 日志中。然后 Binlog 會(huì)將數(shù)據(jù)日志同步到主服務(wù)器 B,寫入到主服務(wù)器的 Relay log 中,然后執(zhí) Relay log,獲得 Relay log 中的更新日志,執(zhí)行 SQL 操作寫入到數(shù)據(jù)庫服務(wù)器 B 的本地?cái)?shù)據(jù)庫中。B 服務(wù)器上的更新也同樣通過 Binlog 復(fù)制到了服務(wù)器 A 的 Relay log 中,然后通過 Relay log 將數(shù)據(jù)更新到服務(wù)器 A 中。

通過這種方式,服務(wù)器 A 或者 B 任何一臺(tái)服務(wù)器收到了數(shù)據(jù)的寫的操作都會(huì)同步更新到另一臺(tái)服務(wù)器,實(shí)現(xiàn)了數(shù)據(jù)庫主主復(fù)制。主主復(fù)制可以提高系統(tǒng)的寫可用,實(shí)現(xiàn)寫操作的高可用。

5.MySQL 的主主失效恢復(fù)

使用 MySQL 服務(wù)器實(shí)現(xiàn)主主復(fù)制時(shí),數(shù)據(jù)庫服務(wù)器失效該如何應(yīng)對(duì)?

正常情況下用戶會(huì)寫入到主服務(wù)器 A 中,然后數(shù)據(jù)從 A 復(fù)制到主服務(wù)器 B 上。當(dāng)主服務(wù)器 A 失效的時(shí)候,寫操作會(huì)被發(fā)送到主服務(wù)器 B 中去,數(shù)據(jù)從 B 服務(wù)器復(fù)制到 A 服務(wù)器。

主主失效的維護(hù)過程如下:

最開始的時(shí)候,所有的主服務(wù)器都可以正常使用,當(dāng)主服務(wù)器 A 失效的時(shí)候,進(jìn)入故障狀態(tài),應(yīng)用程序檢測(cè)到主服務(wù)器 A 失效,檢測(cè)到這個(gè)失效可能需要幾秒鐘或者幾分鐘的時(shí)間,然后應(yīng)用程序需要進(jìn)行失效轉(zhuǎn)移,將寫操作發(fā)送到備份主服務(wù)器 B 上面去,將讀操作發(fā)送到 B 服務(wù)器對(duì)應(yīng)的從服務(wù)器上面去。

一段時(shí)間后故障結(jié)束,A 服務(wù)器需要重建失效期間丟失的數(shù)據(jù),也就是把自己當(dāng)作從服務(wù)器從 B 服務(wù)器上面去同步數(shù)據(jù)。同步完成后系統(tǒng)才能恢復(fù)正常。這個(gè)時(shí)候 B 服務(wù)器是用戶的主要訪問服務(wù)器,A 服務(wù)器當(dāng)作備份服務(wù)器。

5.MySQL 復(fù)制注意事項(xiàng)

使用 MySQL 進(jìn)行主主復(fù)制的時(shí)候需要注意的事項(xiàng)如下:
a. 不要對(duì)兩個(gè)數(shù)據(jù)庫同時(shí)進(jìn)行數(shù)據(jù)寫操作,因?yàn)檫@種情況會(huì)導(dǎo)致數(shù)據(jù)沖突。
b. 復(fù)制只是增加了數(shù)據(jù)的讀并發(fā)處理能力,并沒有增加寫并發(fā)的能力和系統(tǒng)存儲(chǔ)能力。

c. 更新數(shù)據(jù)表的結(jié)構(gòu)會(huì)導(dǎo)致巨大的同步延遲。

需要更新表結(jié)構(gòu)的操作,不要寫入到到 Binlog 中,要關(guān)閉更新表結(jié)構(gòu)的 Binlog。如果要對(duì)表結(jié)構(gòu)進(jìn)行更新,應(yīng)該由運(yùn)維工程師 DBA 對(duì)所有主從數(shù)據(jù)庫分別手工進(jìn)行數(shù)據(jù)表結(jié)構(gòu)的更新操作。

二、數(shù)據(jù)分片

數(shù)據(jù)復(fù)制只能提高數(shù)據(jù)讀并發(fā)操作能力,并不能提高數(shù)據(jù)寫操作并發(fā)的能力以及數(shù)據(jù)整個(gè)的存儲(chǔ)容量,也就是并不能提高數(shù)據(jù)庫總存儲(chǔ)記錄數(shù)。如果我們數(shù)據(jù)庫的寫操作也有大量的并發(fā)請(qǐng)求需要滿足,或者是我們的數(shù)據(jù)表特別大,單一的服務(wù)器甚至連一張表都無法存儲(chǔ)。解決方案就是數(shù)據(jù)分片。

1. 數(shù)據(jù)分片介紹  

a. 主要目標(biāo):將一張數(shù)據(jù)表切分成較小的片,不同的片存儲(chǔ)到不同的服務(wù)器上面去,通過分片的方式使用多臺(tái)服務(wù)器存儲(chǔ)一張數(shù)據(jù)表,避免一臺(tái)服務(wù)器記錄存儲(chǔ)處理整張數(shù)據(jù)表帶來的存儲(chǔ)及訪問壓力。
b. 主要特點(diǎn):數(shù)據(jù)庫服務(wù)器之間互相獨(dú)立,不共享任何信息,即使有部分服務(wù)器故障,也不影響整個(gè)系統(tǒng)的可用性。第二個(gè)特點(diǎn)是通過分片鍵定位分片,也就是說一個(gè)分片存儲(chǔ)到哪個(gè)服務(wù)器上面去,到哪個(gè)服服務(wù)器上面去查找,是通過分片鍵進(jìn)行路由分區(qū)算法計(jì)算出來的。在 SQL 語句里面,只要包含分片鍵,就可以訪問特定的服務(wù)器,而不需要連接所有的服務(wù)器,跟其他的服務(wù)器進(jìn)行通信。
. 主要原理:將數(shù)據(jù)以某種方式進(jìn)行切分,通常就是用剛才提到的分片鍵的路由算法。通過分片鍵,根據(jù)某種路由算法進(jìn)行計(jì)算,使每臺(tái)服務(wù)器都只存儲(chǔ)一部分?jǐn)?shù)據(jù)。

2. 硬編碼實(shí)現(xiàn)數(shù)據(jù)分片

如圖例子,通過應(yīng)用程序硬編碼的方式實(shí)現(xiàn)數(shù)據(jù)分片。假設(shè)我們的數(shù)據(jù)庫將數(shù)據(jù)表根據(jù)用戶 ID 進(jìn)行分片,分片的邏輯是用戶 ID 為奇數(shù)的數(shù)據(jù)存儲(chǔ)在服務(wù)器 2 中,用戶 ID 為偶數(shù)的數(shù)據(jù)存儲(chǔ)在服務(wù)器 1 中。那么,應(yīng)用程序在編碼的時(shí)候,就可以直接通過用戶 ID 進(jìn)行哈希計(jì)算,通常是余數(shù)計(jì)算。如果余數(shù)為奇數(shù)就連接到服務(wù)器 2 上,如果余數(shù)為偶數(shù),就連接到服務(wù)器 1 上,這樣就實(shí)現(xiàn)了一張用戶表分片在兩個(gè)服務(wù)器上。

這種硬編碼主要的缺點(diǎn)在于,數(shù)據(jù)庫的分片邏輯是應(yīng)用程序自身實(shí)現(xiàn)的,應(yīng)用程序需要耦合數(shù)據(jù)庫分片邏輯,不利于應(yīng)用程序的維護(hù)和擴(kuò)展。一個(gè)簡(jiǎn)單的解決辦法就是將映射關(guān)系存儲(chǔ)在外面。

3. 映射表外部存儲(chǔ)  

應(yīng)用程序在連接數(shù)據(jù)庫進(jìn)行 SQL 操作的時(shí)候,通過查找外部的數(shù)據(jù)存儲(chǔ)查詢自己應(yīng)該連接到哪臺(tái)服務(wù)器上面去,然后根據(jù)返回的服務(wù)器的編號(hào),連接對(duì)應(yīng)的服務(wù)器執(zhí)行相應(yīng)的操作。在這個(gè)例子中,用戶 ID=33 查是 2,用戶 ID=94 查也是 2,它們根據(jù)查找到的用戶服務(wù)器的編號(hào),連接對(duì)應(yīng)的服務(wù)器,將數(shù)據(jù)寫入到對(duì)應(yīng)的服務(wù)器分片中。

4. 數(shù)據(jù)分片的挑戰(zhàn)及解決方案  

數(shù)據(jù)庫分片面臨如圖的挑戰(zhàn): 

現(xiàn)在有一些專門的分布式數(shù)據(jù)庫中間件來解決上述這些問題,比較知名的有 Mycat。Mycat 是一個(gè)專門的分布式數(shù)據(jù)庫中間件,應(yīng)用程序像連接數(shù)據(jù)庫一樣的連接 Mycat,而數(shù)據(jù)分片的操作完全交給了 Mycat 去完成。

如下這個(gè)例子中,有 3 個(gè)分片數(shù)據(jù)庫服務(wù)器,數(shù)據(jù)庫服務(wù)器 dn1、dn2 和 dn3,它們的分片規(guī)則是根據(jù) prov 字段進(jìn)行分片。那么,當(dāng)我們執(zhí)行一個(gè)查詢操作”select * from orders where prov=’wuhan’“的時(shí)候,Mycat 會(huì)根據(jù)分片規(guī)則將這條 SQL 操作路由到 dn1 這個(gè)服務(wù)器節(jié)點(diǎn)上。dn1 執(zhí)行數(shù)據(jù)查詢操作返回結(jié)果后,Mycat 再返回給應(yīng)用程序。通過使用 Mycat 這樣的分布式數(shù)據(jù)庫中間件,應(yīng)用程序可以透明的無感知的使用分片數(shù)據(jù)庫。同時(shí),Mycat 還一定程度上支持分片數(shù)據(jù)庫的聯(lián)合 join 查詢以及數(shù)據(jù)庫事務(wù)。

5. 分片數(shù)據(jù)庫擴(kuò)容伸縮
一開始,數(shù)據(jù)量還不是太多,兩個(gè)數(shù)據(jù)庫服務(wù)器就夠了。但是隨著數(shù)據(jù)的不斷增長(zhǎng),可能需要增加第三個(gè)第四個(gè)第五個(gè)甚至更多的服務(wù)器。在增加服務(wù)器的過程中,分片規(guī)則需要改變。分片規(guī)則改變后,以前寫入到原來的數(shù)據(jù)庫中的數(shù)據(jù),根據(jù)新的分片規(guī)則,可能要訪問新的服務(wù)器,所以還需要進(jìn)行數(shù)據(jù)遷移。
不管是更改路由算法規(guī)則,還是進(jìn)行數(shù)據(jù)遷移,都是一些比較麻煩和復(fù)雜的事情。因此在實(shí)踐中通常的做法是數(shù)據(jù)分片使用邏輯數(shù)據(jù)庫,也就是說一開始雖然只需要兩個(gè)服務(wù)器就可以完成數(shù)據(jù)分片存儲(chǔ),但是依然在邏輯上把它切分成多個(gè)邏輯數(shù)據(jù)庫。具體的操作辦法,本文不用大篇幅進(jìn)行闡述了。

三、數(shù)據(jù)庫部署方案

1. 單一服務(wù)和單一數(shù)據(jù)庫  

這是最簡(jiǎn)單的部署方案。應(yīng)用服務(wù)器可能有多個(gè),但是它們完成的功能是單一的功能。多個(gè)完成單一功能的服務(wù)器,通過負(fù)載均衡對(duì)外提供服務(wù)。它們只連一臺(tái)單一數(shù)據(jù)庫服務(wù)器,這是應(yīng)用系統(tǒng)早期用戶量比較低的時(shí)候的一種架構(gòu)方法。

2. 主從復(fù)制實(shí)現(xiàn)伸縮  

如果對(duì)系統(tǒng)的可用性和對(duì)數(shù)據(jù)庫的訪問性能提出更高要求的時(shí)候,就可以通過數(shù)據(jù)庫的主從復(fù)制進(jìn)行初步的伸縮。通過主從復(fù)制,實(shí)現(xiàn)一主多從。應(yīng)用服務(wù)器的寫操作連接主數(shù)據(jù)庫,讀操作從從服務(wù)器上進(jìn)行讀取。

3. 兩個(gè) Web 服務(wù)及兩個(gè)數(shù)據(jù)庫  

隨著業(yè)務(wù)更加復(fù)雜,為了提供更高的數(shù)據(jù)庫處理能力,可以進(jìn)行數(shù)據(jù)的業(yè)務(wù)分庫。數(shù)據(jù)的業(yè)務(wù)分庫是一種邏輯上的,是基于功能的一種分割,將不同用途的數(shù)據(jù)表存儲(chǔ)在不同的物理數(shù)據(jù)庫上面去。

在這個(gè)例子中,有產(chǎn)品類目服務(wù)和用戶服務(wù),兩個(gè)應(yīng)用服務(wù)器集群,對(duì)應(yīng)的也將數(shù)據(jù)庫也拆分成兩個(gè),一個(gè)叫做類目數(shù)據(jù)庫,一個(gè)叫做用戶數(shù)據(jù)庫。每個(gè)數(shù)據(jù)庫依然使用主從復(fù)制。通過業(yè)務(wù)分庫的方式,在同一個(gè)系統(tǒng)中,提供了更多的數(shù)據(jù)庫存儲(chǔ),同時(shí)也就提供了更強(qiáng)大的數(shù)據(jù)訪問能力,同時(shí)也使系統(tǒng)變得更加簡(jiǎn)單,系統(tǒng)的耦合變得更低。

如何解決億級(jí)用戶的分布式數(shù)據(jù)庫數(shù)據(jù)存儲(chǔ)問題

4. 綜合部署方案  

根據(jù)不同數(shù)據(jù)的訪問特點(diǎn),使用不同的解決方案進(jìn)行應(yīng)對(duì)。比如說類目數(shù)據(jù)庫,也許通過主從復(fù)制就能夠滿足所有的訪問要求。但是如果用戶量特別大,進(jìn)行主從復(fù)制或主主復(fù)制,還是不能夠滿足數(shù)據(jù)存儲(chǔ)以及寫操作的訪問壓力,這時(shí)候就就可以對(duì)用戶數(shù)據(jù)庫進(jìn)行數(shù)據(jù)分片存儲(chǔ)了。同時(shí)每個(gè)分片數(shù)據(jù)庫也使用主從復(fù)制的方式進(jìn)行部署。

關(guān)于如何解決億級(jí)用戶的分布式數(shù)據(jù)庫數(shù)據(jù)存儲(chǔ)問題就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-17發(fā)表,共計(jì)4582字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒有評(píng)論)
主站蜘蛛池模板: 报价| 方正县| 宁晋县| 八宿县| 孝感市| 西盟| 禹城市| 十堰市| 南汇区| 丹阳市| 徐水县| 新源县| 梁山县| 建昌县| 临潭县| 庆云县| 哈巴河县| 抚宁县| 宾川县| 太康县| 报价| 梅河口市| 衡阳市| 息烽县| 临城县| 德惠市| 固镇县| 武胜县| 酒泉市| 新民市| 诏安县| 万州区| 道孚县| 上蔡县| 玉山县| 龙南县| 密山市| 蒙城县| 涞源县| 咸丰县| 垣曲县|