給了資料庫,給了機器,為啥也擴不了容?

2022-05-05 11:09:12 字數 1756 閱讀 7973

隨著業務越來越複雜,資料量越來越大,併發量越來越大,資料庫的效能越來越低。好不容易找運維申請了兩台機器,讓dba部署了幾個例項,想把一些業務庫拆分出來,卻發現拆不出來,擴不了容,尷尬!

因為資料庫強關聯在一起,無法通過增加資料庫例項擴容,就是乙個耦合的典型案例。

場景還原

有乙個公共使用者資料庫db_user,裡面table_user存放了通用的使用者資料:

table_user (uid, name, passwd, …)

table_a(uid, a業務的個性化屬性)

業務a有乙個需求,即要展現使用者公共屬性,又要展現業務a個性化屬性,程式設計師經常這麼實現的:

select * from table_user, table_a

where table_user.uid = table_a.uid

and table_user.uid = $uid

初期關聯查詢沒有任何問題,單條記錄訪問,命中索引,一次查詢所有資料,簡單高效。

如何產生各業務資料耦合?

通過join實現業務,導致通用表table_user和業務表table_a必須存在於乙個資料庫例項裡。

如果業務b也這麼做,業務c也這麼做,會導致公用業務,業務a,業務b,業務c都必須存在於乙個資料庫例項裡。

會產生什麼潛在問題呢?

假如a業務線上線了乙個新功能,不小心進行了全表掃瞄,導致資料庫cpu100%,資料庫例項效能下降,由於例項共用,通用業務,業務b和業務c都會受影響。

即某個業務線的資料庫效能急劇下降導致所有業務都受影響,這種耦合,歷史總是驚人的相似:

業務b的大boss在群裡首先發飆:「技術都幹啥了,怎麼系統掛了」

業務b的rd一臉無辜:「業務a上線了,所以我們掛了」

額,然而,這個理由,好像在大boss那解釋不通…

業務b的大boss:「趕緊加幾台機器,拆分開」

業務b的rd一臉無奈:「加機器加例項也擴容不了」

業務b的大boss對業務2的rd吼道「還想甩鍋,拖出去祭天」

唉,加了幾台機器,加了幾個例項,然而並沒有什麼卵用,都耦合在乙個例項裡,完全擴不了容。

那,如何解除公共資料庫與業務資料庫的耦合?

第一步:公共資料訪問下沉服務化

還是上面的例子,當公共的user資料訪問服務化之後,依據服務化的原則:

業務層只能通過服務rpc介面訪問資料

底層user庫屬於user服務私有

任何上游不允許跨過服務訪問底層的user庫

第二步:垂直拆分,個性化資料訪問上浮

原來業務方:

通過join一次性獲取通用的資料和個性化的業務資料資料

服務化+垂直拆分後,變成兩次訪問:

一次取得業務資料(業務可以直接呼叫自己的資料庫,也可以自己做業務服務呼叫rpc介面)

一次取得共性資料(呼叫通用的rpc介面)

兩種方式相比:

之前的方式其實業務**可能會更簡單一些,因為它是將這個業務邏輯放在了sql語句中,但是導致資料庫耦合在了一起

後面這種方式就是業務的**會更複雜,會變成多次訪問,將原來在sql中進行的邏輯計算變成業務**中的邏輯計算,但是資料庫解耦了

業務複雜,資料量大,併發老大,對擴充套件性要求更高的架構,一定是後者。

此時各業務有自己的庫,公共有公共的庫:

早期:可以放在乙個資料庫例項裡

後期:可以很容易地通過新增資料庫例項,把user庫或者業務a/b/c的庫拆分出來,實現增加機器增加例項就實現擴容

個性業務資料訪問垂直拆分,共性資料訪問服務化下沉,只是乙個很小的優化點,但對於資料庫解耦卻是非常的有效。

當我給了你體諒也給了自己遠方 傷感日誌

當我給了你體諒也給了自己遠方 傷感日誌 當我給了你體諒也給了自己遠方 傷感日誌 那一晚 突然想起許久不曾想起的你 本來已經放棄 本來就知道無能為力 本來以為我可以 可以就這樣淡淡的 悄無聲息的將你忘記 可是在這樣乙個平常的夜裡 我輸給了自己 你我只是朋友 你比誰都清楚!手機傳來你的簡訊 很簡單的一句...

給資料庫使用者授權

給資料庫使用者授權 必須要管理員dba給資料庫使用者授權 通常許可權有 插入 insert 刪除 delete 更新 update 檢視 select 建立表 create table 例子 給加入的兩個資料庫使用者增加許可權 use studb go 給予zhangsandnuser對於stuin...

給資料庫使用者解鎖

1 用dba角色的使用者登陸,進行解鎖,先設定具體時間格式,以便檢視具體時間 sql alter session set nls date format yyyy mm dd hh24 mi ss session altered.2 檢視具體的被鎖時間 這裡你根據需要,填寫具體的使用者名稱,下面語句...