whypaxos

为什么是paxos

最近又看了次 paxos made simple,每次看完总觉得理解了它,但不久之后又将它忘得一干二净,因此决定这次好好梳理下。本文还参考了微信对于paxos 的实现的相关文章(见 phxpaxos)。

本文主要从paxos是如何执行的,已经如果不这么执行,会有什么样的问题来描述paxos,这个思路是我觉得比较好接受的方式。至于paxos的理论证明,在 The Part-Time Parliamentpaxos made simple 已经将的很清楚了,有兴趣可以去看论文。

paxos基本定义

概论:paxos要解决的问题是,在多台机器确定一个值。也就是说完整跑完paxos,可以保证在这个集群里,最终总有个时刻,所有存活的机器保留的这个值都相同(至于得到一个不变量,在工程上有什么用,这里就不加讨论了)。

paxos里面有几个角色:

  • proposer:提议者,接收客户端的请求,发起一个请求。
  • acceptor:接受者,决定是否接受proposer的提议。

对于一个提议,包含:

  • proposal number:提议号,全局唯一,且各自的机器需要保证自己的proposal number是递增的。实现可以是:时间戳加ip或者提前分好各自的提议段(第一台机子:1,101,201,第二台机子:2,102,202)。
  • proposal value:提议的值。

paxos的执行流程

第一阶段(prepare request)
  • proposer  选择一个 proposal number ,然后将它发送给大多数 acceptor (大多数:对于一个固定集合来说,大多数基本就是大于一半的数量。更精确的定义的是,两个大多数集总有一个共同元素)。这个请求被称为:prepare request 。
  • 对于 acceptor ,如果它收到一个 proposal number 为 n 的 prepare request,那么倘若这个 acceptor 没有回复过 proposal number 大于 n 的 prepare request ,则该 acceptor 需要回复这个 prepare request,并承诺不再 accept 任意 proposal number 小于 n 的 prepare request,如果在这之前该 acceptor accept 过任何 proposal,则还必须带上 accept 过的拥有最大 proposal number 的 proposal (含 proposal number 和 value)。
第二阶段(accept request)
  • 如果 proposer 收到大多数 acceptor 对于 proposal number 为 n 的 prepare request 的响应,那么该 proposer 就可以向 acceptor 发起 accept request,proposal number 为 n,值为 v (其中,如果 acceptor 响应中带有 proposal,则 v 为 proposal number 最大的那个 proposal 值,否则 v 可以为任意值)
  • acceptor 收到 accept request 后,如果这个proposal 不违背该 acceptor 做出的承诺(在 prepare request 阶段,不再接受 proposal number 小于 n 的承诺),则 acceptor 必须 accept 这个请求。

当大多数的 acceptor 都回应了这个 accept request,那么完整的 paxos 就已经跑完了,唯一的一个值已经被choose了。

为什么paxos要这么麻烦

不用两个阶段可以么

paxos 的强大之处在于即使有多个 proposer 并行地提出请求,也能保证集群最终只会 choose 到同一个值,而且只要集群的大多数机器不宕机,服务是可以继续下去的。

如果各个 proposer  直接提出 accept request ,那么很容易就出现这样的情况:有4台机器ABCD,A和B提出了propose,很可能就出现了AC两台机器同意了A的请求,BD两台机器同意B的请求,最终将无法得到一个结果。

话虽这么说,但 paxos 其实也会协商得不到一个值的情况:A向大多数机器发送了 prepare request,proposal number 为 1,并得到了大多数机器的响应;与此同时 B 也向大多数机器发送了 prepare request ,proposal number 假设为 2,那么这时 A 再发送 accept request 的时候,就会被这些机器拒绝(它们已经承诺不接受proposal number 小于2 的请求),所以A 重新发送 prepare request , proposal number 为101,之后 B 再来发送 accept request 的时候就被拒绝,所以 B 又发送proposal number 为102的 prepare request,如此往复,就永远得不到一个共同的值。

由于 paxos 存在着上述这种情况,所以如果有个 leader ,由这个 leader 来提出 propose ,就不会有上述的情况。那么这个 leader 是怎么确定的,在 paxos made simple 的论文里面并没有提到。不过可以看出,paxos 对这个 leader 并没有做出任何限制,也就是说,即使在某个时刻存在着两个 leader ,同样也不会影响到 paxos 来确定出最终的一个值。因此 leader 的选举就变得不是特别复杂,例如利用一些简单的策略:一旦收到其他机器的 accept request ,就在一段随机时间内,停止进行 paxos 的 prepare request。由于这是随机时间,所以最终总会有台机器脱颖而出,不断进行 prepare request,然后 accept request ,这使得其他机器又进行一段时间的停止 prepare request,所以该机器又能顺利通过 prepare request,再 accept request。这样,一个 leader 就自然而然地产生了。

那 paxos 来选举 master 又是怎么回事

master 的一个重要特点是:集群在任意时刻,最多只能有一个 master 。也就是说,宁可没有 master ,也不能出现多个 master 的情况。说起 master ,要稍微说下 paxos 选出一个值后有什么用,可以这么想,paxos 可以选出一个值,那么顺序运行多个 paxos 实例,就可以做到在集群中,各个机器都维护一个状态机,顺序执行 paxos 的结果可以作为这个状态机的输入,那么就能保证集群中所有的状态机都能得到一个最终一致性(这也就是基本的 multi-paxos 的模型)。而 master 的作用就体现出来了,如果有个 master 进行读写,那么从这个 master 总能读出最新的数据。

至于 master 怎么选,简单点说就是发起一个 paxos 的过程,各台机器的proposal value 就是自己的节点信息,也就是各个机器都认为自己是 master ,最终确定下来一个 value,也就确定了 master 。当然也没这么简单,如果 master 挂了又该怎么办?其实不需要主动去判断 master 是否挂了,只需要给 master 一个任期,任期结束后,master 主动去续约。只要 master 在任期结束前,提前去续约,就总是能续约成功的。 既然引入了任期的概念,也就是说,需要用多个 paxos 实例来确定,也即是 multi-paxos ,但有机器与 master 失联,没有学到 master 的续约的请求后,重新发起次 paxos,由于 paxos 实例落后于 master 的,自然不会得到大多数机器的接受,进而可以学到 master 是谁。

不同的 proposer 的 proposal number 一样可以么

不可以。paxos 对 proposal number 是有一定的要求的:proposal number 在所有机器中必须是唯一的,而且各自的机器必须是递增的。从 paxos 的过程也可以看出,在 prepare request 阶段,是只利用 proposal number 来进行提议的,不需要用到提议的值,承诺也是针对 proposal number ,如果存在不同机器的 proposal number 是一样的,而它们提议的值却不一定一样,这就违背了最终所有机器确定唯一的值的初衷了。

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在 Android 开发中,Fragment 是界面的一个模块化组件,可用于在 Activity 中灵活地添加、删除或替换。将 ListView 集成到 Fragment 中,能够实现数据的动态加载与列表形式展示,对于构建复杂且交互丰富的界面非常有帮助。本文将详细介绍如何在 Fragment 中使用 ListView。 首先,需要在 Fragment 的布局文件中添加 ListView 的 XML 定义。一个基本的 ListView 元素代码如下: 接着,创建适配器来填充 ListView 的数据。通常会使用 BaseAdapter 的子类,如 ArrayAdapter 或自定义适配器。例如,创建一个简单的 MyListAdapter,继承自 ArrayAdapter,并在构造函数中传入数据集: 在 Fragment 的 onCreateView 或 onActivityCreated 方法中,实例化 ListView 和适配器,并将适配器设置到 ListView 上: 为了提升用户体验,可以为 ListView 设置点击事件监听器: 性能优化也是关键。设置 ListView 的 android:cacheColorHint 属性可提升滚动流畅度。在 getView 方法中复用 convertView,可减少视图创建,提升性能。对于复杂需求,如异步加载数据,可使用 LoaderManager 和 CursorLoader,这能更好地管理数据加载,避免内存泄漏,支持数据变更时自动刷新。 总结来说,Fragment 中的 ListView 使用涉及布局设计、适配器创建与定制、数据绑定及事件监听。掌握这些步骤,可构建功能强大的应用。实际开发中,还需优化 ListView 性能,确保应用流畅运
资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 牛顿迭代法是一种高效的数值方法,用于求解方程的根,尤其擅长处理一元高次方程。它基于切线逼近原理,通过迭代逐步逼近方程的实根。对于一元三次方程 ax 3 +bx 2 +cx+d=0(其中 a 6 =0),牛顿迭代法可以找到所有可能的实根,而不仅仅是其中一个。三次方程最多有三个实根或复根的组合。 牛顿迭代法的步骤如下: 初始化:选择一个初始值 x 0 ,尽量使其接近实际根。初始值的选择对收敛速度影响很大。 构造迭代公式:迭代公式为 x n+1 =x n − f ′ (x n ) f(x n ) ,其中 f(x) 是方程,f ′ (x) 是其导数。对于一元三次方程,f(x)=ax 3 +bx 2 +cx+d,其导数 f ′ (x)=3ax 2 +2bx+c。 迭代计算:从 x 0 开始,利用迭代公式计算 x 1 ,x 2 ,…,直到满足终止条件,如连续两次迭代的差值小于阈值 ϵ,或达到最大迭代次数。 检查根:每次迭代得到的 x n 可能是根。若 ∣f(x n )∣<ϵ,则认为 x n 是近似根。 在求解一元三次方程时,牛顿迭代法可能会遇到多重根或复根。对于多重根,迭代可能收敛缓慢甚至不收敛,需要特别处理。对于复根,牛顿迭代法可能无法直接找到,因为复数的导数涉及复数除法,通常需要使用牛顿-拉弗森迭代的复数扩展版本。 为了避免陷入局部极值,可以尝试多个不同的初始值进行迭代,从而找到所有实根。牛顿迭代法的收敛性依赖于函数的连续性和二阶导数的存在性,因此在使用前需要满足这些条件。在编程实现时,需考虑数值稳定性以及异常情况的处理,例如分母为零、迭代不收敛等。牛顿迭代法在求解一元三次方程的实根时,表现出了优于其他简单方法的优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值