本文共 1283 字,大约阅读时间需要 4 分钟。
一、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是哪个。
转载地址:http://qmbii.baihongyu.com/