您的位置:首页 > 其它

FastDFS Tracker-Leader选择

2016-07-24 02:21 465 查看
一、Tracker-Leader概述

    在FastDFS之中,可以任意配置多个Tracker,在运行过程中会选择其中一个作为Leader,由该Leader执行一些唯一性的操作。在早期版本中Tracker-Leader有两个作用,分别是:为新加入的Storage分配一个源Storage;为开启合并存储的Group选择Trunk-Server。但是在最新的版本中实际上只有第二个作用,也就是选择Trunk-Server。对于新加入Storage分配源其实是任何一个Tracker都可以进行的,为了避免多次分配,在Storage请求Tracker分配源时进行了互斥量同步。

 
二、Tracker-Relationship线程

    在Tracker程序启动后,会启动一个Relationship线程,专门负责Leader的选择,与同Leader的通讯(若自己不是Leader)。

该线程的逻辑很简单,检查内存结构是否设置了Leader,若没有设置Leader,则选择一个Leader,否则向该Leader执行一个Ping操作。
1、选择(查询)Leader

relationship_select_leader函数

1)向所有的Tracker(包括自己)发送一个TRACKER_GET_STATUS命令,来获取对方的状态信息,该信息包括:是否为Leader;到目前的运行时间;上次停止时间间隔(也就是最后一次停止到启动的时间间隔);只要获取到至少一个该状态成功,则继续下一步:

2)对所有返回成功的Tracker-Status进行排序(根据上一步的信息顺序比较),获得状态值最高的Tracker

3)若状态最高的Tracker就是自己,那么进入一个两阶段提交协议:

通知除自己之外的所有Tracker,将要变更Tracker-Leader,只要有一个Tracker通知成功,则进入下一步;

通知所有的Tracker(包括自己),将Leader变更成自己,只要有一个Tracker返回成功,则表示整个变更成功;(此处通知了自己,那么这个步骤肯定会成功)。

4)若最高状态的Tracker当前就是Leader,那么就设置本地标志为g_tracker_servers.leader_index,表示Leader已经确定。

5)否则,等待真正的Leader发起Leader变更消息

这里的逻辑,多少让人不放心,若有三个或以上的Tracker并且中间出现网络不通的情况,很有可能会产生两个Leader。不过要记住,Leader只有在开启了合并存储时,才使用来选择Trunk-Server。其他时候是没用的。

 
2、与Leader心跳(Ping)

    relationship_ping_leader函数向Tracker-Leader发送一个TRACKER_PING_LEADER消息,该Tracker将响应一个数组,该数组每个成员为一个结构体如下:

{group_name,trunk-server-id}

通知这个消息可以从Leader中获取每个Group当前的Trunk-Server是哪个。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  FastDFS Tracker-Leader