fastdfs学习之 选主流程

概述:

(1)每个tracker服务在启动时会调用tracker_relationship_init函数启动一个线程relationship_thread_entrance。该线程会每隔几秒进行各个tracker的关系确认,若leader发生了变动,或宕机之类,会重新选出leader。

(2) 调用流程

main函数

|-int tracker_relationship_init()

创建线程

if ((result=pthread_create(&tid, &thread_attr, \

relationship_thread_entrance, NULL)) != 0)

//调用选主流程

|--static int relationship_select_leader()

|--循环遍历 g_tracker_servers.servers

tracker_mem_get_status 获取状态。//协议请求 TRACKER_PROTO_CMD_TRACKER_GET_STATUS

qsort(trackerStatus, count, sizeof(TrackerRunningStatus), \ // 进行排序

relationship_cmp_tracker_status);

//通知如果是自己,

static int relationship_notify_leader_changed(ConnectionInfo *pLeader)

|--relationship_notify_next_leader//循环遍历通知发送TRACKER_PROTO_CMD_TRACKER_NOTIFY_NEXT_LEADER 66协议

|--relationship_commit_next_leader //循环遍历提交TRACKER_PROTO_CMD_TRACKER_COMMIT_NEXT_LEADER 67协议

(3)  选主流程

relationship_select_leader()函数

a) 会调用tracker_mem_get_status()函数进行选主的操作。

b) tracker_mem_get_status函数先会遍历所有的tracker服务器结构,向所有的tracker服务器发起tcp连接,并发送

TRACKER_PROTO_CMD_TRACKER_GET_STATUS命令来获取各个tracker服务器的状态,各个tracker服务器接收到该命令后,会发送自己的状态给该函数(包括该tracker服务器是否是leader的信息),该函数把信息保存到tracker服务器对应的数据结构中。

c) 接下来该函数对各个tracker服务器的状态进行排序(qsort,默认是升序排列),先按照是否是leader进行排序,其次根据运行时间,再次间隔时间,端口等。

d) 排序后的数组的最后一个成员就是leader,取出leader的状态。

e) 若leader是自己,用relationship_notify_leader_changed函数通知各个tracker服务器,若不是自己,把leader的值设置成选出的leader的值。

(4) 选出leader后的通知流程

函数调用关系如下:

relationship_notify_leader_changed()

->relationship_notify_next_leader

->relationship_commit_next_leader()

若tracker的leader已经改变了,就要调用relationship_notify_leader_changed函数对各个tracker进行通知,该函数又继续调用relationship_notify_next_leader和relationship_commit_next_leader函数,下面分别看看这两个函数做了什么。

relationship_commit_next_leader():

(1) 调用do_notify_leader_changed函数发送TRACKER_PROTO_CMD_TRACKER_NOTIFY_NEXT_LEADER命令给tracker服务器。

tracker服务器端收到给命令后,调用tracker_deal_notify_next_leader()函数处理相应的请求。

relationship_commit_next_leader():

(1) 调用do_notify_leader_changed函数发送TRACKER_PROTO_CMD_TRACKER_COMMIT_NEXT_LEADER命令给tracker服务器。

tracker服务器接收到该命令请求后,调用tracker_deal_commit_next_leader()函数处理相应请求。

时间: 2024-10-07 11:19:11

fastdfs学习之 选主流程的相关文章

搞懂分布式技术4:ZAB协议概述与选主流程详解

搞懂分布式技术4:ZAB协议概述与选主流程详解 ZAB协议 ZAB(Zookeeper Atomic Broadcast)协议是专门为zookeeper实现分布式协调功能而设计.zookeeper主要是根据ZAB协议是实现分布式系统数据一致性. zookeeper根据ZAB协议建立了主备模型完成zookeeper集群中数据的同步.这里所说的主备系统架构模型是指,在zookeeper集群中,只有一台leader负责处理外部客户端的事物请求(或写操作),然后leader服务器将客户端的写操作数据同步

FastDfs 学习进阶之环境安装及上传文件测试

一:环境介绍       10.63.13.138 tracker,nginx proxy 10.63.13.143 storage,nginx 二:资源包准备 FastDFS官方论坛:http://www.csource.org 资源下载路径:http://sourceforge.net/projects/fastdfs/files/ 本实验学习环境使用CENTOS 6.4 X64 需要下载的资源包: FastDFS源代码:FastDFS_v5.05.tar.gz nginx模块源代码:fas

对照Java学习Swift--可选链式调用(Optional Chaining)

可选链式调用(Optional Chaining)是一种可以在当前值可能为nil的可选值上请求和调用属性.方法及下标的方法.如果可选值有值,那么调用就会成功:如果可选值是nil,那么调用将返回nil.多个调用可以连接在一起形成一个调用链,如果其中任何一个节点为nil,整个调用链都会失败,即返回nil. swift这个功能设计的很好,不会报空指针异常,如果是在Java中,那个环节的对象为空,则报空指针异常,程序异常退出,swift则不会,会直接返回一个nil,很方便. 通过在想调用的属性.方法.或

fastdfs学习二————集群各项测试

该测试基于两台服务器,集群搭建只需按一中的步骤分别在两台服务器上搭建即可: 测试一:单个tracker对应两个storager(storager组名相同) 1:修改两个storager的storager.conf文件中的tracker_server为tracker的地址,group相同 2:设定对单个tracker上传图片,结果为两台服务器上均有图片,且图片名相同: 结论:此时两个storager为同一个组,图片上传至该组内,成员间会相互备份 测试二:两个tracker分别对应两个storage

ElasticStack学习(三):ElasticSearch基本概念

1.文档 1)ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位.例如: a)日志文件中的日志项: b)一张唱片的详细信息: c)一篇文章中的具体内容: 2)在ElasticSearch中,文档会被序列化成Json格式: a)Json对象是由字段组成的: b)每个字段都有对应的字段类型(如:字符串.数值.日期类型等): 3)每个文档都有一个唯一的ID(Unique ID) a)可以自己指定此ID: b)也可以通过ElasticSearch自动生成: 4)我们可以将文档理解成关

学习 - Zookeeper

ZooKeeper 简介: ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等 ZooKeeper代码版本中,提供了分布式独享锁.选举.队列的接口,代码在zookeeper-3.4.3\src\recipes 1 Zookeeper的基本概念 1.1 角色 Zookeeper中的角色主要有以下三类,如下表所示: 系统模型如图所示: 1.2 设计目的 1. 最终一致性:client不论连接到哪个Se

FPGA学习的一点总结

做FPGA主要是要有电路的思想,作为初学者,往往对器件可能不是熟悉,那么应该要对数字电路的知识熟悉. FPGA中是由触发器和查找表以及互联线等基本结构组成的,其实在逻辑代码里面能够看到的就是与非门以及触发器. 不要把verilog和c语言等同起来,根本就是不同的东西,没有什么可比性,在写一句程序的时候应该想到出来的是一个什么样的电路. 计数器选择器 三态门等等,理解时序,逻辑是一拍一拍的东西,在设计初期想的不是很清楚的时候可以画画时序图,这样思路会更加的清晰. 还有就是仿真很重要,不要写完程序就

一致性算法--Paxos

分布式一致性算法--Paxos Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.在工程实践意义上来说,就是可以通过Paxos实现多副本一致性,分布式锁,名字管理,序列号分配等.比如,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点执行相同的操作序列,那么他们最后能得到一个一致的状态.为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”

分布式一致性算法--Paxos

Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.在工程实践意义上来说,就是可以通过Paxos实现多副本一致性,分布式锁,名字管理,序列号分配等.比如,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点执行相同的操作序列,那么他们最后能得到一个一致的状态.为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致.本