FastDFS同步机制(三)新增节点同步流程

10190阅读 0评论2020-06-05 zpf1218
分类:服务器与存储

假如现有group1 中 有 节点A,B 。新增节点C。

1、新节点storage C 启动的时候会创建线程tracker_report_thread_entrance,调用tracker_report_join向tracker 发送命令TRACKER_PROTO_CMD_STORAGE_JOIN(81)报告,自己的group名称,ip,端口,版本号,存储目录数,子目录数,启动时间,老数据是否同步完成,当前连接的tracker信息,当前状态信息(FDFS_STORAGE_STATUS_INIT)等信息
2、tracker收到TRACKER_PROTO_CMD_STORAGE_JOIN命令后,将上报的信息和已有(tracker数据文件中保存的信息)的信息进行比较,如果有则更新,没有的话,将节点及状态信息写入缓存和数据文件中,并查找同group的其他节点做为同步源,如果有返回给stroage C
3、新节点stroage C 收到tracker响应继续流程。发送 TRACKER_PROTO_CMD_STORAGE_SYNC_DEST_REQ (87)查询同步目的
4、tracker收到TRACKER_PROTO_CMD_STORAGE_SYNC_DEST_REQ 请求后, 查找同group的其他节点做为同步目标,及时间戳返回给新storage节点
5、新storage节点收到响应后,保存同步源及同步时间戳。继续流程,发送TRACKER_PROTO_CMD_STORAGE_BEAT(83) 给tracker
6、tracker收到心跳报告后,leader trakcer(非leader不返回数据),把最新的group的 storagelist返回给新的stroaged
7、stroage C 收到 tracker storage list后,启动2个同步线程,准备将binlog同步到 节点 A和B(此时还不能同步,因为stroage C 还是WAIT_SYNC 状态)
8、这时候,其他的已在线的storage 节点 A 、B会发送心跳给tracker ,tracker 把会收到最新的stroagelist,A、B、C返回给Storage A,B
9、storage A,B 收到tracker响应后,会发现本地缓存中没有stroage C,会启动binlog同步线程,将数据同步给 stroage C
10、storage A 、B分别启动storage_sync_thread_entrance 同步线程,先向 tracker 发送 TRACKER_PROTO_CMD_STORAGE_SYNC_SRC_REQ(86)命令,请求同步源,tracker会把同步源IP及同步时间戳返回
11、stroage A 、B节点的同步线程收到TRACKER_PROTO_CMD_STORAGE_SYNC_SRC_REQ 响应后,会检查返回的同步源IP是否和自己本地ip一致,如果一致置need_sync_old=1表示将做为源数据将老的数据,同步给新节点C,如果不一致置need_sync_old=0,则等待节点C状态为Active时,再同步(增量同步)。因为,如果A、 B同时作为同步源,同步数据给C的话,C数据会重复。这里假设节点A,判断tracker返回的是同步源和自己的iP一致,A做为同步源,将数据同步给storage C节点。
12、Storage A同步线程继续同步流程,用同步目的的ip和端口,为文件名,.mark为后缀,如192.168.1.3_23000.mark,将同步信息写入此文件。将Storage C的状态置为FDFS_STORAGE_STATUS_SYNCING 上报给tracker,开始同步
A)、从data/sync目录下,读取binlog.index 中的,binlog文件Id,binlog.000读取逐行读取,进行解析
具体格式 如下:
1490251373 C M02/52/CB/CtAqWVjTbm2AIqTkAAACd_nIZ7M797.jpg
1490251373 表示时间戳
C 表示操作类型
M02/52/CB/CtAqWVjTbm2AIqTkAAACd_nIZ7M797.jpg 文件名
因为storage C是新增节点,这里需要全部同步给storage C服务
B)、根据操作类型,将数据同步给storage C,具体有如下类型
#define STORAGE_OP_TYPE_SOURCE_CREATE_FILE 'C' //upload file
#define STORAGE_OP_TYPE_SOURCE_APPEND_FILE 'A' //append file
#define STORAGE_OP_TYPE_SOURCE_DELETE_FILE 'D' //delete file
#define STORAGE_OP_TYPE_SOURCE_UPDATE_FILE 'U' //for whole file update such as metadata file
#define STORAGE_OP_TYPE_SOURCE_MODIFY_FILE 'M' //for part modify
#define STORAGE_OP_TYPE_SOURCE_TRUNCATE_FILE 'T' //truncate file
#define STORAGE_OP_TYPE_SOURCE_CREATE_LINK 'L' //create symbol link
#define STORAGE_OP_TYPE_REPLICA_CREATE_FILE 'c'
#define STORAGE_OP_TYPE_REPLICA_APPEND_FILE 'a'
#define STORAGE_OP_TYPE_REPLICA_DELETE_FILE 'd'
#define STORAGE_OP_TYPE_REPLICA_UPDATE_FILE 'u'
#define STORAGE_OP_TYPE_REPLICA_MODIFY_FILE 'm'
#define STORAGE_OP_TYPE_REPLICA_TRUNCATE_FILE 't'
#define STORAGE_OP_TYPE_REPLICA_CREATE_LINK 'l'
具体同步函数storage_sync_data
C)、 发送数据给Stroage C,StroageC 收数据并保存
D)、binlog文件读完之后,会将Stroage C 状态 置为FDFS_STORAGE_STATUS_OFFLINE,向tracker 报告,同时更新同步状态到本地文件mark文件
E)、同步完成后调用 tracker_sync_notify 发送TRACKER_PROTO_CMD_STORAGE_SYNC_NOTIFY通知tracker同步完成,将storage C的 状态置为 FDFS_STORAGE_STATUS_ONLINE
F) 当storage server C向tracker server发起heart beat时,tracker server将其状态更改为FDFS_STORAGE_STATUS_ACTIVE。
上一篇:FastDFS同步机制(一)增量同步流程
下一篇:检查java进程占用内存