背景
最近在重读“Dynamo: Amazon’s Highly Available Key-value Store”(经典好文,推荐!),文章4.4 中聊到了Data Version
为了提高可用性,Dynamo允许“更新”操作异步的传播到其他副本,当出现多个写事件并发执行时,可能会导致系统中出现多个版本的对象。
由于我们无法保证分布式系统中的多个结点的物理时钟是完美同步的,所以通过物理时钟来确定事件的时序是不靠谱的,但我们可以通过基于事件的逻辑时钟来构建部分有序的事件时序集合
Dynamo通过Vector Clock来构建同一对象多个事件的部分有序的时序集合
需要特别说明的是,Vector Clock能解决分布式系统多版本合并的问题,但是对于确实发生冲突的版本,它无法合并,而需要用户自己去做合并
另外,lamport大神写的“Time Clocks and the Ordering of Events in a Distributed System”可以认为是Vector Clock的理论基础,有兴趣同学可以看看
简述
Vector Clock是一个向量,向量的每个分量为(node,count),node即为分布式系统的节点,count为对应节点上的版本,在处理事件前count会对将该值递增,当它需要和其它节点进行同步的时候也会把count带上。
通过比较这些向量的大小,来确定事件发生的顺序。
假如一个向量的所有分享量的count值都小于或等于另一个向量,可以认为后者并前者更"新"
否则,存在冲突
示例
1.“用户A在N1节点上设置x=100” ------------ 节点N1生成向量<(N1,1)>
2.“用户A在N1节点上设置x=200” ------------ 节点N1生成向量<(N1,2)>
3.“N1将x=200传播到N2” ----------- 节点N2生成向量<(N1,2)>
4.“N1将x=200传播到N3” ----------- 节点N3生成向量<(N1,2)>
5.“用户A在N2节点上设置x=300” ------------ 节点N2生成向量<(N1,2), (N2,1)>
6.“用户B在N3节点上设置x=400” ----------- 节点N3生成向量<(N1,2), (N3,1)>
此时各个节点的向量
N1: <(N1,2)>
N2:<(N1,2), (N2,1)>
N3:<(N1,2), (N3,1)>
插入一个知识点Quorum NRW模型:
N: 复制的节点数量
R: 成功读操作的最小节点数
W: 成功写操作的最小节点数
只需W + R > N,就可以保证强一致性。
此处我们的N=3
当需要高可写的系统时,可以设置W=1 R=3
当需要高可读的系统时,可以设置W=3 R=1
假设此处R=3 W=1
7.有个读x的事件
客户端其拿到N1,N2,N3上的向量,通过比较可知,N1上的是旧数据,N2/N3版本存在冲突,此时需要用户自己去解决冲突
相关推荐
【标题】"74_alarm_clock111.rar_clock vhdl" 涉及的主要知识点是数字电路设计,特别是使用VHDL(Very High Speed ...为了深入理解并改进这个系统,需要查看这个代码文件,理解其逻辑结构,并可能进行修改和测试。
"clock vml指针时钟"是一个基于VML(Vector Markup Language)技术实现的互动时钟应用。VML是一种用于在网页上展示矢量图形的标记语言,它在HTML4和XHTML中被广泛使用,特别是在IE浏览器中,因为SVG(Scalable ...
在这个"clock时钟程序"中,开发者可能使用了C++的STL(标准模板库),包括容器(如vector和list)、迭代器、算法等,这些工具大大简化了数据处理和操作。此外,为了构建用户界面,可能还使用了GUI(图形用户界面)库...
display <= std_logic_vector(to_bcd(hours, 2)) & std_logic_vector(to_bcd(minutes, 2)) & std_logic_vector(to_bcd(seconds, 2)); -- 将十进制转换为BCD码并显示 end process; end Behavioral; ``` 这里,`...
通过理解和实现Segment Clock算法,你可以深入理解内存管理的基础,这对于系统程序员和低级别软件开发者来说是非常宝贵的技能。此外,C++的实现可以帮助你更好地掌握面向对象编程和数据结构的应用。
大数据领域中,"2018数据管理音频整理1"涵盖了多个关键知识点,包括大数据的四个V(Volume、Variety、Velocity、Value),Memcached的内存替换策略,DynamoDB的高可用性和一致性模型,以及NWR理论和Vector Clock更新...
在8086中,中断向量表(Interrupt Vector Table, IVT)存储了每个中断服务程序的地址。时钟中断通常由中断号20H表示,当计数器芯片发出中断请求时,CPU会跳转到对应的中断处理程序。 编写时钟程序的关键步骤包括: ...
android:drawable="@drawable/vector_clock"> android:name="hourHand" android:animation="@animator/rotate_hour"/> android:name="minuteHand" android:animation="@animator/rotate_minute"/> ...
- **性能测试**:为了准确评估函数的运行时间,采用了clock()函数来计算处理时间。通过多次运行并取平均值来减少系统波动的影响。同时,针对不同规模的数据(500, 5000, 50000条记录)进行测试,以观察不同数据量下...
手段篇则深入探讨了一些NoSQL数据库中常用的算法和技术,例如一致性哈希、Quorum、Vector Clock、Paxos和MapReduce等。一致性哈希用于数据库集群中的数据分片,以实现负载均衡和扩展性;Quorum是保证数据一致性的...
为了更好地理解SDRAM简易控制器的VHDL实现,这里提供了一个简化的VHDL模块示例。这个模块实现了SDRAM初始化的功能,并且包括了模式寄存器的加载等操作。 ```vhdl library ieee; use ieee.std_logic_1164.all; use ...
确保在修改开源库的源码时,理解改动的原因并做好记录,以防后续升级时出现问题。 总结起来,使用Cesium加载PBF矢量切片需要配置地形提供者,设置场景的地形,处理时间线图片的动态变化,并可能根据项目需求对...
根据给定的信息,本文将详细解释PS2键盘的VHDL程序设计原理及其实现细节。此VHDL程序主要用于检测扫描PS2键盘并读取按键值,通过一个七段数码管显示出来。...对于理解和实现类似的硬件接口具有很好的参考价值。
模拟时钟的实现可能涉及到SVG(Scalable Vector Graphics)元素,如`<circle>`,`<path>`等,它们用于绘制指针和钟面。JavaScript可以改变这些元素的属性,如`stroke-dasharray`和`transform`,以模拟指针转动的效果...
根据给定的文件信息,我们可以总结出以下关于“10进制计数器VHDL代码”的相关知识点: ### 1. VHDL简介 VHDL(Very High Speed Integrated ...这些知识点对于学习和理解VHDL语言以及数字逻辑设计具有重要意义。
在这个项目中,"analog-clock"指的是用JavaScript构建的模拟时钟,其特点是利用分层SVG(Scalable Vector Graphics)图像输出,提供了高清晰度和可缩放的图形。 SVG是一种基于XML的矢量图像格式,它可以用来创建...
《基于VHDL语言的交通灯控制器设计》 在电子工程领域,VHDL(Very High-Speed ...通过这样的设计,我们可以理解到,VHDL不仅用于描述硬件行为,还可以实现复杂的逻辑控制,是现代电子设计自动化不可或缺的一部分。
解决方法是编辑 vector source file。 2. Verilog HDL assignment warning at <location>: truncated value with size <number> to match size of target ( 这是因为在 HDL 设计中对目标的位数进行了设定,但默认...
- `a, b, nclr, clock: IN BIT`: 输入信号,其中`a`和`b`用于控制数据输入,`nclr`是清零信号,`clock`是时钟信号。 - `q: BUFFER BIT_VECTOR(0 TO 7)`: 数据输出,是一个8位的位向量。 ##### 3.2 体系结构定义 `...