解讀Google分布式鎖服務

背景介紹

  在2010年4月,Google的網頁索引更新實現了實時更新,在今年的OSDI大會上,Google首次公布了有關這一技術的論文。

  在此之前,Google的索引更新,采用的的批處理的方式(map/reduce),也就是當增量數據達到一定規模之后,把增量數據和全量索引 庫Join,得到最新的索引數據。采用新的索引更新系統之后,數據的生命周期縮短了50%,所謂的數據生命周期是指,數據從網頁上爬下來,到展現在搜索結 果中這段時間間隔,但是正如Google所強調的,這一系統僅僅是為增量更新所建立的,并沒有取代map/reduce的批量作業處理模式。

  架構Overview

  Google的新一代增量索引更新 – Percolator,是建立在Bigtable之上,提供的API也盡量接近Bigtable的方式,所以整個架構大致是如下的樣子:

?

  事務(Transaction)和鎖(Lock)有區別嗎?

  在關系數據庫領域,二者還是有很大區別的,但是對Percolator而言,Transaction = Lock,所以我們這里討論的分布式鎖,也可以說是分布式事務,所以下面提到的鎖或者事務,指的都是同一件事。

  Percolator利用Bigtable原有的行鎖,再加上自己的一些巧妙的做法,實現了分布式鎖服務,這就意味著,Google可以實時的 更新PB級別的索引庫。最近我們發現Google的搜索結果時效性很好,剛寫好的文章,幾分鐘之后,Google就可以檢索到,原因就在Google的 Crawler在抓到新的網頁之后,不用再等待一定的時間批量更新索引,而是實時的更新,數據生命周期大大縮短。

  Percolator支持跨行,跨表的事務,充分利用了Bigtable本身已經有的行事務、備份機制。

  簡單的示例

  在分析Percolator的細節之前,先看一個簡單的例子,對Percolator有一個大概的認識,有利于后面的理解。

  下面的這個例子是把UserA的人氣分減掉10,加到UserB的人氣分上,key表示每一行的key,data,lock,write是列名字,data存儲數據,lock存儲鎖狀態,write表示事務提交后的數據位置引用.

  初始狀態:UserA有100個人氣分,UserB有50個人氣分

  最終狀態:UserA有90個人氣分,UserB有60個人氣分

  Step0(初始狀態)

KeyDataLockWrite
UserA100:t1??
UserB50:t2??

  Step1(從UserA中拿出10個人氣分)

KeyDataLockWrite
UserA90:t2100:t1Primary Lock:t2t2
UserB50:t2??

  Step2(把UserB的人氣分加10)

KeyDataLockWrite
UserA90:t2100:t1primary_lock:t2t2
UserB60:t350:t2Primary_lock:UserA@datat3

  Step3(事務提交)

  A:先提交primary(移除鎖,寫入新的timestamp,在write列寫入新數據的位置引用)

KeyDataLockWrite
UserAt390:t2100:t1?t3:data:t2t2
UserB60:t350:t2Primary_lock@UserA.datat3

  B:再提交非primary(步驟同上)

KeyDataLockWrite
UserAt390:t2100:t1?t3:data:t2t2
UserBt460:t350:t2?t4:data:t3t3

  事務結束了,UserA有90個人氣分,timestamp是t3,Userb有60個人氣分,timestamp是t4。(至于鎖的寫法和write列為什么那樣寫,后面再詳細解釋)

  事務的執行過程

  Percolator鎖分為兩種,primary和non-primary,在事務提交的過程中,先提交primary鎖,無論是跨行還是跨表,primary鎖都是沒有區別的。

  事務的提交

  事務的提交的過程分兩步,以UserA為例:

  首先,在write列寫入新數據的位置引用,注意不是數據,是引用(理解成指針會更形象),上面step3A 中t3:data:t2表示在t3時刻提交的數據,最新的數據在data列的t2 timestamp

  然后,移除lock列的內容。

  因為Bigtable支持行鎖定,所以上述兩步都是在一個Bigtable事務內完成的。

  讀操作

  當一個client在發起讀操作之后,首先會向oracle server申請time stamp,接下來Percolator會檢查lock列,如果lock列不空,那么讀操作試圖移除(修復)這個lock或者等待,在后續鎖沖突處理詳細介紹如何修復。

  補充:oracle發放time stamp是嚴格遞增的,而且不是一次發放一個,而是采取批量的方式。

  寫操作

  當一個client發起寫操作之后,首先會向oracle server申請time stamp,Percolator會檢查write列,如果write列的timestamp大于當前client的timestamp,那么寫失敗(不 能覆蓋新的數據 write-write conflict);如果lock列有鎖存在,說明當前行正在被另外的client鎖定,client要么寫失敗,要么試圖修復(lock conflict)!

  Notify機制

  Percolator定義了一系列的Observer(類似于數據庫的trigger),位于Bigtable的tablet server上,Observer會監視某一列或者某幾列,當數據發生變化就會觸發Observer,Observer執行完之后,又會創建或者通知后續 的Observer,從而形成一個通知的傳遞。

  鎖沖突的處理

  當一個client在事務提交階段,crash掉了,那么鎖還保留,這樣后續的client訪問就會被阻止,這種情況叫做鎖沖突,Percolator提供了一種簡單的機制來解決這個問題。

  每個client定期向Chubby Server寫入token,表明自己還活著,當某個client發現鎖沖突,那么會檢查持有鎖的client是否還活著,如果client是working狀態,那么client等待鎖釋放。否則client要清除掉當前鎖。

  Roll ?forward & roll ?back

  Client先檢查primary lock是否存在,因為事務提交先從primary開始,如果primary不存在,那么說明前面的client已經提交了數據,所以client執行 roll forward操作:把non-primary對應的數據提交,并且清除non-primary lock;如果primary存在,說明前面的client還沒有提交數據就crash了,此時client執行roll back操作:把primary和non-primary的數據清除掉,并且清除lock。

  小結

  Google的分布式鎖服務很好了支持了增量索引的實時更新,縮短了數據的生命周期。本文對notify機制介紹的比較簡單,感興趣的請參考論文原文

  《Large-scale Incremental Processing Using Distributed Transactions and Notifications》

轉載于:https://www.cnblogs.com/happyday56/p/3454105.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376240.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376240.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376240.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用PHPMailer郵件發不出去

遇到了PHPMailer發不出去郵件的問題,在執行smtpConnect()時失敗了,同樣的配置在其他環境就能發送郵件。 最后發現是dns沒有配置,解析不了郵箱服務器的域名,所以沒發出去。。。。 如果其他語言也遇到了這樣的情況,可以…

PHPcurl抓取AJAX異步內容(轉載)

PHPcurl抓取AJAX異步內容其實抓ajax異步內容的頁面和抓普通的頁面區別不大。ajax只不過是做了一次異步的http請求,只要使用firebug類似的工具,找到請求的后端服務url和傳值的參數,然后對該url傳遞參數進行抓取即可。 利用Firebug的網絡工具 …

做自適應網站專業樂云seo_自適應網站方案品牌樂云seo

自適應網站方案品牌樂云seo,做樂云seo網站推廣哪收錄比較穩定,下面小編從以下幾點詳細介紹一下自適應網站方案品牌樂云seo:一、樂云seo做核心關鍵詞首頁排名技術怎么樣?孔祥永seo做核心關鍵詞到首頁的秘訣就是做好原創內容&#x…

boost windows編譯

執行: (1)bootstrap.bat (2)b2 -j4 toolsetmsvc-9.0 linkstatic threadingmulti runtime-linkstatic address-model64 stage --stagedir“D:\Code\boost_1_66_0\lib” debug release toolset:msvc-9.0 使用vs2008編…

必應輸入法產品分析

2013年4月,微軟MSN(中國)宣布推出首款整合搜索體驗的中文云輸入法“必應Bing輸入法”,其前身是“英庫拼音輸入法(于2012年8月發布測試版)” 在此,Fruits小組從宏觀的軟件工程角度和微觀的產品實現細節對必應輸入法進行了考察和分析。 &#x…

這是我第一題AC的線段樹

題目簡述&#xff1a; 有N個整數&#xff0c;Q次操作&#xff0c;每次操作為詢問一個區間[a, b]內數的和(0號操作)或者把一個區間內的數全部加上v(1號操作) 線段樹求解即可。 #include <cstdio> #include <algorithm> using std::min; using std::max; #define L(n…

a頻繁連接不上redis_連接不到redis Caused by:..._慕課問答

redis裝在linux虛擬機上&#xff0c;在xshell上可以成功訪問redis&#xff0c;配了密碼拿了老師完整的代碼作測試&#xff0c;就是訪問失敗&#xff0c;不知道哪里出了問題地址端口密碼都沒錯的&#xff0c;求解org.springframework.data.redis.RedisConnectionFailureExceptio…

抓localhost包 - rawcap

抓localhost包的話用wireshark好像有點麻煩&#xff0c;所以用rawcap RawCap官網 RawCap下載連接 直接運行&#xff0c;首先根據需要選擇監聽相應的網卡&#xff0c;然后再填寫抓包文件保存的名字

持續集成交付CICD:Jira 發布流水線

目錄 一、實驗 1.環境 2.GitLab 查看項目 3.Jira 遠程觸發 Jenkins 實現合并 GitLab 分支 4.K8S master節點操作 5.Jira 發布流水線 一、實驗 1.環境 &#xff08;1&#xff09;主機 表1 主機 主機架構版本IP備注master1K8S master節點1.20.6192.168.204.180 jenkins…

計算幾何_多邊形

判定凸多邊形&#xff1a;頂點凹凸性法 連續三個頂點p1,p2,p3。計算p1p2,p2p3的叉乘&#xff0c;階乘大于0&#xff0c;則表示p3點在線段p1和p2的左側&#xff0c;然后依次計算下一個前后所組成向量的階乘&#xff0c;如果在計算時&#xff0c;出現負值&#xff0c;則此多邊形是…

wps完成率怎么設置_WPS表格中如何計算完成率?詳細操作方法看這里!

平時我們在使用像WPS這樣的辦公軟件時&#xff0c;我們經常會使用到其中的Excel表格軟件&#xff0c;來完成日常工作當中所需要完成的各種數據的統計以及錄入等工作。而在我們使用WPS表格來錄入、修改或者是統計某一些數據時&#xff0c;我們往往會因為表格內容的設定需求&…

[原創]WebScarab工具介紹

[原創]WebScarab工具介紹 一 WebScarab介紹 WebScarab是一個用來分析使用HTTP和HTTPS協議的應用程序框架。其原理很簡單&#xff0c;WebScarab可以記錄它檢測到的會話內容&#xff08;請求和應答&#xff09;&#xff0c;并允許使用者可以通過多種形式來查看記錄。WebScarab的設…

段表的作用

表格來自《程序員的自我修養 ——鏈接、裝載與庫》 ELF段名作用.text代碼段&#xff0c;存放執行語句.data數據段&#xff0c;存放初始化的全局變量和局部靜態變量.bss未初始化的全局變量和局部靜態變量.rodata只讀數據段.comment注釋信息段.note.GNU-stack堆棧提示段.debug調…

layoutSubviews總結

ios layout機制相關方法 - (CGSize)sizeThatFits:(CGSize)size- (void)sizeToFit——————- - (void)layoutSubviews- (void)layoutIfNeeded- (void)setNeedsLayout——————– - (void)setNeedsDisplay- (void)drawRectlayoutSubviews在下面情況下會被調用&#xff1a; …

三個彩燈循環點亮程序_近百組彩燈點亮江畔,義渡燈會正式亮燈啦

10月23日晚上&#xff0c;大渡口區義渡古鎮華燈初上。夜幕之下&#xff0c;2020第一屆義渡燈會亮燈儀式在此舉行&#xff0c;來自四川的近百組彩燈將在這里點亮夜空&#xff0c;一直陪伴廣大市民游客至明年元宵節后。當晚6點半&#xff0c;義渡燈會亮燈儀式正式開啟。本次燈會以…

repeater序列號,換頁數字不重新排

<td><%# Container.ItemIndex 1(Convert.ToInt32(this.drpCurrentPageIndex.SelectedValue)-1)*Convert.ToInt32(this.drpCount.SelectedValue)%></td>轉載于:https://www.cnblogs.com/liziqiang/p/3457203.html

Altera的幾個常用的Synthesis attributes(轉載)

各廠商綜合工具&#xff0c;對HDL綜合時都定義了一些綜合屬性這些屬性可指定a declaration,a module item,a statement, or a port connection 不同的綜合方式。 語法為&#xff1a; /* synthesis, <any_company_specific_attribute value_or_optional_value */ 下面就是Al…

QPushButton hover配置

鼠標移動到QPushButton上面時顯示下劃線 //下面是當鼠標移動到按鈕上時&#xff0c;按鈕上的文字顯示下劃線 QPushButton#Button_2:hover{ text-decoration:underline; }//下面是普通顯示 QPushButton#Button_2{ color:rgba(52, 144, 255 ,255); border-radius:0px; backgrou…

eclipse沒有日志_強化公共DHT以抵抗eclipse攻擊,ipfs官方還說了什么?

近日&#xff0c;IPFS官方發布博客&#xff0c;就如何強化公共DHT以抵抗eclipse攻擊進行詳細介紹&#xff0c;星球君幫大家翻譯了一下&#xff0c;讓我們來看看官方都說了什么吧&#xff1a;IPFS 2020 年的一個主要焦點是隨著網絡規模的不斷擴大而改進內容路由。雖然我們已經對…

mongoDB簡明教程-python(轉)

MongoDB是一個介于關系數據庫和非關系數據庫之間的產品&#xff0c;是非關系數據庫當中功能最豐富&#xff0c;最像關系數據庫的。他支持的數據結構非常松散&#xff0c;是類似 json的bjson格式&#xff0c;因此可以存儲比較復雜的數據類型。官方網站&#xff1a;http://www.mo…