數據庫分庫分表、讀寫分離的原理和實現,以及使用場景

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

為什么要分庫分表和讀寫分離?

類似淘寶網這樣的網站,海量數據的存儲和訪問成為了系統設計的瓶頸問題,日益增長的業務數據,無疑對數據庫造成了相當大的負載,同時對于系統的穩定性和擴展性提出很高的要求。隨著時間和業務的發展,數據庫中的表會越來越多,表中的數據量也會越來越大,相應地,數據操作的開銷也會越來越大;另外,無論怎樣升級硬件資源,單臺服務器的資源(CPU、磁盤、內存、網絡IO、事務數、連接數)總是有限的,最終數據庫所能承載的數據量、數據處理能力都將遭遇瓶頸。分表、分庫和讀寫分離可以有效地減小單臺數據庫的壓力。

分庫分表的原理和實現

1.什么是分區、分表、分庫

分區

就是把一張表的數據分成N個區塊,在邏輯上看最終只是一張表,但底層是由N個物理區塊組成的,分區實現比較簡單,數據庫mysql、oracle等很容易就可支持。

分表

就是把一張表按一定的規則分解成N個具有獨立存儲空間的實體表。系統讀寫時需要根據定義好的規則得到對應的字表明,然后操作它。

分庫

一旦分表,一個庫中的表會越來越多

將整個數據庫比作圖書館,一張表就是一本書。當要在一本書中查找某項內容時,如果不分章節,查找的效率將會下降。而同理,在數據庫中就是分區。

2.什么時候考慮使用分區?

一張表的查詢速度已經慢到影響使用的時候。

sql經過優化

數據量大

表中的數據是分段的

對數據的操作往往只涉及一部分數據,而不是所有的數據

分區解決的問題

主要可以提升查詢效率

分區的實現方式(簡單),例如:

mysql5 開始支持分區功能

CREATE TABLE sales ( id INT AUTO_INCREMENT,

amount DOUBLE NOT NULL,

order_day DATETIME NOT NULL,

PRIMARY KEY(id, order_day)

) ENGINE=Innodb

PARTITION BY RANGE(YEAR(order_day)) (

PARTITION p_2010 VALUES LESS THAN (2010),

PARTITION p_2011 VALUES LESS THAN (2011),

PARTITION p_2012 VALUES LESS THAN (2012),

PARTITION p_catchall VALUES LESS THAN MAXVALUE);

3.什么時候考慮分表?

一張表的查詢速度已經慢到影響使用的時候。

sql經過優化

數據量大

當頻繁插入或者聯合查詢時,速度變慢

4.分表解決的問題

分表后,單表的并發能力提高了,磁盤I/O性能也提高了,寫操作效率提高了

查詢一次的時間短了

數據分布在不同的文件,磁盤I/O性能提高

讀寫鎖影響的數據量變小

插入數據庫需要重新建立索引的數據減少

5.分表的實現方式(復雜)

需要業務系統配合遷移升級,工作量較大。

6.常見分表、分庫常用策略:

1.平均進行分配hash(object)%N(適用于簡單架構)。

2.按照權重進行分配且均勻輪詢。

3.按照業務進行分配。

4.按照一致性hash算法進行分配(適用于集群架構,在集群中節點的添加和刪除不會造成數據丟失,方便數據遷移)。

7.分庫分表中間件

分表又分為單庫分表(表名不同)和多庫分表(表名相同),不管使用哪種策略都還需要自己去實現路由,制定路由規則等,可以考慮使用開源的分庫分表中間件,無侵入應用設計,例如淘寶的tddl等。

讀寫分離的原理和實現

1、什么是讀寫分離

讀寫分離,基本的原理是讓主數據庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從數據庫處理SELECT查詢操作。數據庫復制被用來把事務性操作導致的變更同步到集群中的從數據庫。

2、為什么要讀寫分離呢?

因為數據庫的“寫”(寫10000條數據到oracle可能要3分鐘)操作是比較耗時的。

但是數據庫的“讀”(從oracle讀10000條數據可能只要5秒鐘)。

所以讀寫分離,解決的是,數據庫的寫入,影響了查詢的效率。

3、什么時候要讀寫分離?

數據庫不一定要讀寫分離,如果程序使用數據庫較多時,而更新少,查詢多的情況下會考慮使用,利用數據庫 主從同步 。可以減少數據庫壓力,提高性能。當然,數據庫也有其它優化方案。memcache 或是 表折分,或是搜索引擎。都是解決方法。

4.主從復制、讀寫分離的基本設計

在實際的生產環境中,對數據庫的讀和寫都在同一個數據庫服務器中,是不能滿足實際需求的。無論是在安全性、高可用性還是高并發等各個方面都是完全不能滿足實際需求的。因此,通過主從復制的方式來同步數據,再通過讀寫分離來提升數據庫的并發負載能力。

一臺主、多臺從,主提供寫操作,從提供讀操作。

讀寫分離的實現:

我們只需要實現讀寫分離,主從復制數據一般由數據庫級來實現同步,當然也可以自己去實現同步,只是需要考慮的點比較多。

分庫分表、讀寫分離總結

1.分區

對業務透明,分區只不過把存放數據的文件分成了許多小塊,根據一定的規則把數據文件(MYD)和索引文件(MYI)進行了分割,分區后的表呢,還是一張表。

2.分表

當數據量大到一定程度的時候,都會導致處理性能的不足,這個時候就沒有辦法了,只能進行分表處理。也就是把數據庫當中數據根據按照分庫原則分到多個數據表當中,這樣,就可以把大表變成多個小表,不同的分表中數據不重復,從而提高處理效率。

3.分庫

分表和分區都是基于同一個數據庫里的數據分離技巧,對數據庫性能有一定提升,但是隨著業務數據量的增加,原來所有的數據都是在一個數據庫上的,網絡IO及文件IO都集中在一個數據庫上的,因此CPU、內存、文件IO、網絡IO都可能會成為系統瓶頸。

當業務系統的數據容量接近或超過單臺服務器的容量、QPS/TPS接近或超過單個數據庫實例的處理極限等此時,往往是采用垂直和水平結合的數據拆分方法,把數據服務和數據存儲分布到多臺數據庫服務器上。

4.讀寫分離方案

當數據庫讀遠大于寫,查詢多的情況,就可以考慮主數據負責寫操作,從數據庫負責讀操作,一主多重,從而把數據讀寫分離,最后還可以結合redis等緩存來配合分擔數據的讀操作,大大的降低后端數據庫的壓力。

轉載于:https://my.oschina.net/u/3778090/blog/2051657

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282122.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282122.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282122.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

談談一些有趣的CSS題目(十六)-- 奇妙的 background-clip: text

開本系列,談談一些有趣的 CSS 題目,題目類型天馬行空,想到什么說什么,不僅為了拓寬一下解決問題的思路,更涉及一些容易忽視的 CSS 細節。 解題不考慮兼容性,題目天馬行空,想到什么說什么&#x…

第五周軟件工程作業-每周例行報告

一、PSP T名稱C內容ST開始時間ED結束時間中斷時間/min實際時間/minScrum會議第一次Scrum會議10月13日11:3010月13日12:10040第二次Scrum會議10月14日15:3010月14日15:55025第三次Scrum會議10月15日13:3010月15日14:05035第四次Scrum會議10月16日11:3010月16日13:00090第五次Scr…

MySQL - 觸發器

一、概述 Mysql 允許通過觸發器、存儲過程、函數的形式來存儲代碼。 觸發器可以讓你在執行 Insert、Update、Delete的時候,執行一些特定的操作。可以在Mysql中指定是在Sql語句執行之前觸發還是執行后觸發。 二、使用觸發器需要注意的點 對每一個表的每一個事件&a…

Docker Desktop 可以直接啟用Kubernetes 1.25 了

作為目前事實上的容器編排系統標準,K8s 無疑是現代云原生應用的基石,很多同學入門可能直接就被卡到第一關,從哪去弄個 K8s 的環境, Docker Desktop 自帶了Kubernetes 服務,但是在過往的經驗中就是用梯子也安裝不了&…

截取url的host_java正則表達式獲取url的host示例

java正則表達式獲取url的host示例 復制代碼 代碼如下: public static String getHost(String url){if(url==null||url.trim().equals("")){return ""; } String host = ""; Pattern p = Pattern.compile("(?<=//|)((\\w)+\\.)+\\w+&qu…

MySQL - 視圖

一、概述 Mysql 5.0 版本后開始引入視圖。視圖本身是一個虛擬表&#xff0c;不存放任何數據。在使用 sql 語句訪問視圖的時候&#xff0c;他返回的數據都是在查詢過程中從其他表動態生成的。 二、使用視圖   1、創建視圖 CREATE VIEW comic_view as SELECT comic_id,name,pe…

Linux環境下壓縮與解壓命令大全

tar命令 解包&#xff1a;tar zxvf FileName.tar 打包&#xff1a;tar czvf FileName.tar DirName gz命令 解壓1&#xff1a;gunzip FileName.gz 解壓2&#xff1a;gzip -d FileName.gz 壓縮&#xff1a;gzip FileName .tar.gz 和 .tgz 解壓&#xff1a;tar zxvf FileName.tar.…

Centos 磁盤管理及配額管理

實驗內容&#xff1a;一.添加兩塊硬盤&#xff0c;使用LVM做成VG01組&#xff0c;在該VG中新建兩個LV。二.將這兩個LV格式化為ext4/xfs&#xff0c;開機自動掛載到系統mnt1,mnt2目錄下。三.lv02開啟磁盤配額功能&#xff0c;用來進行用戶與組分配額的實驗。四.在系統里添加用戶…

OnionArch - 采用DDD+CQRS+.Net 7.0實現的洋蔥架構

博主最近失業在家&#xff0c;找工作之余&#xff0c;看了一些關于洋蔥&#xff08;整潔&#xff09;架構的資料和項目&#xff0c;有感而發&#xff0c;自己動手寫了個洋蔥架構解決方案&#xff0c;起名叫OnionArch。基于最新的.Net 7.0 RC1, 數據庫采用PostgreSQL, 目前實現了…

spark寫出分布式的訓練算法_利用 Spark 和 scikit-learn 將你的模型訓練加快 100 倍...

在 Ibotta&#xff0c;我們訓練了許多機器學習模型。這些模型為我們的推薦系統、搜索引擎、定價優化引擎、數據質量等提供動力。它們在與我們的移動應用程序交互時為數百萬用戶做出預測。當我們使用 Spark 進行數據處理時&#xff0c;我們首選的機器學習框架是 scikit-learn。隨…

理解LinkedHashMap

1. LinkedHashMap概述&#xff1a;LinkedHashMap是HashMap的一個子類&#xff0c;它保留插入的順序&#xff0c;如果需要輸出的順序和輸入時的相同&#xff0c;那么就選用LinkedHashMap。LinkedHashMap是Map接口的哈希表和鏈接列表實現&#xff0c;具有可預知的迭代順序。此實現…

MySQL - 鎖

一、什么是鎖 鎖是數據庫系統區別于文件系統的一個關鍵特性。鎖機制用于管理對共享資源的并發訪問。 二、MySQL 不同存儲引擎支持的鎖機制 存儲引擎支持的鎖類型Myisam表鎖Innodb行鎖、表鎖Memory表鎖BDB頁鎖、表鎖表鎖&#xff1a;直接鎖住的是一個表&#xff0c;開銷小&…

數據庫時區那些事兒 - MySQL的時區處理

原文地址 當JVM時區和數據庫時區不一致的時候&#xff0c;會發生什么&#xff1f;這個問題也許你從來沒有注意過&#xff0c;但是當把Java程序容器化的時候&#xff0c;問題就浮現出來了&#xff0c;因為目前幾乎所有的Docker Image的時區都是UTC。本文探究了MySQL及其JDBC驅動…

java_函數的重載

函數的重載&#xff08;Overload&#xff09;概念&#xff1a;在同一個類中&#xff0c;允許存在一個以上的同名函數&#xff0c;只要他們的參數個數或者參數類型不同即可。函數功能一樣&#xff0c;僅僅是參與運算的未知內同不同時&#xff0c;可以定義多函數&#xff0c;卻使…

全新升級的AOP框架Dora.Interception[2]: 基于約定的攔截器定義方式

Dora.Interception&#xff08;github地址&#xff0c;覺得不錯不妨給一顆星&#xff09;有別于其他AOP框架的最大的一個特點就是采用針對“約定”的攔截器定義方式。如果我們為攔截器定義了一個接口或者基類&#xff0c;那么攔截方法將失去任意注冊依賴服務的靈活性。除此之外…

redis watch使用場景_redis不得不會的事務玩法

我們都知道redis追求的是簡單&#xff0c;快速&#xff0c;高效&#xff0c;在這種情況下也就拒絕了支持window平臺&#xff0c;學sqlserver的時候&#xff0c;我們知道事務還算是個比較復雜的東西&#xff0c;所以這吊毛要是照搬到redis中去&#xff0c;理所當然redis就不是那…

加快Android Studio的編譯速度

從Eclipse切換到Android Studio后&#xff0c;感覺Android Studio的build速度比Eclipse慢很多&#xff0c;以下幾個方法可以提高Android Studio的編譯速度使用Gradle 2.4Gradle 2.4對執行性能有很大的優化&#xff0c;但Android Studio現在默認使用的是Gradle 2.2,所以我們需要…

開發中 MySQL 規范

一、建表規范 1、數據庫名、表名、字段名必須使用小寫字母或數字&#xff0c;并且禁止以數字開頭 示例&#xff1a;goods_category、agent_operate_201812_log 2、數據庫名、表名、字段名要做到見名識意 示例&#xff1a;goods_category&#xff0c;不能 gc 3、配置表建議以 …

PaddleOCR在 Linux下的webAPI部署方案

很多小伙伴在使用OCR時都希望能采用API的方式調用&#xff0c;這樣就可以跨端跨平臺了。本文將介紹一種基于python的PaddleOCR識別WebAPI部署方案。喜歡的可以關注公眾號&#xff0c;獲取更多內容。一、 Linux環境下部署1.環境要求操作系統&#xff1a;CenterOS7&#xff1b;主…

影響程序員生涯的三個錯誤觀念,你千萬不要犯!

程序員在社會上&#xff0c;到底是怎樣一個生活群體&#xff1f;是否能找到自己方向&#xff1f;其實&#xff0c;路一直都在那里&#xff0c;只是你看不到而已&#xff01; 當初的你&#xff0c;可能一直被一些技術牽著鼻子走&#xff0c;并不是自己在做著自己想做的&#xff…