时钟容错同步算法之FTA

相关概念:

节点的时间信息:在本算法中指的是节点的本地全局时间计数器

微节拍:周期性的、用以增加计数器值的事件

时间粒度:连续两个微节拍间的时间区间

全局时间:每个本地时钟选择一个微节拍子集,作为该时钟本地可见的全局时间的节拍,全局时间是抽象的

内同步精度:任意时钟的微节拍的时间戳偏移都不得超过的数

算法目的:发生拜占庭错误时实现分布式容错时钟的再同步(解决集中式主控同步中主控节点失效的问题)

前置条件:时钟总数N>=(3k+1),k是拜占庭时钟的数量

算法流程:

1. 每个节点与其他节点交换信息以获取其他全部节点的全局时间计数器状态,这里需要减去时间信息(前面提到的其他节点的本地可见的全局时间)传输时的时间延迟抖动(系统收发、解释同步消息的时间,包括调度、操作系统、协议栈的消息队列、消息重传策略、介质访问延迟、接收端的中断延迟、调度延迟);

2. 执行收敛函数FTA计算本地全局时间计数器的校正值,如果校正值大于系统规定的精度值,则自身无效,在FTA中,由于拜占庭时钟提供的时钟值必定大于或小于正常值,故它在处理阶段中被剔除,从而屏蔽了它对其他正常时钟的影响

3. 调整本地时间:状态校正、速率校正

状态修正:直接用校正项修改本地时间值

速率修正(建议):用校正项修改本地时钟运行速率,使其在下一个再同步间隔期间加快或减慢,改变微节拍数或调节晶振电压,系统中所有的速率修正项平均值接近0

流程图:


环境搭建:

四台通过局域网连接的计算机。设置组播地址为224.0.0.111,端口为8000,修改所有电脑的网卡名称统一为eno1,对于linux系统,输入命令sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev eno1(其中224.0.0.0是网段地址)加入D级多播网络的IP路由,选择一台制造拜占庭错误,其余三台不做改动,四台电脑均设置成不通过互联网校正时间,先每台电脑互相发送一段数据确定彼此间的传输延迟,通过配置文件确定一个时间使所有的程序同时(各自的本地时间)开始第一次组播,之后每台电脑每1分钟(可配置)组播一次(按照本地时钟的频率),组播后启动计数器计算收到的其他节点的组播的时间,并记成收到消息时的本地时间,进行FTA。

程序分为服务端线程与客户端线程。服务端负责发送组播数据,客户端负责监听组播数据,当收到3个组播数据后就执行FTA校正本地时间。

项目地址:https://github.com/carduswork/FTA

你可能感兴趣的:(时钟容错同步算法之FTA)