1. 程式人生 > >解決數據庫高並發

解決數據庫高並發

binlog 表鎖 而且 解決辦法。 表關聯 緩存數據庫 sele 整合 帶來

解決數據庫高並發的常見方案:

1) 緩存式的 Web 應用程序架構:

在 Web 層和 DB(數據庫)層之間加一層 cache 層,主要目的:減少數據庫讀取負擔,提高數 據讀取速度。cache 存取的媒介是內存,可以考慮采用分布式的 cache 層,這樣更容易破除內存容量 的限制,同時增加了靈活性。

2) 增加 Redis 緩存數據庫:

把經常訪問到的數據而且不需要經常變化的數據放在緩存中。

主要針對於數據與用戶無直接關聯,寫少讀多的數據,使用緩存來減少數據庫的壓力。

第一獲取數據從數據庫中提取,然後保存在緩存中,以後就可以直接從緩存中加載數據,需要有機制維持緩存和數據庫的一致性。

3) 增加數據庫索引:

索引可以看作是特殊的緩存,盡量使用索引就要求where字句中精確的給出索引列的值。

4) 頁面靜態化:

效率最高、消耗最小的就是純靜態化的 html 頁面,所以我們盡可能使我們的網站上的頁面采 用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。用戶可以直接獲取頁面,不用像 MVC 結構走那麽多流程,比較適用於頁面信息大量被前臺程序調用,但是更新頻率很小的情況。

5) 使用存儲過程:

處理一次請求需要多次訪問數據庫的操作,可以把操作整合到儲存過程,這樣只要一次數據庫訪問就可以了。

6) MySQL 主從讀寫分離:

當數據庫的寫壓力增加,cache 層(如 Memcached)只能緩解數據庫的讀取壓力。讀寫集 中在一個數據庫上讓數據庫不堪重負。使用主從復制技術(master-slave 模式)來達到讀寫分離,以 提高讀寫性能和讀庫的可擴展性。讀寫分離就是只在主服務器上寫,只在從服務器上讀,基本原理是 讓主數據庫處理事務性查詢,而從數據庫處理 select 查詢,數據庫復制被用於把事務性查詢(增刪改) 導致的改變更新同步到集群中的從數據庫。

MySQL 讀寫分離提升系統性能: 

1、主從只負責各自的讀和寫,極大程度緩解 X 鎖和 S 鎖爭用。
2、slave 可以配置 MyISAM 引擎,提升查詢性能以及節約系統開銷。
3、master 直接寫是並發的,slave 通過主庫發送來的 binlog 恢復數據是異步的。

4、slave 可以單獨設置一些參數來提升其讀的性能。
5、增加冗余,提高可用性。
實現主從分離可以使用 MySQL 中間件如:Atlas

7) 分表分庫:

在 cache 層的高速緩存,MySQL 的主從復制,讀寫分離的基礎上,這時 MySQL 主庫的寫 壓力開始出現瓶頸,而數據量的持續猛增,由於 MyISAM 使用表鎖,在高並發下會出現嚴重的鎖問 題,大量的高並發 MySQL 應用開始使用 InnoDB 引擎代替 MyISAM。采用 Master-Slave 復制模式 的 MySQL 架構,只能對數據庫的讀進行擴展,而對數據的寫操作還是集中在 Master 上。這時需要 對數據庫的吞吐能力進一步地擴展,以滿足高並發訪問與海量數據存儲的需求。

對於訪問極為頻繁且數據量巨大的單表來說,首先要做的是減少單表的記錄條數,以便減少 數據查詢所需的時間,提高數據庫的吞吐,這就是所謂的分表【水平拆分】。在分表之前,首先需要 選擇適當的分表策略(盡量避免分出來的多表關聯查詢),使得數據能夠較為均衡地分布到多張表中, 並且不影響正常的查詢。

分表能夠解決單表數據量過大帶來的查詢效率下降的問題,但是卻無法給數據庫的並發處理 能力帶來質的提升。面對高並發的讀寫訪問,當數據庫 master 服務器無法承載寫操作壓力時,不管 如何擴展 Slave 服務器都是沒有意義的,對數據庫進行拆分,從而提高數據庫寫入能力,即分庫【垂直拆分】。

8) 負載均衡集群:

將大量的並發請求分擔到多個處理節點。由於單個處理節點的故障不影響整個服務,負載均衡集群同時也實現了高可用性。

負載均衡將是大型網站解決高負荷訪問和大量並發請求采用的終極解決辦法。

解決數據庫高並發