FastDFS之Tracker-Leader选择

FastDFSTracker-Leader选择

 

基于FastDFS 5.03/5.04


2014-12-19

 

一、Tracker-Leader概述

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

这部分的源码在tracker/tracker-relationship.c文件之中。

 

二、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_nametrunk-server-id}

通知这个消息可以从Leader中获取每个Group当前的Trunk-Server是哪个。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值