基本原理
FastDFS包含一组TracerServer和StorageServer的,它俩之间不通信,基本信息通过配置文件得到。每个StorageServer分成多个group,每个group中Storage都是相互备份的。traceServer中没有出现storageServer的信息,而在storage server中会列举所有的Trace server。可以看出storage server与Trace server的连接是由storage主动发起的,storage server为每个TraceServer启动一个连接线程。 如果 Group1 有 Storage1、Storage2、Storage3,其容量分别是100GB、100GB、100GB,那么 Group1的存储能力是 100GB, 而不是 300GB,这就是互相备份的意思,整个 Group 的存储能力由该组中该储能力最小的 Storage决定。数据最终是与available 的storage Server传输的。
例如上传文件步骤1、客户端Traceclient发起一个连接请求,连接到TraceServer 2、TraceServer根据已掌握得信息,来决定选择哪一台Storage Server 3、根据StorageClient根据StorageServer信息,然后连上StorageServer 4、进行操作,上传,下载文件。访问文件可以http://ip:port/M00/01/23/QUIPAFdVQZ2AL_o-AAAMRBAMk3s679.jpg
同步过程:
新增Storage server: 新加入的storage server主动连接Trace server,Trace server发现有新的storage server加入,就会将组内所有的storage server列表返回给新加入的storage server。 然后将组内storage server列表返回其他组内的storage server。
Storage server的状态:
FAST_STORAGE_STATUS_INIT:初始化,尚未得到已有数据的源服务器
FAST_STORAGE_STATUS_WAIT_SYNC:等待同步,已得到同步已有数据的源服务器
FAST_STORAGE_STATUS_SYNCING:同步中
FAST_STORAGE_STATUS_DELETED:已删除,该服务器从本组中摘除
FAST_STORAGE_STATUS_OFFLINE:离线 FAST_STORAGE_STATUS_ONLINE:在线,尚不能提供服务
FAST_STORAGE_STATUS_ACTIVE:在线,可以提供服务
新增Trace server:storage server连接该Trace server,发现该Trace server返回的本组的storage列表比本机记录的少,就会将storage server本机记录的列表同步给新加入的Trace server。
同一组内的storage server之间是对等的,文件上传,删除等操作可以在任意一台storage server进行。文件同步只在同组内的storage server之间进行。采用push方式即通过源服务器同步给目标服务器。
文件上传:一个文件上传server A,通过同步到server B,server C:此时 server A 作为源服务器,文件在server A上作为源文件。server B,server C则作为备份服务器,在server B,server C上的文件
则作为备份数据。
同步规则:
- 1、只在本组内的storage server才需要同步
- 2、只有源数据才需要同步,备份数据不需要同步(新增storage server例外,因为要通过一台storage server将已有的所有数据(包含源数据和备份数据)都同步给新增的storage server)。
同步过程:
每个storage server都需要定时把自身的信息上报给Trace,这些信息包括了本地的同步时间(即同步到最新文件的时间戳)。然后Trace 根据各个Storage的上报信息就可以知道某个文件是否完成同步。
storage中的同步信息以Binlog文件和mark文件的形式存在。
Binlog的文件格式:文件名格式 Binlog.index index从0~999例如binlog.098
第一列 | 第二列 | 第三列 |
---|---|---|
1470292943 | c | M00/03/61/QkIPAFdQCL-AQb_4AAIAi4iqLzk223.jpg |
1470292948 | C | M00/03/63/QkIPAFdWPUCAfiraAAG93gO_2Ew311.png |
1470292954 | d | M00/03/62/QkIPAFdWOyeAO3eUAABvALuMG64183.jpg |
1470292959 | C | M00/01/23/QUIPAFdVQZ2AL_o-AAAMRBAMk3s679.jpg |
1470292964 | A | M00/03/62/QkIPAFdVOsCAcxeQAAGTdbQsdVs062.jpg |
1470292969 | a | M00/03/62/QkIPAFdVOnKAXu1NAABq9pkfsms63.jpeg |
注:
第一列是时间戳
第二列是文件执行的操作,C:源文件的创建 c:备份文件的创建
A:源文件的追加 a:备份文件的追加
D:源文件的删除 d:备份文件的删除
T:源文件的truncate(截断) t:备份文件的truncate(截断)
第三列是文件名,如要访问某个文件则http://ip:port/M00/01/23/QUIPAFdVQZ2AL_o-AAAMRBAMk3s679.jpg;
Mark文件:文件名:ip_port.mark
- binlog_index:已处理的Binlog索引号 binlog_offset:已处理的binlog文件偏移量
- need_sync_old:同步已有数据文件标记,0表示没有数据文件需要同步
- sync_old_done:同步已有数据文件是否完成标记,0表示未完成,1表示已完成。
- util_timestamp:同步已有数据截止时间点 scan_row_count:已扫描的bin记录数
sync_row_count:已同步的bin记录数
概述:storage 中每个线程负责一台机器的同步工作,例如server A 向server B,server C同步,那么线程1以阻塞方式来负责server B同步,线程2以阻塞方式来负责server C同步。线程1如果没有记录要同步则睡眠。同步线程打开ip_port.mark文件,从中读取到binlog_index,binlog_offset两个字段值例如binlog_index=100,binlog_offset=500则打开Binlog.100的文件,定位到500行 循环读取一行,若没有读到数据,则睡眠若读到一行并且该行操作方式为源操作如大写的四个中的任意一个(C,D,A,T),则将该行指定的操作同步给备份服务器。同步成功后则更新binlog_offset标志,这个标志会定期写入mark文件中。
storage server状态的变化:
新增storage server:
storage主动联系Trace—-Trace将storage设为INIT
(1)storage没有数据同步—–Trace将storage设为ONLINE
(2)storage需要同步拿到同步的截止时间点(当前时间)——–Trace将storage设为WAIT_SYNC2(2)中同步线程开始工作—-Trace将storage设为SYNCING
同步到了截止时间点,由增量同步–>正常binlog同步,当读取不到binlog后,源同步完成——-Trace将storage设为OFFLINE
当同步完所有数据——Trace将storage设为ONLINE
新增的storage server向Trace 发送一个心跳包———Trace将storage设为ACTIVE
新增的storage即可提供服务
注意:1、新storage整个源同步过程中都是单线程的,不能并发,如果在步骤四中,系统一直处于繁忙状态,则binlog会一直持续读取,则会导致一直无法完成源同步的过程。
同步问题:
- 如果一个文件刚上传其他备份server未同步的情况,客户端立即发起对这个文件的下载或者访问,Trace会利用fastDFS-nginx-module重定向到源服务器取文件如果一个文件刚上传其他备份server未同步的情况,客户端立即发起对这个文件的下载或者访问,Trace会利用fastDFS-nginx-module重定向到源服务器取文件。
- 如果一个文件上传后,由于同步线程缓慢,未来得及同步到备份服务器中,就在已经被删除,则同步线程会打印一条日志,然后继续处理后面的binlog
.