程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Access數據庫 >> 關於Access數據庫 >> Atlas 分布式版重磅來襲

Atlas 分布式版重磅來襲

編輯:關於Access數據庫

       Atlas 是由 Qihoo 360公司Web平台部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了很多功能特性。目前該項目在360公司內部得到了廣泛應用,很多MySQL業務已經接入了Atlas平台,每天承載的讀寫請求數達幾十億條。同時,有超過50家公司在生產環境中部署了Atlas,超過800人已加入了我們的開發者交流群,並且這些數字還在不斷增加。

      主要功能:

      1.讀寫分離

      2.從庫負載均衡

      3.IP過濾

      4.自動分表

      5.DBA可平滑上下線DB

      6.自動摘除宕機的DB

      Atlas Sharding 簡介

      Atlas Sharding是Atlas最近重點開發的一個功能, 此功能增加了Mysql的橫向擴展性跟容量, 可以滿足大部分企業的需求. 目前已經在github上以Sharding分支發布.

      Sharding 的基本思想就是把一個數據表中的數據切分成多個部分, 存放到不同的主機上去(切分的策略有多種), 從而緩解單台機器的性能跟容量的問題. sharding是一種水平切分, 適用於單表數據龐大的情景. 目前atlas支持靜態的sharding方案, 暫時不支持數據的自動遷移.

      Atlas以表為單位sharding, 同一個數據庫內可以同時共有sharding的表和不sharding的表, 不sharding的表數據存在未sharding的數據庫組中.

      目前Atlas sharding支持insert, delete, select, update語句, 支持不跨shard的事務.

      當然, 由於Mysql分布式的局限性, Atlas Sharding對於SQL的特性支持也是有限的, 但是應付日常的需求, 已經足夠了.

      與Mysql replication的區別

      MySQL主從復制就是將一個MySQL實例(Master)中的數據實時復制到另一個MySQL實例(slave)中,這個復制是一個異步復制的過程。

      數據復制有以下一些特點:

      數據分布

      負載平衡(需要借助Atlas或者其他proxy中間件)

      備份

      高可用性(high availability)和容錯

      復制的局限性很明顯, 當數據庫寫入頻繁, 但讀取操作少的場景下, 復制就不適合了, 當寫入過於頻繁,很難由一台主機支撐的時候,我們還是會面臨到擴展瓶頸。換句話說就是復制只能擴展讀性能, 但是對於寫性能的擴展是無能為力的.

      數據切分(sharding): 通過某種特定的條件,將我們存放在同一個數據庫中的數據分散存放到多個數據庫(主機)上面,以達到分散單台設備負載的效果。這樣當寫入的時候, IO就被各個shard所分擔了. 同時, 在每一個Shard上也是可以有復制存在的, 借助Atlas還是能在Shard上做讀分離, 所以復制跟Sharding完全是互相補充, 不排斥的.

      Sharding 架構

     

      Atlas是無狀態的, 對於後端的多個組, 可以配置任意多個Atlas實例, 這一點與MongoDB的mongos類似.

      Sharding數據庫組

      在Atlas中, 將一個組看做是數據存儲的單位, 一個組由一台master, 零台或者多台slave組成(mysql主從同步需要由用戶自己配置). 每個組之間的數據獨立, 沒有關系, 表的數據的各個部分存儲在各個組中.

      組內讀寫分離

      Atlas sharding也支持組內的讀寫分離, 也就是說Atlas在命中了某個組之後, 還是會對這個組內的master和slave執行讀寫分離(讀發送到slave, 寫發送到master).

      Sharding 數據切分策略

      shard key

      每一個shard table都有一個shard key, 其可以是主鍵, 也可以是非主鍵, 但是這個列必須是一個整數. Atlas會利用這個shard key來判斷應該把這條記錄存放到哪一個數據庫組中.

      現在Atlas Shardingh支持兩種類型的數據切分: Range方式和Hash方式.

      Range 方式

     

      如上圖中, shard Key范圍在0-1000的數據存放在DbGroup0中, 范圍在1000-2000的數據存放在DbGroup1中, 2000-MaxInt 的數據存放在DbGroup2 中. 這些范圍的大小不需要相同.比如id為shard key的話, sql: "select * from test where id = 1500;", Atlas會將此語句發往DbGroup1. 暫時Atlas的range是靜態的, 不支持動態的增加范圍.

      優點:

      對於range的sql查詢如(where id > 100 or id < 1000), range方式的sharding可以精確的命中後端的數據組, 不需要將sql發到各個mysql去請求數據, 節約了網絡傳輸的消耗.

      缺點

      如果shard key是遞增的, 那麼可能會在一段時間內的所有sql都命中到同一個數據組, 沒有體現出sharding的優勢, range不適用於這種場景.

      適用場景

      range適用於對范圍查詢有大量需求, 並且shard key相對離散插入的情景

      hash 方式

     

      目前Atlas使用取模的方式實現Hash, 也就是說Hash(id) = id % dbgroup_count, 如id = 10, id % 3 = 1, 所以會命中到DbGroup1中.

      優缺點

      hash跟range方式是恰好相反的, hash 可以應對數據遞增的情景, 即使是在遞增的情況下, sharding的數據也是均勻分布在各個數據組內的, 但是其缺點就是對於范圍的查詢通常都需要查詢所有的dbgroup, 網絡的消耗比較大.

      適用場景

      hash 適用於shard key順序增長, 並對范圍查詢的需求比較小的情景

      關於支持的語句

      Atlas sharding只對sql語句提供有限的支持, 目前支持基本的Select, insert/replace, delete, update語句, 支持全部的Where語法, 但是對於以下語句, 如果語句命中了多台dbgroup, Atlas均未做支持(如果語句只命中了一個dbgroup, 如select count(*) from test where id < 1000, 其中dbgroup0范圍是0 - 1000, 那麼這些特性都是支持的)

      Limit Offset(支持Limit)

      Order by

      Group by

      Join

      ON

      Count, Max, Min等函數

      這些語句Atlas會返回"ERROR 1105 (HY000): Proxy Warning - Sharing Hit Multi Dbgroup Not Support SQL"錯誤. 請不要在Sharding的表上使用這些特性, 如果對這種特性有需求請不要讓此表sharding.

      注意:

      子查詢在Sharding中可能會返回不正確的結果, 也請不要使用子查詢. 請把語句拆分成多句執行

      對於寫操作, 如果寫操作命中了多個數據庫組, 由於部分成功(某個組執行失敗)需要回滾的問題, 暫時不支持寫操作命中多個數據組的語句.請拆分成多個sql語句執行.

      Atlas可能會在接下來的版本中對其中的一些特性中做出支持.

      關於事務支持

      事務在Atlas的非sharding的表是完全支持的, 但是對於sharding的表, Atlas只能提供部分的支持(不支持跨dbgroup的事務). Atlas只支持事務中涉及單個dbgroup的語句, 例如有兩個dbgroup0, dbgroup1, 其切分方式是range, 規則是dbgroup0: 0 - 999, dbgroup1: 1000 - 2000,

      mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into sharding_test(id, name, age) values(1, 'test', 0); Query OK, 1 row affected (0.00 sec) mysql> insert into sharding_test(id, name, age) values(1500, 'test', 0); ERROR 1179 (sqlst): Proxy Warning - sharding dbgroup is in trans, transaction will not work across multi dbgroup mysql> /*master*/select * from sharding_test where id < 1000; +----+------+------+----------+----------+ | id | name | age | birthday | nickname | +----+------+------+----------+----------+ | 1 | test | 0 | NULL | NULL | +----+------+------+----------+----------+ 1 row in set (0.00 sec) mysql> /*master*/select * from sharding_test; ERROR 1179 (sqlst): Proxy Warning - sharding dbgroup is in trans, transaction will not work across multi dbgroup mysql> commit; Query OK, 0 rows affected (0.00 sec) mysql> /*master*/select * from sharding_test; +----+------+------+----------+----------+ | id | name | age | birthday | nickname | +----+------+------+----------+----------+ | 1 | test | 0 | NULL | NULL | +----+------+------+----------+----------+ 1 row in set (0.00 sec)

      請注意第二條語句, 由於之前將insert與dbgroup0綁定了, 所以從此之後Atlas在此事務中只接受涉及dbgroup0的語句, 其他語句將會執行失敗. "/*master*/select * from sharding_test;" 執行失敗是因為, 這個語句會命中所有的dbgroup, 也是同理, 不支持這種語句. 在commit之後, sharding dbgroup不再處於事務狀態, 就可以執行跨shard的操作了

      換句話說, 如果是hash方式sharding的表, 基本上事務是無法支持的, 因為hash的表, 大部分操作都是會涉及多個dbgroup的.

      增加節點

      注意: 暫時只支持range方式的節點擴展, hash方式由於需要數據遷移, 暫時未做支持.

      擴展節點在保證原來節點的范圍不改變的情況下, 如已有dbgroup0為范圍0 - 999, dbgroup1為范圍 1000 - 1999, 這個時候可以增加范圍>2000的節點. 如增加一個節點為2000 - 2999, 修改配置文件, 重啟Atlas即可.

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved