竞价广告系统-ZooKeeper介绍

ZooKeeper介绍

为了讲述的完整性,介绍一下ZooKeeper。ZooKeeper在Index和Ad Server里使用比较多,虽然它可能没有google的Chubby好,但它是开源的工具。举一个使用场景,比如我们有很多台Index,或者有很多台Ad Server,其中有一些机器崩溃了,或是有一些机器新添加进了集群,如何用一个分布式的管理系统通知其它相关模块,哪些机器是可以用的。ZooKeeper就是解这种问题的,ZooKeeper是在基于消息传递通信模型的分布式环境下解决一致性问题的基础服务。

ZooKeeper用层次式Namespace维护同步的状态空间,比如可以在根目录下创建app1,app2,在app1下面可以创建p_1。ZooKeeper的原理是用很多的机器进行分布式的决策每一个命名空间中的状态。因为是分布式的决策,所以系统的可扩展性比较好。

下面我列出几个ZooKeeper实现的一些基本特性:Sequential Consistency, Atomicity, Single System Image, Reliability, Timeliness。但一些复杂的同步模式需要得用API编程实现。

Paxos算法

网上有多个Paxos Made Simple的中译版,我去掉了后面的实现状态机模型。我认为下面的译文更流畅一些。Wiki Paxos里的例子看一下可以更好的了解Paxos算法。

Paxos Made Simple

Leslie Lamport

Sparkliang译

先解释文中几个关键词的翻译:

Proposal译为“议案”,由proposer提出,被aceeptor批准或否决

Value译为“决议”,它是议案的内容,一个议案就是一个{编号,决议}对

Accept译为“批准”,表示议案被acceptor批准

Choose译为“选择”,表示议案“被选择”,也就是被多数acceptor批准

介绍

为实现具有容错能力的分布式系统而提出的Paxos算法,曾被认为难以理解,可能因为对于大部分读者而言,原来的描述是基于希腊故事的[5]。实际上,它是最简单和直观的分布式算法之一。它的核心是一个一致性算法——[5]中提出的“synod”算法。下一节描述这个一致性算法,并遵从我们要求的性质。最后一节解释了完整的Paxos算法,从一致性的直观应用到构建分布式系统的有限状态机模型——应该是总所周知的模型,因为它是论文[5]的主题——它可能是分布式系统理论被引用最多的论文。

一致性算法

2.1 问题的提出

设想一组可以提出决议(value)的process。一致性算法保证所有提出的决议中,有一个决议会被选择(chosen)。如果没有提出决议,那么将不会有选择。如果一个决议被选择,那么process最终都能知道这个被选择的决议。一致性的安全性包括:

——决议只有被提出后才可能被选择,

——只有一个决议被选择,并且

——process永远不会获知一个决议被选择了,除非这个决议确实已经被选择。

我们将不会特别明确精确的时间性要求。然而,其目标是最终有一个提出的决议被选择,并且process最终会获知被选择的决议,如果有的话。

我们为一致性算法划分3个角色,并分别以代理:proposer(提出者),acceptor(批准者)和listener(接收者)表示。实现中,允许一个process扮演多个代理,这里我们不关心从代理到process的映射。

假设代理之间用消息通信。我们采用异步、非拜占庭模型【拜占庭模型(Byzantine model),消息可能丢失、重复或者内容损坏。换而言之,非拜占庭模型就是允许消息的丢失或者重复,但是不会出现内容损坏的情况】:

——代理以任意的速度操作,可能会因为停机而失效,可能会重启。因为任一个代理都可能会在决议被选择后停机再重启,因此解决方案要求代理必须能够记忆某些信息,从而能在重启后重新载入。

——消息传送速度不可预测,可能会重复或丢失,但是内容不会损坏。

2.2 选择决议

最简单的方法就是用单个acceptor代理。Proposer发送议案(proposal)给这个acceptor,它选择最先收到的议案。尽管简单,但是如果acceptor停机了,那么系统就不能继续运行了,这个方案并不能满足要求。

看来我们需要选择另外的方法,我们用多个acceptor代理,而非一个,proposer向一组acceptor提出议案。一个acceptor可能批准该议案,当有足够大的acceptor集合批准了这个议案时,决议【议案是一个{编号,决议}对】就被选择了。那么这个集合多大才足够呢?为了保证只有一个决议被选择,我们可以让这个集合包含多数的代理【后面也会称之为多数派】。因为任意两个多数派至少有一个相同的代理,如果一个acceptor最多只能批准一个决议,这就是可行的。

假设没有失败或者消息丢失,即使仅有一个proposer提出了一个决议,我们也希望能选择一个决议。这就导出了下面的需求:

P1. Acceptor必须批准它接收到的第一个决议。

但是该需求会导致一个问题。同时可能有几个proposer提出了几个不同的决议,从而导致每个acceptor都批准了一个决议,但是没有一个决议被多数派批准。即使只有两个决议,如果每个都被半数的acceptor批准,单个的acceptor失效也会导致不可能知道到底哪个决议被选择了。

一个决议要经过多数派的批准才能被选择,这个需求和P1暗示了acceptor必须能够批准多个议案。我们为每个议案分配一个编号来记录不同的议案,因此一个议案由编号和决议构成【也就是议案={编号,决议}】。为避免混淆,我们要求议案的编号是唯一的。这个取决于实现,我们假设可以做到这一点。如果一个议案{n, v}通过多数派的批准,那么决议v就被选择了。这种情况下,我们称议案(包括其决议v)被选择了。

我们允许选择多个议案,但是必须保证所有选择的议案包括相同的决议。对议案编号归纳,可以保证:

P2. 如果一个议案{n, v}被选择,那么所有被选择的议案(编号更高)包含的决议都是v。

因为编号是全序的,P2保证了“只有一个决议被选择”这一关键安全属性。议案必须至少被一个acceptor批准才可能被选择。因此只要满足下面的条件,就可以满足P2:

P2A. 如果一个议案{n, v}被选择,那么任何acceptor批准的议案(编号更高)包含的决议都是v。

我们依然保证P1来确认选择了某些议案。因为通信是异步的,在特殊情况下,某些acceptor c没有接收到过任何议案,它们可能会【错误的】批准一个议案。设想一个新的proposer“醒来”并提出了一个更高编号的议案(包含不同的决议)。根据P1的要求,c应该批准这个议案,但是这违反了P2A。为了同时保证P1和P2A,我们需要增强P2A:

P2B. 如果一个议案{n, v}被选择,那么此后,任何proposer提出的议案(编号更高)包含的决议都是v。

因为一个议案必须在被proposer提出后才能被acceptor批准,因此P2B包含了P2A,进而包含了P2。

如何才能满足P2B呢,让我们来考虑如何证明它是成立的。我们假设某个议案{m, v}被选择,然后证明任何编号n>m的议案的决议都是v。对n归纳可以简化证明,根据条件:每个提出的议案(编号从m到n-1)的决议都是v,我们可以证明编号为n的议案的决议是v。对于选择的议案(编号为m),必定存在一个集合C(acceptor的多数派),C中的每个acceptor都批准了该议案。结合归纳假设,m被选择这一前提意味着:

C中的每个acceptor都批准了一个编号在m到n-1范围内的议案,并且议案的决议为v。

因为任何由多数派组成的集合S都至少包含C中的一个成员,我们可以得出结论:如果下面的不变性成立,那么编号为n的议案的决议就是v:

P2C. 对于任意的v和n,如果议案{n, v}被提出,那么存在一个由acceptor的多数派组成的集合S,或者a) S中没有acceptor批准过编号小于n的议案,或者b) 在S的任何acceptor批准的所有议案(编号小于n)中,v是编号最大的议案的决议。

通过保持P2C,我们就能满足P2B。

为了保持不变性P2C,准备提出议案(编号为n)的proposer必须知道所有编号小于n的议案中编号最大的那个,如果存在的话,它已经或将要被acceptor的某个多数派批准。获取已经批准的议案是简单的,但是预知将来可能批准的议案是困难的。Proposer并不做预测,而是假定不会有这样的情况。也就是说,proposer要求acceptor不能批准任何编号小于n的议案。这引出了下面提出议案的算法【这就是两阶段提交了】。

1.  proposer选择一个新编号n,向某个acceptor集合中的所有成员发送请求,【prepare请求阶段,n是prepare请求的编号,也是下面accept请求的议案编号】并要求回应:

a) 一个永不批准编号小于n的议案的承诺,以及

b) 在它已经批准的所有编号小于n的议案中,编号最大的议案,如果存在的话。

我把这样的请求称为prepare请求n。

2. 如果proposer收到了多数acceptor的回应,那么它就可以提出议案{n, v},其中v是所有回应中编号最高的议案的决议,或者是proposer选择的任意值,如果acceptor们回应说还没有批准过议案。

一个proposer向一个acceptor集合发送已经被批准的议案(不一定是回应proposer初始请求的acceptor集合),我们称之为accept请求。

我们已经描述了proposer的算法。那么acceptor呢?它可以接收两种来自proposer的请求: prepare请求和accept请求。Acceptor可以忽略任何请求,而不用担心安全性。因此,我们只需要描述它需要回应请求的情况。任何时候它都可以回应prepare请求【本文中,回应就意味着接受了这个prepare请求和编号n】,它可以回应accept请求,并批准议案,当且仅当它没有承诺过【承诺批准或批准一个更高编号的议案】。换句话讲:

P1A. acceptor可以批准一个编号为n的议案,当且仅当它没有回应过一个编号大于n的prepare请求。P1A蕴含了P1。

现在我们得到了一个完整的决议选择算法,并满足我们要求的安全属性——假设议案编号唯一。通过一些简单优化就能得到最终算法。

假设一个acceptor接收到一个编号为n的prepare请求,但是它已经回应了一个编号大于n的prepare请求。于是acceptor就没有必要回应这个prepare请求了,因为它不会批准这个编号为n的议案。它还可以忽略已经批准过的议案的prepare请求。

有了这些优化,acceptor只需要保存它已经批准的最高编号的议案(包括编号和决议),以及它已经回应的所有prepare请求的最高编号。因为任何情况下,都需要保证P2C,acceptor必须记住这些信息,包括失效并重启之后。注意,proposer可以随意的抛弃一个议案——只要它永远不会使用相同的编号来提出另一个议案。

结合proposer和acceptor的行为,我们将把算法可以分为两个阶段来执行。

阶段1.

a) Proposer选择一个议案编号n,向acceptor的多数派发送编号也为n的prepare请求。

b) Acceptor:如果接收到的prepare请求的编号n大于它已经回应的任何prepare请求,它就回应已经批准的编号最高的议案(如果有的话),并承诺不再回应任何编号小于n的议案;

阶段2.

a) Proposer:如果收到了多数acceptor对prepare请求(编号为n)的回应,它就向这些acceptor发送议案{n, v}的accept请求,其中v是所有回应中编号最高的议案的决议,或者是proposer选择的值,如果回应说还没有议案。

b) Acceptor:如果收到了议案{n, v}的accept请求,它就批准该议案,除非它已经回应了一个编号大于n的议案。

Proposer可以提出多个议案,只要它遵循上面的算法。它可以在任何时刻放弃一个议案。(这不会破坏正确性,即使在议案被放弃后,议案的请求或者回应消息才到达目标)如果其它的proposer已经开始提出更高编号的议案,那么最好能放弃当前的议案。因此,如果acceptor忽略一个prepare或者accept请求(因为已经收到了更高编号的prepare请求),它应该告知proposer放弃议案。这是一个性能优化,而不影响正确性。

2.3 获知选择的决议

Learner必须找到一个被多数acceptor批准的议案,才能知道一个决议被选择了。一个显而易见的算法就是,让每个acceptor在批准议案时通知所有的learner。于是learner可以尽快知道选择的决议,但是要求每个acceptor通知每个learner——需要的消息个数等于learner数和acceptor数的乘积。

基于非拜占庭假设,一个learner可以从另一个learner得知被选择的决议。我们可以让acceptor将批准情况回应给一个主Learner,它再把被选择的决议通知给其它的learner。这增加了一次额外的消息传递,也不可靠,因为主learner可能会失效,但是要求的消息个数仅是learner数和acceptor数的总和。

更一般的,可以有多个主Learner,每个都能通知其它所有的acceptor。主learner越多越可靠,但是通信代价会增加【消息个数越多】。

由于消息丢失,可能没有learner知道选择了一个决议。Learner可以向acceptor询问批准的议案,但是由于acceptor的失效,可能难以得知多数派是否批准了一个议案。这样,learner只能在新的议案被选择时才能知道acceptor选择的决议。如果learner需要知道是否已经选择了一个决议,它可以让proposer根据上面的算法提出一个议案【提出请求就有回应,并且新的提案的决议就是当前选择的决议】。

2.4 处理流程

很容易构造这样一个场景,两个proposer轮流提出一系列编号递增的议案,但是都没有被选择。Propoer p选择议案的编号为n1,并结束阶段1。接着,另外一个proposer q选择了议案编号n2>n1,并结束阶段1。于是p在阶段2的accept请求将被忽略,因为acceptor已经承诺不再批准编号小于n2的议案。于是p再回到阶段1并选择了编号n3 > n2,这又导致q第二阶段的accept请求被忽略,…

为了保证流程,必须选择一个主proposer,只有主proposer才能提出议案。如果主proposer和多数acceptor成功通信,并提出一个编号更高的议案,议案将被批准。如果它得知已经有编号更高的议案,它将放弃当前的议案,并最终能选择一个足够大的编号。

如果系统中有足够的组件(proposer,acceptor和网络)能正常工作,通过选择一个主proposer,系统就能保持响应。Fischer、Lynch和Patterson的著名结论[1]表明:选择proposer的可靠算法必须是随机的或者实时的——例如,使用超时机制。然而不管选择成功与否,安全性都能得到保证。

2.5 实现

Paxos算法[5]假设了一组网络进程。在其一致性算法中,每个process都同时扮演proposer、acceptor和learner的角色。算法选择一个leader,它就是主proposer和主learner。Paxos一致性算法就是上面描述的那个,请求和响应都用消息发送(响应会被打上对应议案的编号,以防止混淆)。使用持久化存储来保证acceptor失效后也能记起必要的信息。Acceptor在发送响应前必须持久化存储该响应。

接下来就是描述保证任何两个议案的编号都不相同的机制。proposer从互不相交的集合中选择议案编号,因此两个不同的proposer永远不会提出相同编号的议案。【假设有5个proposer,编号为0~4,可以使proposer i的议案编号选择序列为:5*j + i(j >= 0),就能保证永不重复,且递增】每个proposer都持久化保存它已经提出的编号最高的议案,并使用一个更高的议案编号来开始阶段1。

时间: 2024-11-07 10:16:46

竞价广告系统-ZooKeeper介绍的相关文章

竞价广告系统-点击率预测和逻辑回归

点击率预测和逻辑回归 点击率预测 从广告索引中我们得到很多的广告候选,这些广告从逻辑上都满足广告主的定向条件,即广告主定向条件的DNF范式,在竞价广告系统中,我们要选择一个最优的方案,最优的广告投送出来,一般最优的广告是通过eCpm进行排序,用广义第二高价进行排序,进行收费的模式.在CPC环境中eCpm=bid * ctr,那么对CTR的预测就是竞价广告系统中最重要的一个部分. 每个公司都对点击率预测有不同的做法,做法也非常多,这里只描述一下人人对这个问题的理解和看法. 广告点击预测概率模型:

竞价广告系统-流量预测

流量预测 在前面合约式广告中提到过合约式广告中有三个基本技术,1. 受众定向,2. 点击预测,3. 流量预测.在这三个技术基础上才可以做Online Allocation,本节主要介绍流量预测. 在定向条件分的比较粗的情况下,流量预测是比较简单的,比如只对人群分了几十个类,那么只需要进行简单的统计就可以进行流量预测了.但在实际的Network中,一个广告投放的定向条件比较多(即前一节中的DNF),并且条件有或的关系,也可能有与的关系. 流量预测的方法有很多,也不乏一些fancy的做法,这里只介绍

竞价广告系统-动态特征

动态特征 特征对点击率预测有多种选择的方法,我们现在有三个轴,有ad,user,context.User上有很多标签,cookie,age,gender是从定向信息中得到的,url上有一些域名和分析得到的topic,ad上有层次的category,advertiser,campaign,solution,creative,url.很显然,如果仅仅作为一个learning的问题,任何两个轴或三个轴组合出来的特征都是可以用作于logistic regression中的特征去学习的,还可以分析出每个特

竞价广告系统-广告网络

广告网络 广告网络 (Ad Network) 在竞价机制下,主流的广告市场形态是广告网络,解释一下,广告网络在竞价机制下这个说法并不准确,因为广告网络是一个很庞杂的概念,有按CPD(按天付费)广告,还有合约式广告等等,我这里我们暂时只关注竞价机制下的广告网络. Wiki中对广告网络的定义,Connects advertisers to web sites that want to host advertisement,这是一个非常泛的定义,广告网络的主要特征有: 1. 竞价系统(Auction

竞价广告系统-广告检索

广告检索 在前面谈到合约式广告时没有讨论广告检索的问题,虽然合约式广告也有检索的问题,但合约式广告一般数量非常小,只有千的级别,不需要特别的检索技术.但在广告网络中,比如google的广告数在百万级别.广告的检索问题有其独特的地方,下面我们讨论两点. 1.     布尔表达式检索,2. 长Query,它在上下文广告时会用到. 广告投放条件过滤可以视为布尔表达式检索问题.它不同于web搜索中关键词的搜索.比如广告主投放条件可能是年龄属于第三年龄段,地区是纽约,或是地区是加州,性别是男性的用户.可以

竞价广告系统-逻辑回归优化方法-L-BFGS

逻辑回归优化方法-L-BFGS 逻辑回归的优化方法是一个经典的问题,如果我们把它视为一个最大熵模型,那么我们知道最早的优化方法是IIS,这个方法就不细讲了,因为它速度很慢.后来发现在最优化领域中非常常用的l-BFGS方法对于Logistic Regression的收敛速度优化是不错的. l-BFGS方法是Quasi-Newton方法中的一种,我想从工程角度谈一下我的看法,上次我们谈到在分布式环境下进行模型的优化,无非有两种思路,一,如果数据是mixture of exponent family的

合约广告系统-在线分配问题

在线分配(Online Allocation)问题 在线分配问题 前面提到过广告是三方博弈,用户,广告主,媒体之间的博弈,而推荐系统是用户与媒体的博弈.它们之间的区别其一是广告主通媒体reach用户是有量的需求的,推荐系统是自己把内容推给用户,不见得有明显的量的需求.广告的量的需求体现在两个方面,一种是我前面提到的GD广告系统,有量的下限的需求,或者说有固定流量的需求,二是Non- Guaranteed delivery,即非合约方式,它有一种上限的限制,它受到广告预算的受限.所以在线分配问题的

互联网DSP广告系统架构及关键技术解析

互联网DSP广告系统架构及关键技术解析 宿逆 关注 1.9 2017.10.09 17:05* 字数 8206 阅读 10271评论 2喜欢 60 广告和网络游戏是互联网企业主要的盈利模式 广告是广告主通过媒体以尽可能低成本的方式与用户达成接触的商业行为.也就是说按照某种市场意图接触相应人群,影响其中潜在用户,使其选择广告主产品的几率增加,或对广告主品牌产生认同,通过长期的影响逐步形成用户对品牌的转化. 一个好的DSP系统需要满足: 拥有强大的RTB(Real-Time Bidding)的基础设

合约广告系统-合约广告系统

合约广告系统 直接媒体购买 合约广告英文是Agreement-based Advertising,它是一种基于合约(Agreement)的商业模式,大家会看到它与后面的Network和Exchange有相当大的不同,我们当前最主要的是把合约广告要解决的问题理解清楚,具体的技术可以再理解. 传统的广告媒体购买方式是称之为直接媒体购买方式(Direct Media Buy),它是一种简单的购买方式,比如一个杂志可能有几个广告位,比如封二页,封底页,广告主可以直接购买这些广告位,这种方式没有任何的技术