110 likes | 210 Views
基于 tokyo cabint 的简单分布式数据库的实现( Griddb). 梁小龙 & 唐星宇. 一 项目概述. 1. 项目目标 该项目主要是基于 tokyo cabinet 数据库来设计一个简单的分布式数据库系统,客户端能够通过一些简单命令来并发访问服务器,实现 key-value 形式数据的存取。 主要操作包括 open db 、 close 、 set key value 、 get key value 。. 2. 项目技术点 该项目需要用到的技术点大致有以下几点: Linux 下的基于 C 语言的 socket 编程
E N D
基于tokyo cabint的简单分布式数据库的实现(Griddb) 梁小龙&唐星宇
一项目概述 • 1. 项目目标 • 该项目主要是基于tokyo cabinet 数据库来设计一个简单的分布式数据库系统,客户端能够通过一些简单命令来并发访问服务器,实现 key-value 形式数据的存取。 • 主要操作包括 open db、close、set key value、get key value。
2. 项目技术点 • 该项目需要用到的技术点大致有以下几点: • Linux下的基于C语言的socket 编程 • I/O复用技术(epoll) • 多线程并发处理技术 • 多线程互斥信号量机制(P/V操作) • Make file 自动编译功能 • 服务器的分布式存储数据技术(hash函数)
二系统总体架构 总体拓扑结构图
客户端、服务器端与master服务器的交互图 当服务器打开时,将会与master服务器建立连接,并将自己的ip地址、端口号等信息发给master服务器。Master服务器则保存该信息。客户端创建数据库时先从master服务器取得服务器端信息。
三系统功能模块设计 当客户端用户输入一个命令时,客户端程序将自上往下的进行流程处理,然后将封装好的命令发送至服务器端;服务器端接收到命令后则进行自下往上的处理流程,将任务插入到队列中,然后随机分配给一个线程处理,线程则执行一个命令解析模块识别出命令并操作数据库进行处理,自上往下返回处理结果,最终通过socket发送至客户端显示。
系统主要功能模块分析 • 分布式服务器信息加载模块(clouddbapi.c) • Open 操作时将会与master服务器建立连接 • Master服务器把集群后的数据库服务器信息分条发送至客户端 • 客户端对于每一条服务器信息提取出ip/port加入到链表中 • 客户端遍历链表分别与每个服务器建立连接 • Close操作时将会以相同方式与每个服务器断开连接 • Set等操作时,会通过hash取余后的值选择链表的第几个服务器结点并将命令发送至该服务器进行操作
服务器端任务分配模块(servernew.c) • 初始建立三个线程等待处理客户端发送来的消息 • 线程之间采用mutex互斥锁来解决互斥问题 • 采用同步信号量机制来实现主线程与其他线程的同步 • sem_post V操作表示通知该线程有消息待处理 • sem_wait P操作表示线程查自己是否有待处理消息 • 线程中主要调用ServerProcess函数进行消息处理
服务器端socket发送接收模块(serversocket.c) • 加入了epoll这种I/O复用机制 • 通过epoll对sockfd进行监听 • 并对建立连接后的new_fd进行监听 • 如果遇到新的new_fd则加入到新的监听任务中 • 如果是对应的某个已监听的new_fd接收到的数据则将该数据交予上层进行处理 • 该模块还有打开服务器时与Master服务器建立连接主动发送服务器信息的功能 • 回送给客户端的处理信息为封装的字符流
远程命令封装解析模块(remotedbapi.c) • 客户端对命令仅判断正确性,并不做处理 • 交付下来的命令只做简单字符流封装 • 建立数据库时,服务器端返回的是db索引值 • 发送数据时,将该索引值封装入字符流 • 索引值可以区分对不同的数据库操作
致谢 谢谢大家! 谢谢老师的指导以及搭档的合作!