线程
tracker_report_thread_entrance
- storage请求加入:
storage --->tracker
TRACKER_PROTO_CMD_STORAGE_JOIN
消息中携带有storage的group name, IP, port,加入时间,storage启动时间等信息;还有一个是storage会上报从配置文件中读取的所有的tracker server的IP 和port。
tracker根据tracker serer IP的列表更新traker中g_tracker_servers的tracker server列表的记录。
tracker根据group_name 在g_groups增加一个group的记录和更新group中的端口信息。
tracker根据IP地址在group里增加(更新)storage信息,并更新storage中的状态信息。
storage的状态(status)--->FDFS_STORAGE_STATUS_INIT(在正常情况下)
-
请求同步的源storage的IP
storage --->tracker
TRACKER_PROTO_CMD_STORAGE_SYNC_DEST_REQ
请求同步的源storage的IP; tracker在group的active server中查找一个和请求IP不同的storage和当前的时间返回。
-
同步通知消息
storage --->tracker
TRACKER_PROTO_CMD_STORAGE_SYNC_NOTIFY
通知tracker, storage要进行同步,将storage的状态改为FDFS_STORAGE_STATUS_WAIT_SYNC;
-
心跳消息
storage --->tracker
TRACKER_PROTO_CMD_STORAGE_BEAT
此消息将storage的统计信息发送给tracker用于更新storage的统计及状态信息;
tracker会检查同步状态(tracker_check_and_sync)
主要是:tracker leader是否改变; trunk server 是否改变; group改变计数 和storage改变计数是否一致。
- 报告同步时间戳
TRACKER_PROTO_CMD_STORAGE_SYNC_REPORT
- 报告DISK的使用情况
storage --->tracker
TRACKER_PROTO_CMD_STORAGE_REPORT_DISK_USAGE
报告硬盘的所有存储空间和空闲空间;
tracker会根据报告的信息更新storage中的信息; 以及更新最近可以用那个group最为下次写的group(空闲最多的); group的空闲空间(已最小的那个storage报告为准); 下次要选为写的storage的path(最大空闲的path)等信息;
- 报告现在的TRUNK file ID
storage --->tracker
TRACKER_PROTO_CMD_STORAGE_REPORT_TRUNK_FID
Tracker记录最新的trunk file ID
- 报告trunk file 的所有空闲空间
TRACKER_PROTO_CMD_STORAGE_REPORT_TRUNK_FREE
storage 在tracker_check_response中会检查是否需要同步storage中间的数据。如果需要同步数据则创建线程storage_sync_thread_entrance来同步数据。
同步数据:
- 从binlog中读取一条记录, 读取文件的状态,并且向需要同步的storage查询对应文件的状态,比较两边文件的状态(主要是文件的大小)来确定是否需要同步两边的文件;如果需要同步文件则向对应的storage发送STORAGE_PROTO_CMD_SYNC_UPDATE_FILE,并发送文件。对方的storage接收到消息开始写文件。