paulwong

          HBase、Redis中關(guān)于“長(zhǎng)事務(wù)”(Long Transaction)的一點(diǎn)討論

          首先解釋下標(biāo)題,可能命名不是那么嚴(yán)謹(jǐn)吧,大致的定義如下:

          sometimes you are in a situation where you want to read a record, check what is in it, and depending on that update the record. The problem is that between the time you read a row and perform the update, someone else might have updated the row, so your update might be based on outdated information.

          摘要一下:進(jìn)程A讀取了某行R,進(jìn)行時(shí)間較長(zhǎng)的計(jì)算操作,在這個(gè)計(jì)算過(guò)程中B對(duì)行R進(jìn)行了更改。A計(jì)算完畢后,若直接寫入,會(huì)覆蓋B的修改結(jié)果。此時(shí)應(yīng)令A(yù)寫入失敗。

          以下的討論整理自下述兩個(gè)頁(yè)面,表示感謝!

          http://www.ngdata.com/hbase-row-locks/

          http://redis.io/topics/transactions

          一個(gè)最簡(jiǎn)單、直接的思路是:Transaction + Row Lock。類似于傳統(tǒng)DBMS的思路:首先開(kāi)啟行鎖,新建一個(gè)Transaction,隨后進(jìn)行各種操作,最后commit,最最后解除行鎖。看似很簡(jiǎn)單,也沒(méi)什么Bug,但注意,若計(jì)算時(shí)間較長(zhǎng),整個(gè)DB就掛起了,不能執(zhí)行任何操作。

          BigTable的Paper中,對(duì)這類問(wèn)題進(jìn)行了討論。

          總體來(lái)說(shuō)解決思路有三:

          1、Rowlock,但是對(duì)于HBase來(lái)說(shuō),RegionLock更成熟。因?yàn)镽owLock會(huì)長(zhǎng)時(shí)間(從Transction開(kāi)始到更新)占用一個(gè)線程。當(dāng)并發(fā)量很大的時(shí)候,系統(tǒng)會(huì)掛掉。。。

          2、ICV即HBase的incrementColumnValue()方法。

          3、CAS即HBase的checkAndPut方法:在Put之前,先檢查某個(gè)cell的值是否和value一樣,一樣再Put。注意,這里檢查條件的Cell和要Put的Cell可以是不同的column,甚至是不同的row。。。

          綜上在HBASE中,使用上述CAS方法是較好的解決方案。

          上面說(shuō)了HBase,再來(lái)看一個(gè)輕量級(jí)的Redis:

          Redis也支持事務(wù),具體見(jiàn):http://redis.io/topics/transactions

          通過(guò)MULTI開(kāi)始一個(gè)事務(wù),EXEC執(zhí)行一個(gè)事務(wù)。在兩者之間可以“執(zhí)行”多個(gè)命令,但并未被實(shí)際執(zhí)行,而是被Queue起來(lái),直到EXEC再一起執(zhí)行。Redis保證:在一個(gè)事務(wù)EXEC的過(guò)程中,不會(huì)處理其他任何Client的請(qǐng)求(會(huì)被掛起)。注意這里是EXEC鎖,而不是整個(gè)MULTI鎖。所以并發(fā)性能還是有保障的。

          為了支持Paper中CAS方案,Redis提供了WATCH命令:

          So what is WATCH really about? It is a command that will make the EXEC conditional: we are asking Redis to perform the transaction only if no other client modified any of the WATCHed keys. Otherwise the transaction is not entered at all.

          已經(jīng)很顯然了,更多具體的,讀上述網(wǎng)頁(yè)的文檔吧。

          posted on 2013-08-24 22:39 paulwong 閱讀(400) 評(píng)論(0)  編輯  收藏 所屬分類: HBASE

          主站蜘蛛池模板: 土默特右旗| 边坝县| 小金县| 河东区| 霍城县| 布拖县| 青河县| 滦平县| 蓬安县| 津南区| 广昌县| 长寿区| 铜川市| 南川市| 普宁市| 客服| 石屏县| 康定县| 秦安县| 南部县| 安远县| 高清| 晋宁县| 宜黄县| 大埔区| 平昌县| 开鲁县| 海丰县| 家居| 浏阳市| 湘潭市| 中宁县| 宝清县| 新乡县| 盐亭县| 乃东县| 鲜城| 池州市| 厦门市| 靖宇县| 海丰县|