凤冈县住房和城乡建设局网站,会宁网站建设公司,找网站公司企业备案,wordpress inLecture 2-RPC and Threads
Go语言在多线程、同步#xff0c;还有很好用的RPC包 《Effective Go》 线程是实现并发的重要工具 在分布式系统里关注多线程的原因#xff1a;
I/O concurrencyParallelismConvenience Thread challenges 用锁解决race问题 Coordination channel…Lecture 2-RPC and Threads
Go语言在多线程、同步还有很好用的RPC包 《Effective Go》 线程是实现并发的重要工具 在分布式系统里关注多线程的原因
I/O concurrencyParallelismConvenience Thread challenges 用锁解决race问题 Coordination channels sync.condition variables wait group Deadlock 用来减少竞争 在Go里面我们有自动化工具来检测race
go run -race cralwer.goLecture 3-GFS
Big storage 论文 Why hard 设计分布式系统都是为了得到更好的综合性能-就是把大量的数据分片然后分配到几台计算机上面-总是有几台计算机会出小问题我们需要自动化的工具去纠正它-fault-tolerant(ft) system-引出容错这个话题-需要replication至少有两份数据-可能会遇到奇怪的不一致问题inconsistency-如果要保持一致性consistency开销就会变大 Strong consistency 单个服务器的容错能力很差 BAD REPLICATION DESIGN 2台server每一个都有一块磁盘里面都有一个key-value表 如果要容错的话key-value表得保持一致也就意味着write操作得被每一个服务器处理read就只能和一台服务器打交道了否则无法容错因为假如和2台打交道失去一台服务器read就无法正常进行了 GFS 2003年提出 1. Big、Fast file system, 2. Global: 需要覆盖在整个数据中心上各种应用程序都可以从上面读数据 3. Sharding每一个文件都自动被GFS分割到许多server上面这样如果有多个用户读取的时候吞吐量会变得很大 4. Automatic recovery 一个GFS只运行在Single data center GFS是内部使用的Google只会出售基于GFS的服务GFS是为大型顺序文件以多种方式读写而设计的比如说处理GB、TB这样大小的文件只处理顺序访问不处理随机访问。GFS没有花费过多精力让延迟变得更低而是关注巨大的吞吐量 Master保存有从文件名到数据存储位置的映射实际是有两张表。然后还有许多的chunk server块服务器即CS、CS、CS…… Master Data 表一file name-array of chunk handles/chunk IDs(chunk handles/chunk IDs肯定是要保存到磁盘中的所以是NV-non-volatile,非易失) 表二handle-list of chunk serversvolatile version(NV) primaryV lease expiration(合约过期时间) 所有的master在磁盘上都有一个log任何时候有数据变更就会在磁盘上的日志追加一个条目并定期创建checkpoint-所以master的读写速度不会很快因为ta需要把更新的信息写到磁盘中可以使用b-tree和hash技术 假如说master宕机了必须重建它的状态此时会把log弄一个快照保存到磁盘中 READ应用程序知道一个file name和一个想从某一个位置读取的offset所以应用程序会把file name和offset发送给mastermaster从表里面读取文件名 1. send name and offset-master 2. master send chunk handle(记为H)和server列表给客户端客户端cache这些结果 3. client和chunk server之一进行通信chunk server返回data给client WRITE:客户端的lib有一个file name和一段想写的字节数据客户段会发送追加数据的请求给master并且要求告知这个文件的最后一个chunk在哪儿 1 case: no primary,master需要找出具有最新chunk副本的chunk服务器集合-up-to-date-所以version必须是NV保存在磁盘中的这样version在崩溃中丢失的时候master才能正确识别哪些chunk是最新的-pick one to be primary,其他的作为secondary servers-master将版本号递增并将其写入磁盘-将这个信息以及版本号告诉primary和secondaryprimary和secondary节点都将版本号写入磁盘-primary picks offsetall replicas including the primary are told to write offset-如果所有的副本都发送了yes给primaryprimary会回复success给客户端如果有一个secondary发送错误信息给primaryprimary就会回复no给clientclient应该重新发起整个追加过程