Atlas 分布式版重磅來襲_Access數(shù)據(jù)庫教程
推薦:詳解數(shù)據(jù)庫高可用架構(gòu)之路數(shù)據(jù)庫高可用架構(gòu)對于我們這些應(yīng)用端開發(fā)的人來說是一個(gè)比較陌生的領(lǐng)域,是在具體的數(shù)據(jù)庫產(chǎn)品之上搭建的環(huán)境,需要像DBA這樣對數(shù)據(jù)庫產(chǎn)品有足夠的了解才能有所涉及,雖然不能深入其中,但可以通過一些經(jīng)典的高可用架構(gòu)學(xué)習(xí)其中的思想。就我所了解到的有以下幾種: MyS
Atlas 是由 Qihoo 360公司W(wǎng)eb平臺部基礎(chǔ)架構(gòu)團(tuán)隊(duì)開發(fā)維護(hù)的一個(gè)基于MySQL協(xié)議的數(shù)據(jù)中間層項(xiàng)目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎(chǔ)上,修改了大量bug,添加了很多功能特性。目前該項(xiàng)目在360公司內(nèi)部得到了廣泛應(yīng)用,很多MySQL業(yè)務(wù)已經(jīng)接入了Atlas平臺,每天承載的讀寫請求數(shù)達(dá)幾十億條。同時(shí),有超過50家公司在生產(chǎn)環(huán)境中部署了Atlas,超過800人已加入了我們的開發(fā)者交流群,并且這些數(shù)字還在不斷增加。
主要功能:
1.讀寫分離
2.從庫負(fù)載均衡
3.IP過濾
4.自動分表
5.DBA可平滑上下線DB
6.自動摘除宕機(jī)的DB
Atlas Sharding 簡介
Atlas Sharding是Atlas最近重點(diǎn)開發(fā)的一個(gè)功能, 此功能增加了Mysql的橫向擴(kuò)展性跟容量, 可以滿足大部分企業(yè)的需求. 目前已經(jīng)在github上以Sharding分支發(fā)布.
Sharding 的基本思想就是把一個(gè)數(shù)據(jù)表中的數(shù)據(jù)切分成多個(gè)部分, 存放到區(qū)別的主機(jī)上去(切分的策略有多種), 從而緩解單臺機(jī)器的性能跟容量的問題. sharding是一種水平切分, 適用于單表數(shù)據(jù)龐大的情景. 目前atlas支持靜態(tài)的sharding方案, 暫時(shí)不支持?jǐn)?shù)據(jù)的自動遷移.
Atlas以表為單位sharding, 同一個(gè)數(shù)據(jù)庫內(nèi)可以同時(shí)共有sharding的表與不sharding的表, 不sharding的表數(shù)據(jù)存在未sharding的數(shù)據(jù)庫組中.
目前Atlas sharding支持insert, delete, select, update語句, 支持不跨shard的事務(wù).
當(dāng)然, 由于Mysql分布式的局限性, Atlas Sharding對于SQL的特性支持也是有限的, 但是應(yīng)付日常的需求, 已經(jīng)足夠了.
和Mysql replication的不同
MySQL主從復(fù)制就是將一個(gè)MySQL實(shí)例(Master)中的數(shù)據(jù)實(shí)時(shí)復(fù)制到另一個(gè)MySQL實(shí)例(slave)中,這個(gè)復(fù)制是一個(gè)異步復(fù)制的過程。
數(shù)據(jù)復(fù)制有以下一些特點(diǎn):
數(shù)據(jù)分布
負(fù)載平衡(需要借助Atlas或者其他proxy中間件)
備份
高可用性(high availability)與容錯(cuò)
復(fù)制的局限性很明顯, 當(dāng)數(shù)據(jù)庫寫入頻繁, 但讀取操作少的場景下, 復(fù)制就不適合了, 當(dāng)寫入過于頻繁,很難由一臺主機(jī)支撐的時(shí)候,我們還是會面臨到擴(kuò)展瓶頸。換句話說就是復(fù)制只能擴(kuò)展讀性能, 但是對于寫性能的擴(kuò)展是無能為力的.
數(shù)據(jù)切分(sharding): 通過某種特定的條件,將我們存放在同一個(gè)數(shù)據(jù)庫中的數(shù)據(jù)分散存放到多個(gè)數(shù)據(jù)庫(主機(jī))上面,以達(dá)到分散單臺設(shè)備負(fù)載的效果。這樣當(dāng)寫入的時(shí)候, IO就被各個(gè)shard所分擔(dān)了. 同時(shí), 在每一個(gè)Shard上也是可以有復(fù)制存在的, 借助Atlas還是能在Shard上做讀分離, 所以復(fù)制跟Sharding完全是互相補(bǔ)充, 不排斥的.
Sharding 架構(gòu)

Atlas是無狀態(tài)的, 對于后端的多個(gè)組, 可以配置任意多個(gè)Atlas實(shí)例, 這一點(diǎn)和MongoDB的mongos類似.
Sharding數(shù)據(jù)庫組
在Atlas中, 將一個(gè)組看做是數(shù)據(jù)存儲的單位, 一個(gè)組由一臺master, 零臺或者多臺slave組成(mysql主從同步需要由用戶自己配置). 每個(gè)組之間的數(shù)據(jù)獨(dú)立, 沒關(guān)于系, 表的數(shù)據(jù)的各個(gè)部分存儲在各個(gè)組中.
組內(nèi)讀寫分離
Atlas sharding也支持組內(nèi)的讀寫分離, 也就是說Atlas在命中了某個(gè)組之后, 還是會對這個(gè)組內(nèi)的master與slave執(zhí)行讀寫分離(讀發(fā)送到slave, 寫發(fā)送到master).
Sharding 數(shù)據(jù)切分策略
shard key
每一個(gè)shard table都有一個(gè)shard key, 其可以是主鍵, 也可以是非主鍵, 但是這個(gè)列必須是一個(gè)整數(shù). Atlas會利用這個(gè)shard key來判斷應(yīng)該把這條記錄存放到哪一個(gè)數(shù)據(jù)庫組中.
現(xiàn)在Atlas Shardingh支持兩種類型的數(shù)據(jù)切分: Range方式與Hash方式.
Range 方式

如上圖中, shard Key范圍在0-1000的數(shù)據(jù)存放在DbGroup0中, 范圍在1000-2000的數(shù)據(jù)存放在DbGroup1中, 2000-MaxInt 的數(shù)據(jù)存放在DbGroup2 中. 這些范圍的大小不需要相同.比如id為shard key的話, sql: "select * from test where id = 1500;", Atlas會將此語句發(fā)往DbGroup1. 暫時(shí)Atlas的range是靜態(tài)的, 不支持動態(tài)的增加范圍.
優(yōu)點(diǎn):
對于range的sql查詢?nèi)?where id > 100 or id < 1000), range方式的sharding可以精確的命中后端的數(shù)據(jù)組, 不需要將sql發(fā)到各個(gè)mysql去請求數(shù)據(jù), 節(jié)約了網(wǎng)絡(luò)傳輸?shù)南?
缺點(diǎn)
如果shard key是遞增的, 那么可能會在一段時(shí)間內(nèi)的所有sql都命中到同一個(gè)數(shù)據(jù)組, 沒有體現(xiàn)出sharding的優(yōu)勢, range不適用于這種場景.
適用場景
range適用于對范圍查詢有大量需求, 并且shard key相對離散插入的情景
hash 方式

目前Atlas使用取模的方式實(shí)現(xiàn)Hash, 也就是說Hash(id) = id % dbgroup_count, 如id = 10, id % 3 = 1, 所以會命中到DbGroup1中.
優(yōu)缺點(diǎn)
hash跟range方式是恰好相反的, hash 可以應(yīng)對數(shù)據(jù)遞增的情景, 即使是在遞增的情況下, sharding的數(shù)據(jù)也是均勻分布在各個(gè)數(shù)據(jù)組內(nèi)的, 但是其缺點(diǎn)就是對于范圍的查詢通常都需要查詢所有的dbgroup, 網(wǎng)絡(luò)的消耗比較大.
適用場景
hash 適用于shard key順序增長, 并對范圍查詢的需求比較小的情景
有關(guān)支持的語句
Atlas sharding只對sql語句提供有限的支持, 目前支持基本的Select, insert/replace, delete, update語句, 支持全部的Where語法, 但是對于以下語句, 如果語句命中了多臺dbgroup, Atlas均未做支持(如果語句只命中了一個(gè)dbgroup, 如select count(*) from test where id < 1000, 其中dbgroup0范圍是0 - 1000, 那么這些特性都是支持的)
Limit Offset(支持Limit)
Order by
Group by
Join
ON
Count, Max, Min等函數(shù)
這些語句Atlas會返回"ERROR 1105 (HY000): Proxy Warning - Sharing Hit Multi Dbgroup Not Support SQL"錯(cuò)誤. 請不要在Sharding的表上使用這些特性, 如果對這種特性有需求請不要讓此表sharding.
注意:
子查詢在Sharding中可能會返回不正確的結(jié)果, 也請不要使用子查詢. 請把語句拆分成多句執(zhí)行
對于寫操作, 如果寫操作命中了多個(gè)數(shù)據(jù)庫組, 由于部分成功(某個(gè)組執(zhí)行失敗)需要回滾的問題, 暫時(shí)不支持寫操作命中多個(gè)數(shù)據(jù)組的語句.請拆分成多個(gè)sql語句執(zhí)行.
Atlas可能會在接下來的版本中對其中的一些特性中做出支持.
有關(guān)事務(wù)支持
分享:SQL編程之高級查詢及注意事項(xiàng)1.什么是子查詢? 當(dāng)一個(gè)查詢是另一個(gè)查詢的條件時(shí),稱之為子查詢。子查 詢可以使用幾個(gè)簡單命令構(gòu)造功能強(qiáng)大的復(fù)合命令。子查詢最常用于SELECT-SQL命令的 WHERE子句中。子查詢是一個(gè) SELECT 語句,它嵌套在一個(gè) SELECT、SELECT...INTO 語句、INSERT...INTO 語句、DELET
- 詳解數(shù)據(jù)庫高可用架構(gòu)之路
- SQL編程之高級查詢及注意事項(xiàng)
- 圖解SQL Server 2008安裝和配置過程
- 錯(cuò)誤和數(shù)據(jù)庫事件觸發(fā)
- Access 2007“設(shè)計(jì)”功能使用教程
- Access2007基礎(chǔ)教程:5步驟設(shè)計(jì)方法
- Access-宏的特點(diǎn)介紹
- Windows2008 64位IIS7+ACCESS數(shù)據(jù)庫無法打開Asp頁面
- Access教程 怎樣設(shè)置自動編號從1開始排序
- Access教程 怎樣制作復(fù)雜報(bào)表
- Access教程 如何模糊參數(shù)進(jìn)行分頁查詢代碼
- Access教程 如何在字段定義主鍵
Access數(shù)據(jù)庫教程Rss訂閱編程教程搜索
Access數(shù)據(jù)庫教程推薦
- access數(shù)據(jù)庫連接出錯(cuò),請檢查Conn.asp文件中的數(shù)據(jù)庫參數(shù)
- 解析MDB與XLS文件互相轉(zhuǎn)換方法
- 在VB中動態(tài)創(chuàng)建數(shù)據(jù)庫
- 如何用Access輕松打印帶相片的證件
- Access數(shù)據(jù)庫操作中出現(xiàn)的怪現(xiàn)象
- ACCESS中Field對象的標(biāo)題屬性
- 關(guān)于Access 2003開發(fā)者擴(kuò)展工具集的概述
- ASP實(shí)現(xiàn)access隨機(jī)顯示不重復(fù)記錄解決方案
- Access數(shù)據(jù)庫與SQLserver2000的數(shù)據(jù)互導(dǎo)
- 如何讓access自動編號從1開始排序?qū)崿F(xiàn)方法
- 相關(guān)鏈接:
- 教程說明:
Access數(shù)據(jù)庫教程-Atlas 分布式版重磅來襲
。