[转]SequoiaDB 笔记
这几天翻了翻SequoiaDB的代码,记了点笔记。不保证下面内容的正确性(肯定有错的地方) 个人观感 八卦&吐槽 综述
系统架构
在单个数据节点中的体系结构如下: 对外接口 数据模型 存储模型 一致性和持久性 一致性 对比 1.实现了行级锁,相对mongoDB极大的改善了插入性能,一些测试报告 也证明了这一点。 VS FounderXML 事务。换到的是相对简单的设计(C:SequoiaDB支持到read uncommit,比完全不支持好那么一点点),不用引入复杂的Postgresql或其的事务数据库/引擎。当然可以自己开发一个,嗯,这么天才的主意还是算了吧。 其它和代码相关的 /* _IControlBlock define */ class _IControlBlock : public SDBObject,public _ISDBRoot { public: _IControlBlock () {} virtual ~_IControlBlock () {} virtual SDB_CB_TYPE cbType() const = 0 ; virtual const CHAR* cbName() const = 0 ; virtual INT32 init () = 0 ; virtual INT32 active () = 0 ; virtual INT32 deactive () = 0 ; virtual INT32 fini () = 0 ; virtual void onConfigChange() {} } ; typedef _IControlBlock IControlBlock ; 代码入口 void _pmdController::registerCB( SDB_ROLE dbrole ) { if ( SDB_ROLE_DATA == dbrole ) { PMD_REGISTER_CB( sdbGetDPSCB() ) ; // DPS PMD_REGISTER_CB( sdbGetTransCB() ) ; // TRANS PMD_REGISTER_CB( sdbGetClsCB() ) ; // CLS PMD_REGISTER_CB( sdbGetBPSCB() ) ; // BPS } else if ( SDB_ROLE_COORD == dbrole ) { PMD_REGISTER_CB( sdbGetTransCB() ) ; // TRANS PMD_REGISTER_CB( sdbGetCoordCB() ) ; // COORD PMD_REGISTER_CB( sdbGetFMPCB () ) ; // FMP } else if ( SDB_ROLE_CATALOG == dbrole ) { PMD_REGISTER_CB( sdbGetDPSCB() ) ; // DPS PMD_REGISTER_CB( sdbGetTransCB() ) ; // TRANS PMD_REGISTER_CB( sdbGetClsCB() ) ; // CLS PMD_REGISTER_CB( sdbGetCatalogueCB() ) ; // CATALOGUE PMD_REGISTER_CB( sdbGetBPSCB() ) ; // BPS PMD_REGISTER_CB( sdbGetAuthCB() ) ; // AUTH } else if ( SDB_ROLE_STANDALONE == dbrole ) { PMD_REGISTER_CB( sdbGetDPSCB() ) ; // DPS PMD_REGISTER_CB( sdbGetTransCB() ) ; // TRANS PMD_REGISTER_CB( sdbGetBPSCB() ) ; // BPS } else if ( SDB_ROLE_OM == dbrole ) { PMD_REGISTER_CB( sdbGetDPSCB() ) ; // DPS PMD_REGISTER_CB( sdbGetTransCB() ) ; // TRANS PMD_REGISTER_CB( sdbGetBPSCB() ) ; // BPS PMD_REGISTER_CB( sdbGetAuthCB() ) ; // AUTH PMD_REGISTER_CB( sdbGetOMManager() ) ; // OMSVC } //Data Management Service Control Block //This file contains code logic for data management control block,which is the metat// data information for DMS component. // 包括collection space等 PMD_REGISTER_CB( sdbGetDMSCB() ) ; // DMS // 和context相关,create和delete context PMD_REGISTER_CB( sdbGetRTNCB() ) ; // RTN // SQL PMD_REGISTER_CB( sdbGetSQLCB() ) ; // SQL // 集合 PMD_REGISTER_CB( sdbGetAggrCB() ) ; // AGGR //启动服务器/rest服务器/管理sessionInfo PMD_REGISTER_CB( sdbGetPMDController() ) ; // CONTROLLER } 可调度单元(EDU) rc = pEDUMgr->startEDU( EDU_TYPE_TCPLISTENER,(void*)_pTcpListener,&eduID ) ; 其定义为: // 根据type,启动一个线程(实际比这个复杂),把参数传递进去,并把eduid返回 INT32 _pmdEDUMgr::startEDU ( EDU_TYPES type,void* arg,EDUID *eduid ) 系统会在启动一个线程,并调用pmdTcpListenerEntryPoint函数。 static const _eduEntryInfo entry[] = { ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_SHARDAGENT,FALSE,pmdAsyncSessionAgentEntryPoint,"ShardAgent" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_COORDAGENT,pmdAgentEntryPoint,"CoordAgent" ),// 最终调用_pmdDataProcessor::processMsg处理每条,顺便提一句这里有所有命令的列表 ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_AGENT,pmdLocalAgentEntryPoint,"Agent" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_REPLAGENT,"ReplAgent" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_HTTPAGENT,pmdHTTPAgentEntryPoint,"HTTPAgent" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_RESTAGENT,pmdRestAgentEntryPoint,"RestAgent" ),// 端口监听 ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_TCPLISTENER,TRUE,pmdTcpListenerEntryPoint,"TCPListener" ),// rest监听 ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_RESTLISTENER,pmdRestSvcEntryPoint,"RestListener" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_CLUSTER,pmdCBMgrEntryPoint,"Cluster" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_CLUSTERSHARD,"ClusterShard" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_CLSLOGNTY,pmdClsNtyEntryPoint,"ClusterLogNotify" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_REPR,pmdAsyncNetEntryPoint,"ReplReader" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_LOGGW,pmdLoggWEntryPoint,"LogWriter" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_SHARDR,"ShardReader" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_PIPESLISTENER,pmdPipeListenerEntryPoint,"PipeListener" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_BACKGROUND_JOB,pmdBackgroundJobEntryPoint,"Task" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_CATMAINCONTROLLER,"CatalogMC" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_CATNODEMANAGER,"CatalogNM" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_CATCATALOGUEMANAGER,"CatalogManager" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_CATNETWORK,"CatalogNetwork" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_COORDNETWORK,pmdCoordNetWorkEntryPoint,"CoordNetwork" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_DPSROLLBACK,pmdDpsTransRollbackEntryPoint,"DpsRollback"),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_LOADWORKER,pmdLoadWorkerEntryPoint,"MigLoadWork" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_PREFETCHER,pmdPreLoaderEntryPoint,"PreLoader" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_OMMGR,"OMManager" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_OMNET,"OMNet" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_SYNCCLOCK,pmdSyncClockEntryPoint,"SyncClockWorker" ),ON_EDUTYPE_TO_ENTRY1 ( EDU_TYPE_MAXIMUM,NULL,"Unknow" ) }; 内存管理 查询执行 1.rtnQuery 完成查询计划的build(查询优化似乎做了一些事情,还没来得及细看),定位到第一个结果处。 操作系统封装 在OSS中封装了常见的系统调用,比如read,create,open,malloc之类的。btw,有的文档中只列出了linux支持的版本,从代码上看windows应该也是支持的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |