两个协议:
1、NTP(Network Time Protocal)–>广泛使用
机器周期向时间服务器获取准确时间
2、没有协议名称
−
>
->
−>没有广泛使用
时间服务器周期扫描所有机器,计算时间平均值;导致时间服务器负载大,不广泛使用
逻辑时钟(logical clock)
是一种次序时间,而非准确物理时钟(an ordering time,not exact time)
a.happened-before relation
假设a,b是同一进程(process)的两个事件(event),a在b前到达:a–>b
a
发送,
b
接收
a发送,b接收
a发送,b接收:
a
−
>
b
a->b
a−>b
a
−
>
b
,
b
−
>
c
a->b,b->c
a−>b,b−>c:
a
−
>
c
a->c
a−>c
b.若无法判断
a
−
>
b
a->b
a−>b还是
b
−
>
a
b->a
b−>a(即先后顺序未知):a,b是平行事件(concurrent)
逻辑时刻(logical timestamp)
记事件event的逻辑时刻(logical timestamp)为 C ( e v e n t ) C(event) C(event)。若 a − > b , 则 C ( a ) < C ( b ) a->b,则C(a)<C(b) a−>b,则C(a)<C(b)
如果没有中心结点如何计算逻辑时刻??:
1、对于进程
i
i
i,有事件发生时
C
i
=
C
i
+
1
C_i = C_i + 1
Ci=Ci+1
2、有消息(message)发送时,消息中带有
t
s
(
m
)
=
C
i
ts(m) = C_i
ts(m)=Ci
3、对于收到消息的进程
j
j
j,更新本地
C
j
=
m
a
x
{
C
j
,
t
s
(
m
)
}
C_j=max\{C_j,ts(m)\}
Cj=max{Cj,ts(m)},然后
C
j
=
C
j
+
1
C_j = C_j+1
Cj=Cj+1
例子:
会产生问题:冲突
完全有序多播(totally ordered multicast)
对于员工奖励,是先增加1000元、再提成1%?还是先提成1%、再增加1000元?假如员工和经理都会向自己的服务器(员工服务器、经理服务器)发送更新。由于顺序的原因,员工服务器是先增加1000元、再提成1%,经理服务器是先提成1%、再增加1000元。最终两个服务器数据同步时,会发生冲突,怎么解决?
解决方案:根据公司规章制度来(业务逻辑),对于特殊员工,特殊接口对待
不同机器上时间戳不同,用逻辑时钟??
1、
a
−
>
b
,则推导出
C
(
a
)
<
C
(
b
)
a->b,则推导出C(a)<C(b)
a−>b,则推导出C(a)<C(b)
2、但是
C
(
a
)
<
C
(
b
)
,不能推导出
a
−
>
b
C(a)<C(b),不能推导出a->b
C(a)<C(b),不能推导出a−>b
# 矢量时钟(Vector clock)
结论:???没有拍到
运行步骤:
1、对于每个进程
P
i
P_i
Pi,有向量
V
C
i
[
1
,
.
.
.
.
.
n
]
VC_i[1,.....n]
VCi[1,.....n],
n
n
n为总的进程数,所有元素初始化为0
2、
P
i
P_i
Pi发送消息
m
m
m,则
V
C
i
[
i
]
+
1
VC_i[i]+1
VCi[i]+1,以及发送的消息
m
m
m带上
V
C
i
VC_i
VCi作为消息的矢量时钟
V
t
(
m
)
Vt(m)
Vt(m)
3、进程
P
j
P_j
Pj从
P
i
P_i
Pi接收消息
m
m
m和矢量时间戳
t
s
(
m
)
ts(m)
ts(m) =Vt(m)???
1.更新
V
C
j
VC_j
VCj,对于
V
C
j
VC_j
VCj的每个元素
V
C
j
[
k
]
=
m
a
x
{
V
C
j
[
k
]
,
t
s
(
m
)
[
k
]
}
VC_j[k] = max\{VC_j[k],ts(m)[k]\}
VCj[k]=max{VCj[k],ts(m)[k]}
2.
V
C
j
[
j
]
+
1
VC_j[j]+1
VCj[j]+1
举例:
解释:P0,P1,P2初始均为(0,0,0)。
首先
P
1
P_1
P1发生事件
a
a
a,更新
V
C
0
[
0
]
=
0
+
1
VC_0[0] = 0+1
VC0[0]=0+1,且发送消息
t
s
(
m
)
=
(
1
,
0
,
0
)
ts(m) = (1,0,0)
ts(m)=(1,0,0),同时
P
1
P_1
P1发生事件
c
c
c,更新
V
C
1
[
0
]
=
0
+
1
VC_1[0] = 0+1
VC1[0]=0+1,没有发送消息;然后
P
1
P_1
P1发生事件
d
d
d,接收来自
P
0
P_0
P0的消息
m
m
m,更新
V
C
1
[
k
]
=
m
a
x
{
V
C
1
[
k
]
,
t
s
(
m
)
[
k
]
}
VC_1[k] = max\{VC_1[k],ts(m)[k]\}
VC1[k]=max{VC1[k],ts(m)[k]},然后
V
C
1
[
1
]
+
1
VC_1[1]+1
VC1[1]+1。接下来是一个道理
讨论:在大型网络中,那种时钟合适(物理、逻辑、矢量)??
解答:同步是为了进行数据同步,保证数据一致性,在超大型网路中,数据同步需求低(Oracle最多支持9个数据副本同步);在小批量网络中,矢量时钟最合适,逻辑时钟具有发生冲突的根本矛盾。
mutual exclusion
三大要求:
1.safety:只有一个进程在给定时间进入临界区工作
2.liveness:请求进入与退出都会成功—即每个进程不会一直待在临界区内
3.fairness:先来后到,先请求先服务
进程根据token进入临界区工作
有中心结点
由中心结点进行调度,
无中心结点
基于逻辑环ring-based solution
谁有token令牌谁进入工作
RA算法(Ricart-Agrawala)基于多播(muticast)
·进程
P
i
P_i
Pi想进入临界区时,向其它所有进程发送REQUEST广播消息
·进程
P
j
P_j
Pj收到进程
P
i
P_i
Pi的请求。
若进程
P
j
P_j
Pj没有请求临界区、也没有正在执行临界区,则立即返回REPLY消息。
若进程
P
j
P_j
Pj正在请求临界区,但其时间戳大于进程
P
i
P_i
Pi的请求,则立即返回REPLY消息。
否则,进程
P
j
P_j
Pj延迟返回REPLY)消息,并设置〖RD】[风=1,其中RD数组记录了所有被延迟发送返回消息的进程;直至
P
j
P_j
Pj自己完成后再发送
选举算法election algorithms
有一个leader或coordinator(尽管存在单点故障(single point of failure)、瓶颈(bottleneck)等问题。
如何动态选举出一个特殊进程作为leader (选举算法解决了单点故障问题)
没有前领导人,谁触发选举不重要
假设:
1、每个进程均有相应的优先级(权值),一般按照编号来)
2、优先级最高的成为leader
暴力枚举(Bully)
思想:谁的 ID 最大或最小谁来当老大(一般选择 ID 大的)。
规则:1.leader不响应或相应超时,则触发选举
2.从ID小的开始向上选举
3.故障结点复活了,是否抢回leader位---->否,可以容忍一些
优先级大的结点一直当leader,持续高负荷工作,内存碎片增加,工作效率降低
Ring(基于环)
message绕环一圈,就有了全局的信息,知道有哪些结点,将最大编号的作为leader
RA算法参考:https://blog.csdn.net/happy990/article/details/95032371