GO语言分布式系统
client上传文件过程
0.初始化client:客户通常有多种定义,上传文件时,客户相当于用户,它通常与tracker连接交流
(1).新建一个client,每个client含有一个TCP连接池,负责处理本client的连接工作,包括最大连接,活动的连接等
(2) 执行一项任务,同步storage里面的所有内容,设置定时和间隔,将此任务加入到任务列表,把它放到trackerMaintainer那里,并把此trackerMaintainer注册到本client上
(3) 本地运行,可能有多个tracker,那么我们需要同时运行这些tracker,因此并发去运行他们,利用通道进行同步,让他们同步开始运行,track开始运行后,会开始执行maintainer里面的任务,并且跟其他tracker建立连接
(4) 最后检查一些有没有已经注册的可用的storage,如果没有而我要执行上传或者下载任务的话,就不能执行
1.client提出要上传文件时,首先获得该文件的绝对路径,如果路径是*,则上传本路径下的所有文件;如果是某个指定路径,则上传指定下的文件
2.把此文件以全地址的方式上传到上传列表(列表以链表形式组成),
3.每个tracker都知道每个group是什么类型的文件,因此它会给该文件分配一个group,并选择里面的任意一个storage
4.开始上传,获取该storage的地址,与该storage建立TCP连接,通过send进行字节流传输,上传后返回文件的ID,可以用来下载用
Client下载文件过程
0.初始化client:下载文件时,客户相当于用户,要连接到某一个tracker进行交流
(1).新建一个client,每个client含有一个TCP连接池,负责处理本client的连接工作,包括最大连接,活动的连接等
(2).执行一项任务,同步storage里面的所有内容,设置定时和间隔,将此任务加入到任务列表,把它放到trackMaintainer那里,并且把此trackerMaintainer注册到本client上
(3).可能有多个tracker,那么我们需要并发同时去运行他们,tracker开始运行后,会执行maintainer里面的任务,并且跟其他tracker建立连接
(4) 最后检查一些有没有已经注册的可用的storage,如果没有而我要执行上传或者下载任务的话,就不能执行
1.client发送download请求给某个tracker下载,需要带上文件名信息(包括绝对地址),如果没有则从md5中提取出文件名信息
2.tracker从文件名信息里得到它属于哪个group和对应的instanceid
3.从此group和instanceid中选出它需要的storage来服务该读请求
4.与该storage建立TCP连接,从它上面下载文件
tracker工作过程
tracker实体通常是两个功能:
1.倾听http连接,监听外部的下载和和上传操作,需要做的是返回所有的storage信息,让他们跟对应的storage联系
2.开放一个内部端口,给其他的tracker或者是storage进行内部连接,用来交换信息用
1.建立一个数据库连接池,每个连接对应一个数据库,池的大小为20
2.并行执行ExpirationDetection函数,把一些已经过期的storage清理掉
3.开始http服务: 设置路由,返回此tracker管理的所有storageserver
设置路由,配置nginx的句柄
开始监听HTTP端口。有路由请求就转到对应函数处理
4.开始trackerservice,开放一个端口,给其他tracker进行内部连接。用来交换信息用。
storage工作过程
1.当客户端下载文件的时候,如果文件尚未在组内全部同步完成,并且恰好访问到没有同步完成的机器时,客户端会将请求重定向到文件原始服务器。
2.文件名称:/G001(组)/01(原始服务器实例ID)/M[S](单片or多片)/{MD5}[.ext]
G01/2yvy3euicdzdnzq33ueh3vwmwozof1/S/40dc2ab3b9441e03d687cab8ea8f2f93
3.文件的原始名称需要客户端自行记录,可能未来加上服务端记录功能
storage service的两个任务:
1.建立一个任务:倾听上传任务
2.建立一个任务:与track交流
具体实现
1.统计数据库里的内容,有多少个文件,其中有多少个是完成了storage间的同步的,磁盘用量
2.将上传和下载任务的url添加到倾听任务列表里,一旦有对应的URL出现,则实现对应的功能
另起一个线程完成下列工作:
3.将上传的文件保存下来,并且设置回调函数,把这个文件信息推送给所有的tracker
4.将别的storage传来的需要同步的文件下载到我的数据库里
5.将tracker登记的新的需要同步的文件记录下来
6.同步一个group里面的成员,因为我自己这个storage可能有文件变化,所以需要跟同组的member更新
7.开始倾听客户端的请求,执行需要做的内容
一些重要的类或者结构体
ConnectionManager: 1.服务器信息(包括storage和tracker) 2.已经建立了的某条连接 3.一个int记录我这是服务端还是客户端 4.Md(哈希值) 5.连接状态 6.storage uuid(仅服务端使用)
包括的功能:1.关闭管理,把连接回收至连接池(连接未销毁) 2.销毁连接,3.从服务器或者客户端接收信息 4.向服务器或者客户端发送信息 5.设置连接状态
ClientConnectionPool连接池:包括以string为key的连接,每个string对应的连接数,总连接数,活动连接数和一些锁
TrackerMaintainer:1.Collectors具体的任务列表 2.所有Tracker实体 3.结束时的回调
功能:管理所有的任务和tracker,每个tracker都是一样的,都可以执行collectors里面的任务
TrackerInstance:1.它需要执行的任务列表tasklist 2.跟它连接的client 3.tracker ID 4.它需要执行的任务列表collectors 5.
功能:这是一个tracker实体,每个tracker实体在实例化时都需要把maintainer里的所有任务装进去(这里过滤后只装下载任务),并且在初始化后开始执行分配的任务,另外它还要跟原有的所有tracker建立连接并同步信息

浙公网安备 33010602011771号