Eventually-Consistent Storage Backends

  • 當(dāng)Janusgraph運(yùn)行在具有最終一致性的存儲(chǔ)后端上時(shí),為了保證數(shù)據(jù)的一致性,需要使用Janusgraph支持最終一致性的特性。(即:如果不想保證一些數(shù)據(jù)的最終一致性,則可以不使用,為了性能考慮,JanusGraph對(duì)存儲(chǔ)的元素都不保證一致性。)
  • 支持最終一致性存儲(chǔ)后端: Apache Cassandra or Apache HBase
  • 下面總結(jié)了如果保證數(shù)據(jù)(頂點(diǎn)、屬性、邊、索引)的一致性的方法。下文的存儲(chǔ)后端都均是指具有最終一致性的存儲(chǔ)后端。如果存儲(chǔ)后端不具有最終一致性,那么下面的措施也無(wú)法保證數(shù)據(jù)的一致性

Data Consistency

  • 由于存儲(chǔ)后端不提供事務(wù)隔離,所以JanusGraph為了保證數(shù)據(jù)的一致性(此處的一致性是指事務(wù)中ACID的C,而不是CAP的C),就必須通過(guò)鎖機(jī)制

  • 為了效率,JanusGraph默認(rèn)不采用鎖,但是用戶可以對(duì)需要保證一致性的schema 元素選擇使用鎖。

  • 設(shè)置數(shù)據(jù)一致性方法:

//element 元素:Property、VertexLabel、Index、EdgeLabel
//ConsistencyModifier.LOCK加鎖
JanusGraphManagement.setConsistency(element, ConsistencyModifier.LOCK) 

案例

  • 下面對(duì)consistentName屬性、byConsistentName索引進(jìn)行了加鎖,從而可以保證數(shù)據(jù)的一致性。
mgmt = graph.openManagement()
name = mgmt.makePropertyKey('consistentName').dataType(String.class).make()
index = mgmt.buildIndex('byConsistentName', Vertex.class).addKey(name).unique().buildCompositeIndex()
mgmt.setConsistency(name, ConsistencyModifier.LOCK) //確保每個(gè)頂點(diǎn)只有一個(gè)name,默認(rèn)不保證此name是SINGLE
mgmt.setConsistency(index, ConsistencyModifier.LOCK) // 確保name值具有唯一性
mgmt.commit()

通過(guò)鎖保證數(shù)據(jù)一致性原理

  • 在一個(gè)事務(wù)中修改具有一致性約束的元素時(shí),當(dāng)事務(wù)結(jié)束時(shí)( tx.commit())JanusGraph會(huì)執(zhí)行如下策略(樂(lè)觀鎖)來(lái)保證數(shù)據(jù)一致性:(注意是在事務(wù)結(jié)束后進(jìn)行驗(yàn)證)

    • 1.新開啟一個(gè)事務(wù),對(duì)被一致性約束的所有元素獲取一個(gè)鎖
    • 2.在新的事務(wù)里,從數(shù)據(jù)庫(kù)中重新讀取所有元素的值,驗(yàn)證事務(wù)里元素的狀態(tài)是修改后元素的之前狀態(tài)。如果不是,則發(fā)生并發(fā)修改問(wèn)題,拋出PermanentLocking exception。
    • 3.保存事務(wù)狀態(tài)到數(shù)據(jù)庫(kù)
    • 4.釋放所有鎖。
  • 鎖機(jī)制中還有一些優(yōu)化:本地沖突檢測(cè)、失敗場(chǎng)景檢測(cè)

JanusGraph鎖實(shí)現(xiàn)類

  • JanusGraph對(duì)鎖協(xié)議進(jìn)行了接口抽象,當(dāng)前提供了2種實(shí)現(xiàn)。

    • 1.A locking implementation based on key-consistent read and write operations that is agnostic to the underlying storage backend as long as it supports key-consistent operations (which includes Cassandra and HBase). This is the default implementation and uses timestamp based lock applications to determine which transaction holds the lock.
    • 2.A Cassandra specific locking implementation based on the Astyanax locking recipe.
  • 注:對(duì)于需要嚴(yán)格保證數(shù)據(jù)一致性的應(yīng)用,建議使用具有事務(wù)隔離級(jí)別的存儲(chǔ)后端。

Data Consistency without Locks

---待更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容