欢迎来到天天文库
浏览记录
ID:9507323
大小:58.00 KB
页数:9页
时间:2018-05-01
《分布式存储系统的实现》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、分布式存储系统的实现 敬惜人工智能系统平台希望能做成一个开放运营的平台,所以在数据存储方面除了可靠性、容错性以外对可用性的要求自然也要认真考虑。最后选择的实现是自行开发了一个分布式存储系统。 一.分布式缓存的实现 为了简化用户端的使用,提供了一个分布式缓存系统来提供对此分布式存储系统的访问接口以及本地数据缓冲以降低网络压力。 分布式缓存使用自行开发的带流控的组播UDP消息传递系统做底层的数据传送。包括Sever和Client两个组件,Cache_Server运行在FS(文件服务器)主机上,Cache_Client运行在提供用户访问接口的UA(用户代理)主机或其它需要数据服务
2、的主机上。Cache服务定义了11个消息:Request,Rename,Update,Lock,Freeze,RequestFile,TransFile,FileTransMessage(包括请求与传送),FSLive,Backup。其中Request,Rename,Update用于Cache_Client向Cache_Server请求数据服务,Lock用于Cach之间的锁操作,Freeze,RequestFile,TransFile,FileTransMessage用于传送文件,FSLive用于Cache_Server向Cache_Client发布当前可用FS的信息,Backup
3、实现数据文件的备份。 其中FileTransMessage消息将启用另外的一个消息传递类使用独立的组播地址进行传送,只由文件发送方与待接收方使用以避免对其它的Cache用户造成干扰。文件本身被划分为8K大小的块进行传递,每个块进行MD5校验。如果是传递数据文件,FS会冻结所有的写操作同时发布Freeze消息并启动一个数据日志来保存所有的写操作,等文件传送完毕再重新导入所有的写操作。为了防止FS在导入数据日志时突然崩溃而引起数据不一致,FS使用了数据时标用于表示数据的新旧程度。 Cache_Server和Cache_Client都实现了一个Hash树,用于缓存常用数据,基于LRU
4、算法进行管理。 数据修改操作会发布到所有的Cache中进行修改,而读操作则使用了负载均衡策略根据FS的CPU/Memory负载概率性的挑选请求服务的FS,也就是说CPU/Memory负载越高的FS被选中的概率越小。如果FS发布了Freeze命令,则Cache_Client会将该FS从当前活跃的FS列表中删除,当前活跃的FS的有效性为收到FSLive命令后的70s内,而FSLive消息每30s发送一次。 二.分布式锁的实现 FS只是负责数据存储,对数据的使用不进行任何承诺,所以必须提供锁功能来进行数据访问的保护,当然也可以提供给其它模块或用户程序进行系统/用户资源的保护。当用户
5、程序不遵守自己的锁协议时可能会造成意外,但FS绝不会去介入数据的管理。 锁所占用的资源包括一个锁名、一个用于确认是否可以对锁进行操作的认证字和当前拥有锁的主机ID列表。对锁的实现不区分共享锁(读锁)还是互斥锁(写锁),由用户程序自己定义锁协议来自行解决资源访问的权限问题。 锁的存活时间只有5秒,如果没有持续的Lock动作则5s后自动释放。当发生锁冲突时(即同名锁本机已分配又从网络收到其它发布的同名锁但认证字不同)就会先释放锁,如果是本机加的锁则还会执行一个强制锁冲突(向网络发布该锁)后并通知客户程序。 三.数据日志的实现 当需要同步数据文件、备份数据文件时,都需要冻结对数据
6、文件的写操作,所以针对此期间的数据修改(增、删、改、改名)都需要建立一个数据日志,将数据修改操作保存下来,等数据文件同步、备份操作完成后再将数据日志导入。要考虑到在执行数据日志导入的同时如果还有数据写操作发生该如何处理。由于时间仓促,本系统暂时使用了多份数据日志的方案而没有使用管道。 数据日志本质上就是一个文件,其中的格式按TLV(类型/长度/值)方式进行定义即可。 四.事务的实现 有了锁也有了数据日志,所以很容易就实现了事务(Transaction)处理的功能。其本质就是把对数据的访问接口封装起来,读操作直接进行而数据修改操作则保存到事务处理的数据日志中,当最终mit时再一
7、次性的把所有数据修改变现。当然在mit之前用户也可以随时Cancel掉本事务。 事务处理中最关键的是锁协议的定义。读锁(共享锁)使用1作为锁的认证字,而写锁(互斥锁)则使用2--int.maxvalue之间的一个随机数作为认证字。同时约定,通过事务进行的所有操作都必须拥有相应的锁,也就是说即便是只通过事务读也必须为其申请读锁才能够读取到数据。当然锁操作是被封装到事务处理的实现中,用户程序只需要定义需要访问的数据并指出其权限即可。 用户在使用事务处理时必须先定义需要
此文档下载收益归作者所有