欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    ChunkServer系统结构详细设计.docx

    • 资源ID:279646       资源大小:191.05KB        全文页数:47页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    ChunkServer系统结构详细设计.docx

    1、ChunkServer系统结构详细设计ChunkServer系统结构详细设计编号文档版本修订章节修订原因修订日期修订人10.1全文新建2010-8-04曲山20.22.5.6修改Tablet子系统接口2010-8-10曲山30.32.6.2.2修改SSTableReader子系统2010-8-16段飞4042.6.2.2修改SSTableReader子系统2010-8-17段飞51.0all根据后续调整修改文档2010-10-28曲山1 系统设计1.1 系统综述ChunkServer存储系统所有表的静态数据部分,CS采用SSTable的形式存储表数据,按行排序好后存储。每个数据存储单位,称为T

    2、ablet,每个Tablet大小相当,负责一个表中某个范围内的数据。每个Tablet会复制为至少3个备份存放在不同的CS上。ChunkServer还需接收UpdateServer的补丁文件,与本地的静态数据进行合并。1.2 名词解释 OB:全称OceanBase,核心系统研发部的海量存储系统,一期解决淘宝的收藏夹应用;UPS:全称Update Server,OB系统更新子系统,通过主备保证可靠性;CS:全称Chunk Server,OB静态表系统,存储每天合并UPS更新数据生成的静态表;MS:全称MergeServer,OB系统中负责合并CS数据和UPS数据,形成最终结果返回给客户。MemTa

    3、ble:内存表,UPS内存中通过MemTable实现每天更新数据的组织和查询。根据是否冻结又可区分为frozen Memtable和active Memtable;SSTable: static sorted table, 一个表格在某个范围某段时间内的数据。目前ChunkServer上的只保存SSTable数据Tablet: 一个表格的的某个range全量数据SSTable + MemTableCommit Log:操作日志,UPS为了保证可靠性,首先将更新操作序列化到主备机的文件中,称为操作日志;API:全称client API,客户端通过API访问OB系统,UPS也可通过API访问CS静

    4、态表数据;UPS Master(Master):全称Update Server Master,处理实际读写请求的Update Server;UPS Slave(Slave):全称Update Server Slave,用于实时备份的Update Server;1.3 性能指标 假设:16核Intel(R) Xeon(R) CPU E5520 2.27GHz ,24GB内存,300GSAS * 6硬盘,3000W条记录,平均大小为300字节(假设100字节的收藏夹单条记录膨胀3倍)。读性能:单机读取并发量 100/s,4个9的读取操作延时 30MB/s;1.4 系统结构 表数据被切分成Table

    5、t以后(大小相当),拷贝三份并均衡分布存储在不同的CS上。客户端所有的查询请求,都先通过RootServer找到对应的CS后,在指定的CS读取具体的数据,会找到CS对应的MergeServer ,MergeServer会挑选一台距离最近,数据最新的CS进行查询,然后根据CS返回数据的版本,从UPS上取更新的数据进行合并后返回给客户端。2 子系统设计2.1 子系统划分 ChunkServer在逻辑上划分为如下子系统:网络处理子系统:负责网络数据的接收和发送,数据的解包,打包。 任务队列子系统:处理网络子系统接收到的数据包,进行任务排队和任务调度。接口子系统:将任务队列里面的请求包,判定请求类型,

    6、检查参数合法性,并分解为对其他子系统的功能调用。接口子系统还包括CS对外部系统的调用接口,比如汇报tablets,心跳信息,对UpdateServer的调用。Tablet子系统:Tablet定位、查询对应SSTable的数据,并查询UPS中Memtable中的数据与之合并。同时根据schema中的join规则进行合并。SSTable子系统SSTable数据读取、SSTable文件的生成(按照SSTable的格式)以及in-memory的SSTable实现等Cache子系统管理系统中所有需要内存化的数据,提供淘汰机制。每日合并子系统:将CS上的SSTable静态数据与UPS上的动态更新数据做一个

    7、全量的合并,合并以后生成新的SSTable文件。2.2 网络处理子系统2.2.1 子系统描述负责网络数据的接收和发送,并将接收到的数据解包反序列化为系统定义的消息,另外也负责将调用远程接口的数据包序列化为数据流并发送给远端。网络子系统需要自己管理多个Connection,(包括一个被动Accetpor和多个数据链接),并处理这些Connection上的事件(网络事件和超时事件).当网络子系统从网络上接收到数据时,会将数据读入自己的缓冲区,然后调用应用提供的解包接口,将网络数据解包为消息包,交给任务队列处理。应用处理完消息以后,将响应包发给网络子系统,网络子系统推入消息发送队列,然后调用应用的序

    8、列化接口将包序列化为字节流,拷入自己的发送缓冲区,发送给网络。2.2.2 子系统接口目前的网络处理子系统使用tbnet,沿用原有的处理接口。/* * 解包打包接口 * */class ObPacketStreamer public: /* * 读取包头,判断包长度 * param in input, socket读入数据缓冲 * param in header, 根据输入字节流解析包头信息 * param out broken, 包是否合法 */ virtual bool get_packet_info(const ObDataBuffer* input, ObPacketHeader* he

    9、ader, bool& broken); /* * 反序列化,解析一个数据包 * param in input, socket读入数据缓冲 * param out header, 上一个接口解析的包头信息 * return 返回解析好的包对象 */ virtual ObPacket* decode(const ObDataBuffer* input, const ObPacketHeader* header); /* * 序列化一个数据包 * param in packet 需要序列化的包对象 * param out output 序列化字节流缓冲区 */ virtual ObPacket*

    10、encode(const ObPacket* packet, ObDataBuffer* output);/* * 事件处理接口 * */class ObServiceHandler public: virtual int handle(const ObPacket* packet) = 0;2.3 任务队列与工作线程池2.3.1 子系统描述任务队列负责接收网络子系统接收到的包,而工作线程池是在任务队列上等待的一组执行线程,每一组(个)线程等待一个任务队列,一旦任务队列中有包,则当前空闲的线程便将消息包取出,交给特定的应用逻辑去处理。当任务队列空的时候,所有的线程在队列上等待;当任务队列满以后

    11、,线程池中所有的队列都在忙于处理任务,如果网络子系统有新的包需要处理,则任务队列会选择将该包丢弃,或是直接返回用户繁忙。在ChunkServer中,所有的请求包都推入到系统唯一的任务队列,有工作在上面的一组工作线程处理。2.3.2 任务队列2.3.2.1 模块描述任务队列是一个先进先出队列,用于网络请求的排队,所有的网络数据包,经过网络子系统的处理以后,都会转化为消息包的形式,为了避免阻塞网络子系统,提高系统响应速度和吞吐量,这些消息包并不会立即在网络子系统的接收线程中进行处理,而是先进入任务队列进行排队,等待工作在任务队列上的工作线程池进行处理。任务队列在空的状况下,系统空闲,无任务可以处理

    12、,所有工作线程池中的线程都阻塞等待任务进入队列,当任务队列满的情况下,工作线程池中所有线程都在等待,无法处理处理此请求,此时,要么将此消息包丢弃(直接返回客户端系统繁忙),要么将队列前端的任务丢弃;2.3.2.2 对外接口/* * 任务队列,先进先出队列 * 网络上收到的消息包,先放入任务队列, * 然后由工作在任务队列上的线程池来处理。 */class ObTaskQueue public: /* * 将消息压入队列 * param in packet 压入的消息包 * return 压入是否成功 */ bool push(const ObPacket* packet); /* * 从队列中

    13、取出一个消息包 * return 消息包的指针 */ const ObPacket* pop(); /* * 判断任务队列是否为空 */ bool empty(); /* * 判断任务队列是否满 */ bool full(); /* * 队列当前的长度 */ int32_t size() const;2.3.3 工作线程池2.3.3.1 模块描述CS系统有一个任务队列,并有一个工作与其上的工作线程池,所有的工作线程都在等待任务队列里面新的任务消息包,一旦有消息包进入任务队列,将有一个线程被唤醒,并从任务队列中取出一个消息包,交给应用提供的handler去处理。消息处理完成以后,该线程重新开始等

    14、待任务队列中新的任务消息包。2.3.3.2 对外接口/* * 线程池消息包处理接口 */class ObThreadPoolPacketHandler public: virtual int handle(const ObPacket* packet, void* args) = 0;class ObThreadPool public: /* * 初始化线程池 * param thread_count 线程个数 * param handler 事件处理对象 * param args 附带参数 * return */ int set_parameter(int32_t thread_count,

    15、 ObThreadPoolPacketHandler* handler, void* args); /* * 将一个消息交给线程池处理,线程池会将其加入到自己维护的任务队列当中 * param in packet 需要处理的消息包 * return 处理是否成功 */ int push(const ObPacket* packet); /* * 线程池启动 */ void start(); /* * 线程池停止运行 */ void stop(); /* * 等待线程池结束工作 */ void wait(); private: ObTaskQueue * task_queue_; ObThrea

    16、dPoolPacketHandler * handler_;2.3.4 子系统接口该子系统实现网络子系统的消息处理接口,把所有的消息包压入自己内部的任务队列。class TaskQueueSubSystem : public ObServiceHandler public: virtual int handle(const ObPacket* packet);2.4 接口子系统2.4.1 子系统描述将任务队列里面的请求包,判定请求类型,检查参数合法性,并分解为对其他子系统的功能调用。接口子系统还包括CS对外部系统的调用接口,比如汇报tablets,心跳信息,对UpdateServer的调用。接

    17、口子系统还需要处理与RootServer的心跳与租约。接口子系统提供一个处理消息包的handler,供任务队列的线程池调度运行。工作线程池从任务队列中拿到一个包,然后交给接口子系统的handler进行处理。接口子系统中的服务接口分为很多类,每一类服务接口由一组线程池来处理。(比如查询服务接口处理线程池,控制命令接口处理线程池)2.4.2 对外服务接口2.4.2.1 描述主要处理客户端或是其他系统发送过来的查询请求,控制命令。该模块实现一个线程池系统的handler接口,供上层线程池在处理消息包的时候处理具体的消息包,根据消息包的类别,该模块会将消息包的参数进行检查,分解,或是转化为其他子系统的

    18、调用,来实现服务功能。2.4.2.2 对外接口这个接口实现任务队列子系统的事件处理接口。class ChunkServerServiceHandler : public ObThreadPoolPacketHandler public: int handle(const ObPacket* packet, void* args);对于不同的服务接口类型,有不同的处理逻辑,将在handle中判断包类型分发到其他子系统进行处理。2.4.3 外部调用接口2.4.3.1 描述CS与其他系统进行交互的接口,通常是以远程调用的方式进行,外部调用接口模块负责封装对其他子系统的调用,并处理返回结果,对于CS内

    19、部来说,调用调用接口模块所提供的服务,就与本地函数调用一样。2.4.3.2 对外接口2.4.3.2.1 向RootServer汇报数据/* ChunkServer向RootServer汇报其管理的tablets;* param in server 汇报的ChunkServer* param in tablets 管理的所有tablets信息*/ObResultCode report_tablets(const Server & server, const int64_t memtable_version, const TabletReportInfoList & tablets);/* Chu

    20、nkServer向RootServer汇报Tablets结束* param in server 汇报的ChunkServer* param in timestamp, 汇报的tablets的schema版本信息*/ObResultCode report_tablets_over(const Server & server, const int64_t memtable_version);/* ChunkServer向RootServer注册* param in server 汇报的ChunkServer* param in status = 0 表述系统初次启动 status = 1系统已经启

    21、动*/ObResultCode register_self(const Server & server, int32_t& status);/* ChunkServer向RootServer汇报磁盘容量信息* param in server 汇报的ChunkServer* param in total_capacity 总的容量* param in total_used 总的使用容量*/ObResultCode report_capacity_info(const Server & server,const int64_t total_capacity, const int64_t total

    22、_used);2.4.3.2.2 获取当前最新的schema/* * 总是获取最新的schema* param out schema 最新的schema信息*/ObResultCode fetch_schema(const int64_t version, ObSchemaManager& schema);2.4.4 心跳与租约2.4.4.1 描述CS启动时,会向RootServer发送一个注册信息,RootServer会返回一个状态:status = 0, 表示整个系统是初次启动,这时RootServer会等待系统中所有的CS都注册以后,才开始进行手工启动。CS这时需要等待RS的初始启动命令

    23、。status = 1, 表示系统已经启动过了,CS是重启(或是第1次加入系统),这时CS会加载本地已有(如果有的话)的tablets,并向RS进行汇报。一旦注册成功,RS会向所有的CS发送心跳信息,CS在接收到RS的消息以后需要更新自己的租约,如果租约没有过期,才可以对外提供服务。2.4.4.2 对外接口2.4.4.2.1 RootServer心跳/* * RootServer向ChunkServer发送心跳,传递租约信息* param in lease_duration 租约时常*/ObResultCode cs_heart_beat(const int64_t lease_duratio

    24、n);2.5 Tablet子系统2.5.1 子系统描述Tablet定位、查询对应SSTable的数据。 Tablet子系统从接口子系统接收到派发分解过来的查询需求,首先定位到指定的Tablet,查询委托给具体的Tablet进行查询。Tablet查询分两块,一部分是静态数据查询,也就是本地SSTable的查询,交给SSTable子系统处理。另一部分是查询UPS发送过来的sstable patch files。其中sstable patch files的数据查询的输入依赖于SSTable查询的结果,需要在SSTable查询完成以后进行。最后Tablet会将两块查询结果按照Schema进行Merge

    25、与join操作,得到最后的结果后返回给用户。Tablet子系统中分为几个部分,TabletManager负责管理和定位所有的Tablet对象,Tablet本身负责管理自身拥有的SSTable(目前只有一个),TabletScanner负责查询以及合并数据,返回查询结果。2.5.2 TabletManager2.5.2.1 模块描述TabletManager用于管理CS中所有的Tablet对象,其自身维护两个hashtable,一个是当前服务的Tablets hashtable,一个是正在进行合并的Tablets hashtable;(这个hashtable只有在合并期间才有内容)2.5.2.2

    26、 对外接口 TabletManager需要提供查询接口,根据sstabe_file_id查找到指定的tablet对象;在每日合并子系统在进行合并操作时,需要提供扫描接口遍历所有的Tablet,而且在合并成功后需要提供接口Load指定的SSTable,生成Tablet对象。另外,当RootServer完成切换以后,会通知CS切换到新表服务,CS会将老的Tablets全部卸载,(或是分批卸载,用老表服务客户端的缓存一段时间);对所有的请求用新Tablets进行服务,TabletManager需要提供一个接口完成这个过程。class TabletManagerpublic: /* * 查找一个tab

    27、let对象 * param in range 查询Tablet对应的范围信息 * param in sstable_file_id SSTable的文件id, * param out tablet 找到的Tablet对象,如果没有找到,置为NULL * param type 找到的Tablet对象的类型,是前天的老数据还是新的合并数据,这个类型决定查找UPS数据的类型 * return 0 找到, otherwise 没有找到,或是找到以后与要求的Range不符合 */ int get_tablet(const Range& range, uint64_t sstable_file_id, c

    28、onst Tablet* &tablet) const; /* * 根据sstable路径,装载一个SSTable,并生成一个Tablet对象, * param in range 查询Tablet对应的范围信息 * param in sstable_file_id SSTable的文件id, * param in path sstable文件的路径 * param in type 是合并后的表还是初次初始化扫描的表 * param out tablet 生成的Tablet对象,如果没有找到,置为NULL * return 0 装载成功 */ int load_tablet(const Rang

    29、e& range, uint64_t sstable_file_id, const ObString& path, const int32_t type, const Tablet* &tablet); /* * RootServer切换到新的RootTable以后,通知ChunkServer进行切换 * 这时所有的新Tablet已经装载完毕.卸载所有的老表(或是分批) */ int switch_to_new_tablets();2.5.3 Tablet2.5.3.1 模块描述概念上来讲,一个Tablet就是一个Table在某个Range之间的全部数据,而这些数据分为俩个部分,一部分是静态数

    30、据,存放在本地的SSTable,(每隔一段时间刷新一次,目前在CS中,SSTable每隔一天刷新一次,而且是刷新的同时即时合并,所以SSTable只有一个),另外一部分是内存中的动态数据,存放在远程的UPS上。2.5.3.2 对外接口class Tabletpublic: SSTable* get_sstable() const; int64_t get_time_stamp() const; const Schema* get_schema() const; /* * 创建一个Scanner对象对本Tablet进行数据查询 * param in scan_param 查询参数,包括查询的范围,条数限制,要查询的列 * r


    注意事项

    本文(ChunkServer系统结构详细设计.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开