cassandra tombstone導致寫資料丟失問題徵解

oxoxooxx發表於2011-07-17

問題描述:

1.casssandra中資料結構:

ColumnFamily->Column->key-value(key,value,timestamp)

2.cassandra使用timestamp來判斷資料的新舊。

3.cassandra刪除column是透過寫一個新column來實現的,這個column是tombstone

4.如果新增一個tombstonecassandra中刪除一個column後,在tombstone還未被清除前,再次寫入一個時間戳更小的相同column,此時會導致這次的寫入成功但使用者查詢不到該次寫入的column。

clue

--------------------------------

how can i get a tombstone’s timestamp?

I understand that tombstones are internal implementation detail ... yet, the fact remains in 0.6.2 that a key/col creation followed by a delete of the key/col will result in the key being returned in a get_range_slices call. If the CF is flushed and compacted (after GCGraceSeconds), the key will not be returned in the get_range_slices call.
++
1.如果有tombstone存在,資料返回遵守讀一致性級別,即取R份一致的資料後返回。2.如果寫tombstone後,一直沒有進行flush+compacted操作,有沒有其他的操作會保證資料的一致性(read repair?)3.怎麼才能獲取到寫入的tombstone(column)的時間戳?cassandra二次開發?
這個問題非常重要,是解決我們問題的關鍵。目前進展:
透過檢視cassandra0.7.5原始碼,發現cassandra的刪除column是透過寫入tombstone 這樣一個實現了IColumn介面的物件,
所以tombstone中必定包含所有IColumn的方法。
1.目前猜是想在獲取tombstone物件是透過封裝做了後臺的判斷,如果是tomestone直接返回null,若此則修改讓tombstone能正常返回。
2.
org.apache.cassandra.db.DeletedColumn

@Override
public long getMarkedForDeleteAt()
{
return timestamp;
}

@Override
public int getLocalDeletionTime()
{
return value.getInt(value.position());
}

:明確兩個方法到底返回的是什麼時間,區別:
getMarkedForDeleteAt()
getLocalDeletionTime()

+++++

hector source code:

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23937368/viewspace-1052615/,如需轉載,請註明出處,否則將追究法律責任。

相關文章