基于内存的NoSQL分布式数据库技术研究项目测试方案v10.docx
- 文档编号:25979136
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:12
- 大小:161.32KB
基于内存的NoSQL分布式数据库技术研究项目测试方案v10.docx
《基于内存的NoSQL分布式数据库技术研究项目测试方案v10.docx》由会员分享,可在线阅读,更多相关《基于内存的NoSQL分布式数据库技术研究项目测试方案v10.docx(12页珍藏版)》请在冰豆网上搜索。
基于内存的NoSQL分布式数据库技术研究项目测试方案v10
基于内存的NoSQL分布式数据库技术研究项目
测试方案
一、目的
研究一种新的快速存储与访问机制,改善内存使用的现状,同时要保证软件架构上不做大的改动,性能没有明显下降。
研究分布式存储技术,优化当前的DB存储,并且研究板内、板间多进程对新存储系统访问效率。
所涉及的技术和平台,既可以运行X86平台上,也可以运行在非X86平台上。
二、测试环境搭建
1、任务文档要求
(1)每块单板一块8核X86芯片,每个核有两个超线程,可看成16个核。
(2)业务使用进程部署,每个核上分别部署1个进程;每个核上分别部署2个进程;每个核上部署的进程会有扩展的需求。
(3)板内分布式采用分布式算法将将板内所有进程构成一张全局表,每个单板的进程数目可以达到256个。
(4)板间分布式改造后可实现最大200块单板(共200*16个核,进程数目需要增加到10000个进程),系统所有进程构成一张全局表。
实际验证时,可能是由2个分布点、4个…320个…10000个逐步验证,要求每种场景下都给出对比数据。
给出性能同分布节点数的关系。
(5)板间采用xGE交换链接,该交换为无阻塞交换,可忽略其交换时延。
2、进程绑定多核运行
名词CPUaffinity:
中文称作“CPU亲和力”,是指在CMP架构下,能够将一个或多个进程绑定到一个或多个处理器上运行。
如果自己写代码,要把进程绑定到CPU,可以用sched_setaffinity函数。
在Linux上,这会触发一次系统调用。
intsched_setaffinity(pid_tpid,unsignedintlen,unsignedlong*mask);
sched_setaffinity的第一个参数是pid(进程ID),设置进程为pid的这个进程,让它运行在mask所设定的CPU上。
如果pid的值为0,则表示指定的是当前进程,使当前进程运行在mask所设定的那些CPU上;第二个参数cpusetsize是mask所指定的数的长度。
通常设定为sizeof(cpu_set_t);如果当前pid所指定的CPU此时没有运行在mask所指定的任意一个CPU上,则该指定的进程会从其它CPU上迁移到mask的指定的一个CPU上运行。
intsched_getaffinity(pid_tpid,unsignedintlen,unsignedlong*mask);
该函数获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中,即获得指定pid当前可以运行在哪些CPU上。
同样,如果pid的值为0.也表示的是当前进程。
详见文档《进程绑定多核运行》。
三、测试架构与流程
1、内存数据库与NoSQL比较
DB为内存关系数据库,cache为了加快数据访问而单独增加的表项,实际存放的是全局数据,DB和cache对应一个独立的进程,FLASH为本地化数据库。
正常业务时绝大多数是读操作,当有数据更新(修改、增加、删除)时,由其他任务完成对DB、FLASH数据库和cache的更新。
目标:
在保留当前函数调用的基础上,用NoSQL数据库替换现有“关系数据库DB+CACHE”模式,以便实现“数据库内存同核/进程/线程”的解耦合。
2、板内分布式改造
采用分布式算法将将板内所有进程构成一张全局表,每个单板的进程数目可以达到256个;从DB读写访问比例、查表行为和一致性维度进行模拟,选择达到性能要求的NoSQL数据库;并给出共享内存和分布式的对比数据,并给出一个较优的数据库。
3、板间分布式改造
系统所有进程构成一张全局表,算法不限。
实际验证时,可能是由2个分布点、4个。
。
。
320个。
。
。
10000个逐步验证,要求每种场景下都给出对比数据。
给出性能同分布节点数的关系。
给出分布节点与数据中心的核查算法。
保持同步机制,即使板间使用消息,对外接口上仍体现单一接口调用。
要考虑数据一致性,写数据生效时间小于1ms,(读写关系类似于CPUCACHE读写关系)。
4、测试流程
四、数据结构及接口设计
1.数据结构及数据库设计
(1)数据库就是一个大的顺序内存空间,按照表定义的规格规则排序;系统保存有每张表的起始位置,规格,每个表记录的长度,每个表记录每个元素的长度,表的关键字定义等等信息。
(2)数据库的规模是1000张表,每个表最大20000的记录,每条记录最大1000个字节,每个表的关键字小于10个。
(3)数据库表:
1000张表,命名为T1,T2,......,T1000;每个表有10个字段,命名为ID,field1,......,field9;每个表除主键外其它字段都是别的表的外键。
(4)数据结构:
/*缓冲结构体*/
structArray{
unsignednum;
unsignedlength;
char**point;
};
(5)全局变量:
charT[1000][10]={{"ID","field1","field2","field3","field4","field5","field6","field7","field8","field9"}...};
/*保存每个表的字段名*/
chartable_name[1000]={"T1","T2","T3"......}.;/*保存每个表的名字*/
2、接口设计
(1)创建表
intDBCreateTable(inttable_id,char*field_definition);
输入参数:
table_id新创建的表对应的table_name及T中的表的位置;
field_definition创建的表的字段名称及类型
返回值:
0操作成功;
-1操作失败。
(2)删除表
intDBDropTable(inttable_id);
输入参数:
table_id将删除的表对应的table_name及T中的表的位置;
返回值:
0操作成功;
-1操作失败。
(3)插入数据
intDBInsertData(inttable_id,int*index_list,void*P);
输入参数:
table_id操作的表对应的table_name及T中的表的位置;
index_list批量(或单个)插入数据时的关键字列表;
P指向插入用的数据;
返回值:
0操作成功;
-1操作失败。
(4)更新数据
intDBUpdata(inttable_id,int*index_list,int*field_list,void*P);
输入参数:
table_id操作的表对应的table_name及T中的表的位置;
index_list批量(或单个)更新数据时的关键字列表;
field_list要更新的字段
P指向更新用的数据;
返回值:
0操作成功;
-1操作失败。
(5)删除数据
intDBDeleteData(inttable_id,char*filter);
输入参数:
table_id操作的表对应的table_name及T中的表的位置;
filter字段过滤器;
返回值:
0操作成功;
-1操作失败。
(6)顺序查找多个数据
intDBGetAllRecords(inttable_id,int*field_list,char*filter,intdec,void*P);
输入参数:
table_id待查询的表对应的table_name及T中的表的位置;
field_list需要查找记录中的某几个字段;
filter字段过滤器;
dec查找到的数据降序(或升序)排列;
P指向查找到的数据;
返回值:
0操作成功;
-1操作失败。
(7)随机查找某个数据
intDBGetOneRecord(inttable_id,int*field_list,char*filter,void*P);
输入参数:
table_id待查询的表对应的table_name及T中的表的位置;
field_list需要查找记录中的某几个字段;
filter字段过滤器;
P指向查找到的数据;
返回值:
0操作成功;
-1操作失败。
5、测试方案
1.数据库Key、Value读写性能测试。
(1)
1 根据单关键字key,循环读取N次所消耗的时间*
intkey,table_id;
key=Key1;/*获取数据的关键字*/
table_id=T1;/*操作的数据表*/
for(i=0;i DBGetOneRecord();/*循环N次读取数据*/ 2 给定单关键字Key,Value。 写入单条数据N次所消耗的时间* intkey,table_id; char*value; key=Key1;/*写入数据的关键字*/ value=Value1/*写入数据的字段值*/ table_id=T1;/*操作的数据表*/ for(i=0;i DBInsertData();/*循环N次写入数据*/ 3 给定单关键字Key,value。 更新单条数据N次所消耗的时间* intkey,table_id; char*value; key=Key1;/*更新的数据关键字*/ value=Value1/*更新的字段值*/ table_id=T1;/*操作的数据表*/ for(i=0;i DBUpdata();/*循环N次更新数据*/ (2) 1 根据关键字列表,读取随机的N条数据所消耗的时间* int*key,table_id; table_id=T1;/*操作的数据表*/ /*待读取N条数据的关键字*/ for(i=0;i key[i]=Keyi; DBGetALLRecord();/*随机读取N条数据*/ 2 给定Key,Value对列表,写入N条数据所消耗的时间* int*key,table_id; char**value; table_id=T1;/*操作的数据表*/ /*待写入N条数据的关键字及字段值*/ for(i=0;i { key[i]=Keyi; Value[i]=Valuei; } DBInsertData();/*写入N条数据*/ 3 给定Key,Value对列表,更新N条数据所消耗的时间* int*key,table_id; char**value; table_id=T1;/*操作的数据表*/ /*待更新N条数据的关键字及字段值*/ for(i=0;i { key[i]=Keyi; Value[i]=Valuei; } DBUpdata();/*更新N条数据*/ 2.级联查找性能测试 级联查找K级,每一级级联N条数据,所消耗的时间* (1)Table1(KEY1,VALUE1) Table2(KEY2=VLAUE1,VALUE2) Table3(KEY3=VLAUE2,VALUE3) Table4(KEY4=VLAUE3,VALUE4) Table5(KEY5=VLAUE4,VALUE5) 根据KEY1得到VLAUE5的值,KEY1~KEY5可能包含多个关键字,VLAUE1~5也可能是多个值。 (2)Table6(KEY1,VALUE1) Table7(KEY1,VALUE2) Table8(KEY1,VALUE3) Table9(KEY1,VALUE4) Table10(KEY1,VALUE5) 根据KEY1得到VALUE1+VALUE2+VALUE3+VALUE4+VALUE5的结构。 3.系统资源对性能影响测试 (1)存储NGB数据,内存的使用情况; 改变存储数据数,重复1(*)中的测试项目,观察内存使用的变化情况,对结果进行比较。 (2)每秒操作次数(OPS)对CPU占有率的影响; 改变单位时间内存取操作的次数,获得在执行过程中CPU占有率的变化情况,对结果进行比较。 (3)根据存储数据占存储能力百分比,0%~90%时,对1(*)中测试项目的重新测试; 六、评估标准 (1)初始性能为每个核数据访问CPU占有率为50%。 (2)普通数据库改造成Nosql数据库需要有10倍的效率提升 (3)板内分布式改造后性能(通过模拟DB读写访问比例、查表行为和一致性维度)下降2%以内 (4)板间分布式改造后性能下降5%以内 (5)要支持密集写,比如: 批处理脚本,自动部署算法更新部署信息等,写的时候性能允许下降 (6)评估出进程同时访问数据库时对数据库性能的影响及影响因素(如计算能力、内存带宽等)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 内存 NoSQL 分布式 数据库技术 研究 项目 测试 方案 v10