成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數據庫的這些性能優化,你做了嗎?

數據庫
在互聯網項目中,當業務規模越來越大,數據也越來越多,隨之而來的就是數據庫壓力會越來越大。我們可能會采取各種方式去優化,比如之前文章提到的緩存方案,SQL優化等等,除了這些方式以外,這里再分享幾個針對數據庫優化的常規手段:「數據讀寫分離」與「數據庫Sharding」。

[[243001]]

在互聯網項目中,當業務規模越來越大,數據也越來越多,隨之而來的就是數據庫壓力會越來越大。

我們可能會采取各種方式去優化,比如之前文章提到的緩存方案,SQL優化等等,除了這些方式以外,這里再分享幾個針對數據庫優化的常規手段:「數據讀寫分離」與「數據庫Sharding」。這兩點基本上是大中型互聯網項目中應用的非常普遍的方案了。

下面我們來詳細看一看,

一、從讀寫分離到CQRS

數據庫的這些性能優化,你做了嗎?

(圖片來源阿里云)

由于互聯網業務場景,大多數是讀多寫少,因此進行數據庫的讀寫分離是一件非常簡單且有效率的方案。

讀寫分離簡單點來說就是把對數據的讀操作和寫操作進行分開來,讓這兩種操作去訪問不同的數據庫,這樣的話,就可以減輕數據庫的壓力了。

例如上圖中,數據庫會有一個「主實例」,這個主要用來提供寫操作的(偶爾也會承擔一點讀操作),除了「主實例」以外,還會有多個「從實例」(在圖中顯示的是 只讀實例),「從實例」的功能只是用來承擔讀操作的。

那上面就出現了多個數據庫了,在多個數據庫之間的數據是怎么保證一致性的呢?

其實,我們常用的數據庫就自帶這類同步功能,比如 Mysql,它自己有一個master-slave功能,可以實現主庫與從庫數據的自動同步,是基于二進制日志復制來實現的。在主庫進行的寫操作,會形成二進制日志,然后Mysql會把這個日志異步的同步到從庫上,從庫再自動執行一遍這個二進制日志,那么數據就跟主庫一致了。

除了Mysql以外,像Oracle等商業數據庫都有類似的功能,甚至是網絡上還有很多開源的第三方數據同步工具,也有很多成熟好用的。

好了,「主實例」與「從實例」之間的數據同步問題解決了,那現在還有一個問題就是,項目中是怎樣讓 寫請求 去訪問「主實例」,讓 讀請求 去訪問「從實例」的,這個路由規則是怎么實現的呢?

常規的有2種方式:

使用編碼方式

這個方式主要是靠開發同學在編碼的時候,根據讀寫不同的操作需求,去調用不同的數據源。例如在數據操作層(DAO層)將讀數據與寫數據分開為兩個方法(函數),然后為這兩個方法分別指定不同的數據庫即可。

但是這種方式有點硬編碼的味道了,而且對開發同學而言還得額外關注這個事情,多了一個編碼成本且容易不小心忽略掉。

使用中間件

這種方式就是在后端數據庫的前面,前置一個 數據庫代理服務,如下圖的:MySQL-Proxy 是Mysql提供的一個中間件,用于實現讀寫分離請求,但這個組件實際用的人不多,我們可以選擇其它的一些開源的組件替代,例如:MyCat、ProxySQL 等等,但大致的原理比較類似,通過這個圖很容易理解這個模式。

好了,基礎的讀寫分離就講完了,但感覺這個方式雖然實用是實用,就是不怎么有逼格。

OK,想要有逼格是吧,滿足你,那我們就來聊一聊另一個有逼格的讀寫分離概念: 「 CQRS 」

CQRS:Command Query Responsibility Segregation

命令(增刪改)和查詢的責任分離

我們還是先看圖,通過上圖可以簡單的理解一下CQRS

CQRS 重點強調的就是 Query(讀) 和 Command(寫)的分離,在業務上將職責分離清晰,Command 主要做業務邏輯的執行,Query來負責數據查詢和展示。同時 這兩種操作是基于不同的數據源,甚至是一個是數據庫,另外一個是NoSQL都可以,Query去查詢的數據源可以直接按照領域模型進行存儲,而并不是按照數據模型去存儲,這樣查詢出來就立即可以展示,而不用轉換,且查詢效率高。

其實CQRS是由鼎鼎大名的 Martin Fowler 提出,搞計算機的應該都認識。想要更深入的去學習CQRS,可以翻看Martin Fowler公開的資料。

二、Sharding(分庫分表)

上面講完了數據庫的讀寫分離,現在我們來聊一下數據庫的Sharding。

隨著數據庫里的數據越來越大,單表查詢的性能已經不能滿足業務要求了,這個時候就需要進行分表處理了,將大表拆分為若干個小表,不同的分表中數據也不一樣,這樣可以分散查詢壓力,提高處理效率。

然而,當表越來越多,所有的數據都在一個數據庫上時,網絡IO以及文件IO也都會集中在一個數據庫上,可能會超過單臺服務器的容量, CPU、內存、文件IO、網絡IO 都會成為系統的瓶頸,QPS/TPS也會超過單數據庫實例的處理極限。那么這個時候就需要對數據庫進行分片處理。

因為分表和分庫的思路類似,因此下面統一來聊技術方案。

其實分庫分表只是我們通俗的便于理解的說話,正確的描述應該是:數據分片

數據的分片主要有2種模式:

  • 垂直拆分
  • 水平拆分

兩種拆分應用的場景是不同的:

垂直拆分,是指按照業務模塊進行拆分。簡單來講,就是把業務緊密的模塊的字段/表放在一起,放在同一個數據庫或者服務器上。將不同業務的字段/表進行獨立,拆到不同的數據庫或者服務器上。比如一個游戲系統中,可以將玩家基本信息與道具公會等信息進行拆分。

如圖示例:

 

(圖片來源網絡)

水平拆分,是指純粹的按照某種數據規則/格式進行拆分。例如 按照數據唯一ID的哈希散列拆分、按照數據的日期拆分、按照某種范圍拆分等等。水平拆分需要注意的是,隨著數據動態的變化,分片數量可能需要隨之動態調整,另外就是水平分片是沒有考慮業務特征的,因此在進行業務匯總查詢或者分片中事物處理的時候就比較麻煩一些。

如圖示例: 

數據庫的這些性能優化,你做了嗎?

另外,在實際應用中,兩種拆分模式一般會結合在一起使用,效果更佳。 

以上就是數據庫性能優化之「數據讀寫分離」與「數據庫Sharding」方法,歡迎大家一起交流。 

責任編輯:龐桂玉 來源: 數據庫開發
相關推薦

2011-04-20 14:52:02

數據庫優化

2019-01-03 14:30:04

數據庫優化索引

2023-02-26 23:33:02

SQLMySQL數據庫

2013-09-17 10:32:08

Android性能優化數據庫

2022-10-24 08:45:23

數據庫應用場景區塊鏈

2023-05-11 08:14:58

國產數據庫用戶

2016-10-13 19:31:56

大數據應用大數據

2021-01-31 17:50:41

數據庫查詢程序員

2011-05-18 09:39:19

Oracle數據庫性能優化

2011-05-20 10:30:20

ORACLE數據庫性能優化

2018-04-10 14:36:18

數據庫MySQL優化技巧

2024-10-31 09:15:09

2023-07-12 08:55:16

PawSQL數據庫

2024-08-21 08:27:30

擴展數據庫服務器

2024-10-22 10:40:30

2010-11-15 16:13:24

Oracle數據庫性能

2009-06-30 22:31:23

關鍵參數MySQL性能優化

2023-04-03 10:25:00

數據庫性能調優

2010-05-10 15:50:39

Oracle數據庫性能

2021-03-05 18:38:45

ESvue項目
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本黄色免费视频 | 99久久婷婷国产综合精品首页 | h视频网站在线观看 | 色在线免费视频 | 中午字幕在线观看 | 盗摄精品av一区二区三区 | 亚洲网站在线观看 | 91青娱乐在线 | 激情毛片 | 国产一区二区精品在线 | 中文字幕不卡在线观看 | 国产一区二区三区在线看 | 99免费看 | 日韩色图在线观看 | 精品久久久久久久久久久下田 | 久久精品亚洲欧美日韩久久 | 成人亚洲片 | 成人亚洲片 | 久久亚洲视频网 | 999视频在线播放 | a级性视频 | 亚洲精品大片 | 久久久做 | 亚洲一区二区 | 99久久婷婷国产综合精品 | 亚洲福利网 | 一区二区三区在线免费观看 | www国产成人免费观看视频,深夜成人网 | 欧美日韩在线国产 | 久久久久久99 | 一区二区三区国产精品 | 欧美精品综合在线 | 久久99久久98精品免观看软件 | 国产一级片一区二区三区 | 黄色网址av | 午夜精品久久久 | 国产一区2区| 国产精品18久久久久久久 | 精品99在线 | 天天操夜夜骑 | 精品一区二区三区在线视频 |