目前考慮的分布式資料系統架構主要是cassandra
以及由阿里開發的基於
mysql
的mycat
。我們先來比較
cassandra
與mycat
兩種資料庫集群技術的特點。
cassandra是由一些平等的資料儲存結點組成的集群,而
mycat
是普通主從
mysql
集群的擴充,形成了多個主從的架構。
cassandra:
資料實際由key-value
對組成,
key分為兩部分,分割槽
key以及聚集
key,
分割槽key
根據某種函式運算,將不同的資料對映到集群中的不同結點
,而每個結點中的資料是按棸集
key來排序的。
mycat:
根據某一列的值將資料對映到不同的主從集群中。
cassandra:
1.根據key
來查詢資料
2.根據二級索引來查詢資料,如果結果資料過多,二級索引可能會跨多個不同結點,效能會有問題,二級索引不應該作為常規方法來使用。
或者在加上主鍵索引的條件下再使用二級索引是沒有什麼問題的,這只會在乙個結點上進行操作
3.只能根據聚集key
進行排序
4. 支援有序集合,無序列表,map
等資料結構,但這些資料結構能儲存的資料量有乙個很小的限制(
64k),不能作為常規方法使用。
5. 能靈活的增加列而不影響線上操作
6. limit語句不支援offset,這對分頁來說很不方便
cassandra底層採用
sstable
資料結構實現,所能進行的操作也是極為有限的,乙個
cassandra
表結構往往只能滿足一種查詢模式,多個查詢模式需要多個不同的表,進行一定資料冗餘。
mycat:
由於mycat
底層由mysql
來實現,所以能實現
mysql
所能進行的大部分操作,但因為分布式集群的原因,有些操作需要
mycat
進行合併處理,跨結點的操作是有效能問題的,所以
mycat
可以說退化為和
cassandra
一樣,每種表結構或者分割槽方式只能很好的滿足一種查詢模式,所以
mycat
在這方面對於
cassandra
來說並沒有什麼特別大的優勢。
cassandra :
1. 各結點根據劃分規則平分資料,結點間沒有主從之分,完全平等。
2. 資料有備份(資料複製),
也可以設定備份的因子以決定有多少個備份
3. 結點故障檢測及恢復
4. 資料分割槽採用一致性hash
,在結點減少與新增時可以最少程度減少資料的移動,另外通過新增虛似結點,可以在擴充集群裡不移動資料。
5. 集群效能隨集群結點的增加而線性提高,結點間的資料會重新平衡
6. 集群可以跨資料中心
mycat:
也可以檢測到機器的失敗並進行主從切換,但整個集群管理的方便性及可擴充套件性是不如cassandra的。
cassandra:
cassandra底層採用
sstable
實現,讀資料時對磁碟上的資料有索引,所以讀取很快,而寫資料時是先寫入記憶體然後週期性將記憶體中的資料持久化到磁碟上,寫效能也很高。
mycat:
基於mysql
,是針對磁碟的讀與寫,所以效能從理論上講會比
cassandra
會差很多。
cassandra:
1. 不支援事務
2. 資料一致性是可以調整的,比如調整成強一致性。寫資料的時候,在寫完主結點後,對備份結點可以採用同步或非同步的方式進行同步,同步的個數是可以調整的,但同步也會影響寫效能。 讀資料時可以調整從多少個結點中讀取資料並選擇乙個最新的資料。
3. 利用commit log保證集群結點重啟後資料不丟失
mycat :
支援事務,但是最終一致性,不可以調整
可以抽象為三大類操作:
2. 根據文章id
根據操作我們假設建立如下的表結構:
create table post(id
thread_id uuid, // 主題id
,作說明用
create_time int // 建立時間
.... //其它字段
primary key (thread_id, post_id )
create index on post(status);
我們以thread_id
作為分割槽
key,
post_id
作為聚集
key,只能
按如下cql
進行查詢:
select * from post where thread_id= *** order by post_id desc limit ***.
cql並不支援如下按
status
篩選後排序,即使在
status
上加上了二級索引,如下所示:
select * from post where thread_id= *** and status = *** order by post_id desc limit ***.
會報告如下錯誤:
invalidrequest: code=2200 [invalid query] message="order by with 2ndary indexes is not supported."
所以基本上cassandra還是只能作為key-value儲存來用,不能進行複雜的關係運算來替換掉mysql。
Cassandra與Kafka的整合
cassandra和kafka經常一起用於微服務架構中。本文將介紹幾種cassandra和kafka常見的整合模式。簡介 如果您的開發團隊樂於接納微服務架構的優點,那麼您就會了解到,kafka針對不變事件 immutable events 的永續性日誌,能夠使微服務以獨立且非同步的方式執行。在某些情...
MyCat原理與應用
mycart是資料庫中介軟體 是一類連線軟體元件 和應用的計算機軟體,以便於軟體各部件之間的溝通 例子 nginx,web中介軟體 資料庫中介軟體 連線php應用程式和資料庫的工具 2.高訪問量高併發對資料庫壓力,一般都會部署多台伺服器來抵禦併發訪問需自己做流量分配 3.資料庫儲存大量的資料,分庫分...
mycat系列 mycat原理
mycat的原理並不複雜,複雜的是 如果 也不複雜,那麼早就成為乙個傳說了。mycat的原理中最重要的乙個動詞是 攔截 它攔截了使用者傳送過來的sql語句,首先對sql語句做了一些特定的分析 如分片分析 路由分析 讀寫分離分析 快取分析等,然後將此sql發往後端的真實資料庫,並將返回的結果做適當的處...