分布式系统作业2


作业要求

给定一个查询初始化虚拟机和 N(如 6)个存储虚拟机,其中 N 个虚拟机负责分布式存储上 述 dblp.xml 片段文件,查询初始化虚拟机负责发送一个查询请求,协调 N 个虚拟机,完成 如下查询功能需求:

给出输入条件:作者名字 author 如 Ion Stoica,返回作者的 DBLP 发表论文总数。

实现

存储负载均衡

因为dblp.xml文件较大, 为了加快切分时间, 这里没有采取按每个文章切分而后随即分配, 而是采用直接将源文件线性切分为N份(N为存储机数量), 而后分到N台存储虚拟机中

文件分发

使用java实现socket通信, 通过建立TCP通信来连接数据服务器和存储虚拟机,而后发送切分好的文件给存储虚拟机

网络通信

同样使用java实现的socket通信, 客户端先建立与数据服务器的TCP连接, 而后发送查询姓名, 服务端计算出姓名作为作者出现的频次后返回给客户端, 客户端整合后生成日志

查询容错设计

采用副本存储方式, 每台虚拟机的数据会在另一台虚拟机存放一份副本, 当主机down时, 客户端会给副本服务端发送请求, 获得数据

性能优化

在查询时, 为了发挥分布式存储的优势, 客户端发送请求时采用多线程实现方式, 可以让多个服务端同时运作

使用

数据分发

  1. 将dataServer和dataProcess文件夹传到数据服务器上, 将server文件夹拷贝到每个存储机上(SearchServer.java只需要一份, 重复的文件是为了单机多端口模拟多个端, 根据实际情况进行删减)
  2. 源文件dblp.xml放入src/dataProcess路径下,
  3. 修改上述路径下dataProcess.sh文件, 将remoteCount改为存储虚拟机个数,
  4. 运行该脚本进行文件切分
  5. 修改src/dataServer/DataSend.java中, main函数内部的ip为存储机ip(根据个数添加或删除代码)
  6. 先运行数据服务器的DataSend.java, 在运行每个存储机的DataReceive.java

查询

  1. 将client文件夹传输到查询服务器上
  2. 修改client/SearchClient.java中, main函数内部的ip为存储机ip(根据个数添加或删除代码)
  3. 先运行每个存储机的SearchServer.java文件, 在运行查询客户端的SearchClient.java文件
  4. 标准输出流会输出查询过程, 查询结果也会存放在日志中