1. 程式人生 > >【資料庫】——分散式資料庫演變歷程

【資料庫】——分散式資料庫演變歷程

前提

    本文主要介紹分散式資料庫演變歷程,以及演變過程的解決方案,沒有方案的具體實現步驟。

資料庫高可用的發展歷程

1、查詢操作比較多,利用快取,緩解資料庫的讀壓力
2、寫操作成為資料庫瓶頸,利用資料庫主從複製,在程式碼中進行讀寫分離
3、為了避免寫伺服器宕機,從而造成寫操作異常,進行主主複製
4、單臺不能在支撐系統壓力的時候,進行叢集擴充套件,通過負載均衡完成叢集均勻分擔壓力
5、為了避免宕機對系統影響,搭建高可用叢集成為關鍵。
6、MySQL的單表最多支撐5000萬,為了擴大容量,需要分庫分表

資料庫高可用解決方案

1、新增快取,緩解資料庫查操作。
快取方式有兩種,本地快取,分散式快取。
本地快取通常採用ehcache,分散式快取通常有兩種選擇,redis和memcached,關於兩者區別請移步

《redis和memcached區別》關於分散式快取和本地快取的選擇,主要針對業務具體商定。ehcache佔用的是本地記憶體,當資料量比較少,而且查詢比較頻繁,不影響系統記憶體佔用的情況下可以採用,相比分散式快取效率更高。分散式快取,資料量比較大,或者對持久化有一定要求的時候可以採用。
當然最好的方案將redis+ehcache做成兩級快取,推薦案例
Spring+ehcache+redis兩級快取–快取實戰篇(1)》

2、主從複製,讀寫分離
主從複製,利用的是MySQL的binlog日誌實現。具體方案移步《【開發進階】——MySQL配置主從同步,程式碼層實現讀寫分離》
在程式碼層的實現方案有兩種,部落格中小編用的時JDBC的方法型別進行判斷。還有一種方案利用spring的aop+註解的方式,通過攔截註解,判斷操作哪個資料庫。一般編輯的方法中標註寫庫,查詢的方法上標註讀庫,這樣程式碼編寫比較複雜,但是程式碼靈活度比較高。
3、主主複製

大概實現思路與主從複製一致,利用的同樣的時binlog日誌。這樣保證了寫操作的高可用,避免了寫伺服器宕機,對系統的影響,同時實現了資料庫的負載。
4、負載均衡叢集
三種實現方式
Nginx,採用的Http協議
LVS,網路依賴比較大,穩定性很高
HaProxy,支援Http,TCP協議,而且有視覺化監控頁面
三者詳細的對比請移步《三大主流軟體負載均衡器對比(LVS VS Nginx VS Haproxy)》
小編採用的時HAProxy,實現MySQL的負載均衡。
5、高可用叢集
資料冗餘實現高可用,小編採用的是Keepalived實現高可用。
6、分庫分表
兩種分割方式
垂直切割:根據業務的維度,將原本的一個庫或表拆分為多個庫或表,每個庫或表與原有的結構不同。
水平切割:根據分片演算法,將一個庫或表拆分成多個庫或表,每個庫或表依舊保留原有的結構。
整理分為三種思路
1、客戶端分片

  • 在應用層直接實現
    非常通用,簡單的解決方案,直接在應用層讀取分片規則,然後解析分片規則,根據分片規則實現切分的路由邏輯。這種方案侵入業務,但是實現比較簡單,適合快速上線,因為切分邏輯是自己開發,所以生產上的問題比較容易解決。但是這樣會讓資料庫保持連線比較多,需要考慮應用伺服器的節點數量,需要提前進行容量評估,而且對開發人員能力要求比較高。
    開源框架dbsplit就是採用這種方式。
  • 通過定製JDBC協議實現
    通過定製JDBC協議,針對業務層提供與JDBC一致的介面,讓開發人員專注業務開發,不再關心分庫分表的實現,讓分庫分表在JDBC的內部實現。但是需要開發人員理解JDBC協議才能實現分庫分表邏輯。
    流程的客戶端分庫分表框架Sharding JDBC 採用這種方案。
  • 通過定製ORM框架
    因為關係資料庫與面嚮物件語言之間的差距,ORM框架的廣泛使用,就有了通過定製ORM框架實現分庫分表的方案。把分片規則實現到ORM框架中或者通過ORM框架支援的擴充套件機制來實現。一般常用的是通過在Mybatis配置檔案的SQL中增加表索引的引數來實現分片。如下:
<select id="getUser" parameterType="java.util.Map" resultType="User">
    select userId,username
        from user_#{index}
    where userId = #{userId}
</select>

2、代理分片
在應用層和資料庫層增加一個代理層,把分片的路由規則配置在代理層,代理層提供對外提供與JDBC相容的介面給應用層,應用層的開發人員不用關心分片規則,只需要關心業務邏輯的實現。
這種方案讓開發人員專注於業務邏輯的實現,把分庫分表的操作留給代理層做;不足之處:增加代理層,加重了網路傳輸的負擔,還需要維護代理層,以及硬體成本。
常用代理分片實現框架有Cobar和Mycat等。
3、支援事務的分散式資料庫
OceanBase,TiDB等資料庫對外提供可伸縮的體系架構,並提供分散式事務支援,將可伸縮和分散式事務的實現包裝到分散式資料庫內部實現,對使用者透明。
使用分散式資料庫的需要綜合實際情況,不要盲目的追求技術的實現。
分庫分表的帶來弊端
1、如何保證id唯一
2、配置多資料來源
3、分散式鎖的問題
4、分散式事務的問題
當然這些問題均有解決的方式,但是也這說明了事物的兩面性。小編的公司採用的是MyCat中介軟體解決,針對分庫分表這一部分的使用小編還會在後續部落格中持續更新!

總結

    關於分散式不要一口吃個胖子,針對業務,資料,實際情況具體分析,原則就是兵來將擋水來土掩,相信問題終會有解決方案的。

相關推薦

資料庫——分散式資料庫演變歷程

前提     本文主要介紹分散式資料庫演變歷程,以及演變過程的解決方案,沒有方案的具體實現步驟。 資料庫高可用的發展歷程 1、查詢操作比較多,利用快取,緩解資料庫的讀壓力 2、寫操作成為資料庫瓶

深度分散式資料庫資料一致性原理說明與實現

分散式資料庫的資料一致性管理是其最重要的核心技術之一,也是保證分散式資料庫滿足資料庫最基本的 ACID特性中的 “一致性”(Consistency)的保障。在分散式技術發展下,資料一致性的解決方法和技術也在不斷的演進,本文就以作者實際研發的分散式資料庫作為案例,介紹分散式資料庫資料一致性的原理以及實際實現。

Redis分散式鎖的幾種使用方式(redis、zookeeper、資料庫

https://blog.csdn.net/u010963948/article/details/79006572?utm_source=blogxgwz9 https://blog.csdn.net/qq_37606901/article/details/79569250?utm_source

乾貨分散式記憶體資料庫新架構,極速OLTP應用新利器

TimesTen Scaleout,它實際上是一款關係型資料庫,不過是在執行的期間,把資料全量載入到記憶體當中來進行實現。 Oracle TimesTen 先簡單的說一下TimesTen Scaleout的歷史,它實際上是一款關係型資料庫,不過是在執行的期間,把資料全量載入到記憶體當中來進行實現。Ti

Oracle修改資料庫時間策略。org.springframework.web.util.NestedServletException: Request processing failed;

從log很明顯可以看出是資料庫連線失敗,但是資料庫明明是開著的,出現這個錯誤有著一定的概率,刷好多次會出現一次然後又好了,然後用plsql連線資料庫發現跳出修改密碼的提醒,此時我們將密碼改為原來密碼多加個1,之後使用者可能被鎖定。 1.先解鎖 alter user XXGS accou

Learning-MySQL1資料庫初識及 MySQL 的安裝

一、什麼是資料 資料(Data):描述事務的符號記錄,描述事物的符號既可以是數字,也可以是文字、圖片,影象、聲音、語言等,資料由多種表現形式,它們都可以經過數字化後存入計算機 在計算機中描述一個事物,就需要抽取這一事物的典型特徵,組成一條記錄,就相當於檔案裡的一行內容,如: 1 qiuxi m

RedisRedis資料庫及五種資料型別圖解

目錄 Redis資料庫: 是什麼? 優勢? 資料型別(五種): 1.字串: 2.hash型別: 3.list型別: 4.set型別: 5.zset型別: Redis資料庫: 是什麼? 一類新出現的,非關係型的,不支援SQL語法的,不支援事物,|

資料庫關係型資料庫中實體間的關係

【資料庫】關係型資料庫中的關係 關係分類 實際應用 關係分類 在關係型資料庫中,按照x對x的分類,可以分為三種,分別為一對一、一對多、多對多。 實際應用 我使用的是MySQL的視覺化工具Workbench,在建立新的Model EER

資料庫mysql資料庫定時備份

操作步驟: 1、將指令碼放到任意位置下,不容易被誤刪即可 2、定時任務,一週執行一次指令碼 指令碼如下: #!bin/bash backuppath=/data/mysql/backup date=$(date +%Y%m%d%H%M) SQLuser=root SQLpwd=password

MySQL關於資料庫效能的那些事

關於資料庫效能的故事 面試時多多少少會講到資料庫上的事情,“你對資料庫的掌握如何?”,什麼時候最考驗資料庫的效能,答應主要方面上講就是大資料量的讀寫時,而電商類的大促活動就是考驗各自的資料庫效能的時候啦。 對於web伺服器而言,資料量大時,我們可以簡單的通過橫向擴充

MyBatis解決資料庫欄位名稱與Java實體類屬性名稱不一致問題

問題描述:       有時候在專案中會遇到資料庫欄位名稱與實體類屬性名稱取得不一樣的情況,如下:      資料庫裡的資料為:       此時,如果我們查詢該表的某條資料,Proj

redis關係型資料庫 VS 非關係型資料庫

一、關係型資料庫? 1.概念  關係型資料庫是指採用了關係模型來組織資料的資料庫。簡單來說,關係模式就是二維表格模型。 主要代表:SQL Server,Oracle,Mysql,PostgreSQL。 2.優點 (1).容易理解,二維表的結構非常貼近現實世界

c#連線資料庫相關知識

知識回顧 1、儲存過程: 是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,儲存在資料庫中,經過第一次編譯後再次呼叫不需要再次編譯,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程

乾貨MySQL資料庫開發規範

所有的資料庫物件名稱必須使用小寫字母並用下劃線分割(MySQL大小寫敏感,名稱要見名知意,最好不超過32字元) 所有的資料庫物件名稱禁止使用MySQL保留關鍵字(如 desc、range、match、delayed 等,請參考 MySQL官方保留字 ) 臨時庫表必須以t

筆記爬蟲+資料庫操作(增刪改查)

基本操作: import pymysql #匯入模組 conn =pymysql.connect( host ='127.0.0.1', port =3307, user ='root', passwd='xhdake',

嵌入式資料庫系統Berkeley DB

UNIX/LINUX平臺下的資料庫種類非常多,參考資料1中列舉了其中的大部分。通常,我們在設計UNIX/LINUX平臺下的應用軟體時,如果資料種類繁多,資料與資料之間關係比較複雜,就會選用一些大型的企業級資料庫系統,如DB2,ORACLE、SYBASE等,如果軟體規模不大,就傾向選用如MYSQL、POSTGR

Android開發資料庫LitePal 資料庫的使用

一,導包 dependencies { ...... // LitePal的包 compile 'org.litepal.android:core:1.3.1' ...... } 二,建立bean類 public class Person extends DataSupp

MySQL資料庫 外來鍵、檢視、儲存過程、觸發器的優缺點

https://www.yiibai.com/mysql/introduction-sql-views.html 檢視 使用資料庫檢視的優點 資料庫檢視允許簡化複雜查詢:資料庫檢視由與許多基礎表相關聯的SQL語句定義。 您可以使用資料庫檢視來隱藏終端使用者和外部應用

SRH------關係型資料庫與非關係型資料庫

資料庫   就是用來儲存資料的倉庫,分為兩類: 關係型資料庫和非關係型資料庫   關係型資料庫    嚴格限定了欄位的型別,大小,向資料庫中傳資料時,必須按照相應的欄位傳資料     eg:mysql&n

phpPDO資料庫防sql注入

安全的方式: $pdo = new PDO('mysql:host=localhost;dbname=phptry','username','passwd'); $pdo->query("SET