博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FastDFS Tracker-Leader选择
阅读量:4089 次
发布时间:2019-05-25

本文共 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/

你可能感兴趣的文章
Java编程基础:static的用法
查看>>
Java基础:封装与继承
查看>>
Java编程基础:抽象类和接口
查看>>
Java编程基础:异常处理
查看>>
Java编程基础:了解面向对象
查看>>
了解代码版本控制
查看>>
开始学习Java Web开发之前你需要了解的知识
查看>>
你必须学会的Git入门基本操作
查看>>
Java集合的使用:List与Map
查看>>
Spring的自动装配方法
查看>>
Spring中如何混用XML与Java装配方式
查看>>
Spring MVC快速入门
查看>>
Spring MVC中创建URL路由
查看>>
Spring MVC拦截器
查看>>
Spring MVC处理文件上传
查看>>
Spring MVC使用Flash Attribute展现提示消息
查看>>
Spring MVC异常处理
查看>>
新一代Java模板引擎Thymeleaf
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
Spring Boot构建简单的微博应用
查看>>