溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行Cassandra模型以及架構(gòu)的分析

發(fā)布時(shí)間:2021-11-25 17:37:00 來源:億速云 閱讀:321 作者:柒染 欄目:云計(jì)算

如何進(jìn)行Cassandra模型以及架構(gòu)的分析,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

 NoSql的世界紛繁復(fù)雜,出去掉Redis等內(nèi)存型的數(shù)據(jù)庫之外,在整個(gè)NoSQl領(lǐng)域比較認(rèn)可的是  Cassandra,Hbase,以及MongoDB

對(duì)于Mongo,目前本ID的系列博文已經(jīng)有部分,而Hbase有關(guān)的部分還未補(bǔ)充,待補(bǔ)。

高可靠性

    協(xié)議

1:Cassandra采用了gossip作為集群中節(jié)點(diǎn)的通信協(xié)議,該協(xié)議整個(gè)節(jié)點(diǎn)都處于同等的地位,沒有主從

之分,這就使得任一節(jié)點(diǎn)的推出都不會(huì)導(dǎo)致整個(gè)集群的失效。

2:Cassandra 和Hbase在底層的架構(gòu)設(shè)計(jì)都是借鑒了 Google Big Table的思想來構(gòu)建自己的系統(tǒng),而

Cassandra的創(chuàng)新就是將原本用在文件共享架構(gòu)的P2P (Peer to Peer)引入到了NoSql

P2P的一大特點(diǎn)就是去中心化,集群之中的所有節(jié)點(diǎn)都有著同等的地位,這極大的避免了單個(gè)節(jié)點(diǎn)退出,

而使整個(gè)集群不能工作的可能,與之形成對(duì)比的是Hbase采用了Master/Slave的方式,這就存在了單點(diǎn)失效的可能。


1.2:高擴(kuò)展性

隨著時(shí)間的推移,集群中原有的規(guī)模不足以存儲(chǔ)新增加的數(shù)據(jù),目前NoSql的數(shù)據(jù)都已經(jīng)實(shí)現(xiàn)了

級(jí)聯(lián)的擴(kuò)展,非常容易實(shí)現(xiàn)添加新的節(jié)點(diǎn)到已有集群,操作簡(jiǎn)單。

1.3:最終一致性

        在這里再次強(qiáng)調(diào)一下最終一致性:Cassandra采用了最終的一致性:

         最終的一致性是指分布式系統(tǒng)之中的一個(gè)數(shù)據(jù)對(duì)象的多個(gè)副本盡管在短時(shí)間內(nèi)可能出現(xiàn)不一致,但是經(jīng)過

一段時(shí)間以后,這些副本最終會(huì)達(dá)到一致。


如何進(jìn)行Cassandra模型以及架構(gòu)的分析

Cassandra是優(yōu)先保證了AP,也就是我們經(jīng)常說到的可用性,和分區(qū)容錯(cuò)性。

通常而言,大部分的NoSQL key-value的模式都是寫入非常的高效,畢竟是為了大量數(shù)據(jù)的插入所涉及,

可是在數(shù)據(jù)的讀取方面那就依據(jù)不同的情況而不同。

1 :如果是單個(gè)讀取指定了的key,那就回很快的返回結(jié)果。 -》指定key查詢。

2  :  如果是范圍查詢,由于查詢的目標(biāo)可能存儲(chǔ)在多個(gè)節(jié)點(diǎn)之上,這就需要要對(duì)多個(gè)節(jié)點(diǎn)

       來進(jìn)行查詢,速度會(huì)比較慢。

3 :全表掃。毫無疑問,全表掃描數(shù)據(jù),會(huì)非常的低效。

數(shù)據(jù)模型

       由于 Cassandra采用了類似與BigTable的數(shù)據(jù)結(jié)構(gòu)組織,Cassandra和Hbase比較類似。所以Cassandra和Hbase相比也存在著許多相同的概念。

        

                如果抽象來看Cassandra。整個(gè)Cassandra都是一個(gè)五維的空間

      

            1:column        

                    column:列,在Cassandra之中是最小的一個(gè)數(shù)據(jù)單元,它包含了一個(gè)三元的數(shù)據(jù)類型:

   1: {  // 這是一個(gè)column
   2:     name: "美麗新世界",
   3:     value: "gpcuster@gmali.com",
   4:     timestamp: 123456789
   5: }
upercolumn:超級(jí)列

            我們可以將SuperColumn想象成Column的數(shù)組,他包含一個(gè)name。以及一系列的Column

              將一個(gè)SuperColumn 用JSON的形式表示如下

         {   // 這是一個(gè)SuperColumn
   2:     name: “美麗的新世界",
   3:     // 包含一系列的Columns
   4:     value: {
   5:         street: {name: "street", value: "1234 x street", timestamp: 123456789},
   6:         city: {name: "city", value: "san francisco", timestamp: 123456789},
   7:         zip: {name: "zip", value: "94107", timestamp: 123456789},
   8:     }
   9: }

            Columns和SuperColumns都是一個(gè)Key Value ,一個(gè)name和一個(gè)String的組合,最大的不同在于Column的Value是一個(gè)“String”,而SuperColumn的value是一個(gè)Cloumns的Map

1:Column family

                    Column family是一個(gè)包含了一個(gè)許多行[Row]的結(jié)構(gòu),你可以將它想象成RDBMS中的Table,每一個(gè)行都包含有Clinet提供的Key和該KEY關(guān)聯(lián)的的一系列的Column,我們可以看到如下的結(jié)構(gòu):

   1: UserProfile = { // 這是一個(gè)ColumnFamily
   2:     phatduckk: {   // 這是對(duì)應(yīng)ColumnFamily的key
   3:         // 這是Key下對(duì)應(yīng)的Column
   4:         username: "gpcuster",
   5:         email: "gpcuster@gmail.com",
   6:         phone: "6666"
   7:     }, // 第一個(gè)row結(jié)束
   8:     ieure: {   // 這是ColumnFamily的另一個(gè)key
   9:         //這是另一個(gè)Key對(duì)應(yīng)的column
  10:         username: "pengguo",
  11:         email: "pengguo@live.com",
  12:         phone: "888"
  13:         age: "66"
  14:     },
  15: }
    1: UserProfile = { // 這是一個(gè)ColumnFamily
   2:     phatduckk: {   // 這是對(duì)應(yīng)ColumnFamily的key
   3:         // 這是Key下對(duì)應(yīng)的Column
   4:         username: "gpcuster",
   5:         email: "gpcuster@gmail.com",
   6:         phone: "6666"
   7:     }, // 第一個(gè)row結(jié)束
   8:     ieure: {   // 這是ColumnFamily的另一個(gè)key
   9:         //這是另一個(gè)Key對(duì)應(yīng)的column
  10:         username: "pengguo",
  11:         email: "pengguo@live.com",
  12:         phone: "888"
  13:         age: "66"
  14:     },
  15: }
ColumnFamily的類型可以是Standard,也可以是Super的類型,我們剛剛看到的例子是一個(gè)Stand類型的ColumnFamily。除此之外,還有另外的一種形式,也就是不每一行不僅僅只是一個(gè)列,還可能是一個(gè)CF

如下所示:

   1: AddressBook = { // 這是一個(gè)Super類型的ColumnFamily
   2:     phatduckk: {    // key
   3:         friend1: {street: "8th street", zip: "90210", city: "Beverley Hills", state: "CA"}, 
   4:         John: {street: "Howard street", zip: "94404", city: "FC", state: "CA"},
   5:         Kim: {street: "X street", zip: "87876", city: "Balls", state: "VA"},
   6:         Tod: {street: "Jerry street", zip: "54556", city: "Cartoon", state: "CO"},
   7:         Bob: {street: "Q Blvd", zip: "24252", city: "Nowhere", state: "MN"},
   8:         ...
   9:     }, // row結(jié)束
  10:     ieure: {     // key
  11:         joey: {street: "A ave", zip: "55485", city: "Hell", state: "NV"},
  12:         William: {street: "Armpit Dr", zip: "93301", city: "Bakersfield", state: "CA"},
  13:     },
  14: }

        注意,在Hbase之中也有一個(gè)CL的概念。

 3:keySpace

                KeySpace是我們最外層的數(shù)據(jù)結(jié)構(gòu),通常的情況,我們的應(yīng)用程序只有一個(gè)KeySpace,簡(jiǎn)單點(diǎn)來講,keySpace,可以把keySpace想象成為RDBMS之中的 database。

                相對(duì)與關(guān)系型的數(shù)據(jù)庫的三層結(jié)構(gòu):

                        database -> table -> colum而言。

                cassandra的結(jié)構(gòu)層次如下:

                        keyspace->column family>【column|super column】

看完上述內(nèi)容,你們掌握如何進(jìn)行Cassandra模型以及架構(gòu)的分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI