解读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.mzph.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…