免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wlmqgzm
打印 上一主题 下一主题

[C++] 读性能超过Memcached 65%, 单核也超过redis, 支持日志支持掉电保护,欢迎试用 [复制链接]

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
121 [报告]
发表于 2017-02-20 22:15 |只看该作者
楼主你这样憋大招搞产品,只能去赚外行人的钱,不是说你代码不好,而是没有大规模使用,没有明星产品,而其他方案,各大企业各种成熟的明星产品,而且,别人
还是开源的,凭啥用你的。。。
研究技术好,想赚钱,去找外行的土豪忽悠忽悠才是王道。

论坛徽章:
72
20周年集字徽章-20	
日期:2020-10-28 14:04:30操作系统版块每日发帖之星
日期:2016-07-13 06:20:0015-16赛季CBA联赛之广夏
日期:2016-07-10 09:04:02数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00操作系统版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-04 06:20:00数据库技术版块每日发帖之星
日期:2016-07-03 06:20:00操作系统版块每日发帖之星
日期:2016-07-03 06:20:00数据库技术版块每日发帖之星
日期:2016-07-02 06:20:00操作系统版块每日发帖之星
日期:2016-07-02 06:20:00
122 [报告]
发表于 2017-02-21 19:24 |只看该作者

赞赞赞,官网上把文档补一下呗,想试用一下

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
123 [报告]
发表于 2017-02-22 15:30 |只看该作者
cokeboL 发表于 2017-02-20 22:15
楼主你这样憋大招搞产品,只能去赚外行人的钱,不是说你代码不好,而是没有大规模使用,没有明星产品,而其 ...

没有关系,
如果能够赚钱最好,如果不能赚钱,也一样要把这个产品推下去,因为是对开发这样的产品感兴趣, 为了做点有用的事情。

我自己算是44岁以后转型到程序员方向的,
其实,我自己因为大学本科是北京邮电大学通讯工程专业,毕业后一直从事通讯行业的岗位,也曾经在深圳XX国产通讯设备公司工作过8年,也最远去过非洲,也曾经各种加班。

我是35岁以后辞职,在三四线城市靠房租收入过了几年老百姓的休闲日子,退休后有一天(2015年)突然摔骨折了,觉得生命不能这样清闲,于是重新开始,
我在深圳是交换产品,数据产品,接入网产品,光传输产品领域的专家,有2个产品认证讲师的资格,但是几乎不编程,
2010年 做过一个项目,年底收手。中间空白N年。
2015年 学习linux 下的C++编程,掌握了Boost库,开始了我的程序员生涯,10月开始尝试开发linux下基于Boost Asio的网络库。然后陆续到现在,
今年我46岁了,开发数据库产品中,这个产品的难度和技术含量,大家懂的。各个功能陆续上线中,希望能够尽快实现一个比较完整的好产品。


论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
124 [报告]
发表于 2017-02-22 15:59 |只看该作者
本帖最后由 wlmqgzm 于 2017-02-22 16:25 编辑

回复 123# cjfeii

欢迎试用, 试用过程中有任何问题都可以反馈,也欢迎打电话联系:13999268016,或者加微信号(电话号码)
文档有文员在整理上传中,由于与Memcache指令集兼容,包括返回的内容和错误提示均一致, 所以直接作为一个MemCached的客户端上连使用就行,
可以把我们的程序也作为一个特殊版本的MemCache服务器端来看待,
使用时与使用Memcache没有区别,
Linux下测试性能, 也可以用MemCache的测试工具, 例如:memcslap等。

目前,文档确实不够好,已经安排专人每天撰写,网页中也有一些的介绍,

我自己写代码的时候, 已经注意到文档跟不上的问题, 因此在所有运行场合下,均有大量的help,
1)支持客户端help, 以及help set/get/XXXX等各指令。
2)服务器端程序支持 --help, 已经把所有的option参数都带上了。都有详细的中英文说明。
在程序中的在线help是非常准确的,是原码程序员第一手的资料,
我觉得也足够满足使用的要求了。

产品试用下载: http://www.haisql.com/fwzc/soft/
如果产品的试用期过了30天, 请重新下载拷贝一次,就又可以使用30天了。

论坛徽章:
0
125 [报告]
发表于 2017-02-23 11:53 |只看该作者
使用内存存储索引的最大问题 是如果当机 重启,你需要几分钟重新加载数据。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
126 [报告]
发表于 2017-02-23 13:14 |只看该作者
本帖最后由 wlmqgzm 于 2017-02-23 13:50 编辑

回复 126# benjiamsh

正在开发中 主备用 机制,这样能够就不用等待了。
本来想参考redis的 slaveof 和 move等命令,先实现一个版本,实现起来不难, 本来计划是照此方案执行。
但是开发中,几轮讨论下来,觉得这个方案太简陋了,用户的主备用机制还需要第3方的软件或者手动,程序员是容易了,但是用户不方便。
因为我们更希望创新,给用户提供前所未有的体验。

现在的思路是:
重新设计一套集成在内部的主备用机制,增加更多的功能点:
1)设计一个master_slave组,可以有多台机器,master中断后,其中一台slave将启动为主用,slave竞争master的机制上有微创新,可以更快的进入master状态。
这块的公开资料已经足够多了,各公司都有自己的实现,不详细说了。

2)master_slave组中,有多种同步模式, 至少包括下列模式:
A)同步1, 就是用户的命令在执行成功后,要等待slave收到同样的命令,并且执行后,返回run_ack,  才返回用户ok.
B)同步2, 就是用户的命令在执行成功后,要等待slave收到命令后ack,才返回用户ok.  命令已经进入slave命令缓冲区,slave可能在稍后的0-几十微秒内执行,只要不掉电,一定会执行。
C)异步1,就是用户的命令在执行成功后,立即返回用户ok,把命令放到通知队列中,等待执行.
D)异步2,就是用户的命令在执行成功后,把命令放到通知队列中,命令被后台线程send到TCP/IP缓冲区中,再返回用户ok.
总体的思路是将流程分解为多个片段,设置work_mode=0---X, 有不同的时延,越大的值,时延越大,性能越低,可靠性越高。

3)将支持自动代理模式,
A) 就是用户无论连接 主备用组中的任何一台机器的任何一块网卡,只要网络正常,insert/delete/update命令都将被代理传送到主用机器去执行,并且返回代理结果,客户端不需要关心哪一台是主用,哪台机器是备用。
B) 查询命令至少有2个模式可以配置:
模式1:在本地查询,无论本机是主,还是备。推荐模式1,这个查询性能是最高的。
模式2:如果本机是主用,直接查询;如果本机是备用,代理到主用机器去查询,然后返回代理结果。这种模式适合异步情况下,又希望始终能够返回最新的值。
查询命令工作模式可以随时变更,支持命令集和config/argv三种方式配置。
命令集正在设计中,讨论中的命令集;
例如:命令 master_slave query_work_mode 1  将变更查询模式为1.

主要的优势就是:
把全部 master_slave组 中的多台机器看做一个整体,几台机器所有对外网卡都作为这个虚拟服务器的网卡,如果部分网卡连不上,只是当做某些网卡坏掉了,整机还是好的。
对于客户端来说,就非常简单,相当于要连接的服务器是一个HA高可用服务器,这个高可用服务器只有个别网卡会坏掉(但是有冗余网卡),其余部分都是不会停机的。

我们这块的程序设计就非常复杂,计划要增加的额外功能点包括:
1)master_slave组 中计算机名称 的添加/删除/保存/同步到其他机器。
例如:master_salve add server_XXX 1971, 然后该命令将被代理到主用机器执行,然后被同步到所有机器,在本地的config文件中保存。该命令执行后,将启动push方式的数据推送,开始对 server_XXX 1971的数据同步
2)数据同步,总体上的思路是尽量采用push推送方式,少用pull,  push后对端有ack应答。首次同步,将清除掉slave内存中的全部数据, 再开始同步。增加日志长度的查询指令,支持断点续传。
3)为了提供理论上更好的代理性能,计划在各服务器间启用长连接,长连接的TCP/IP底层启动keep_alive自动检测,支持CPU数量远程查询指令,长连接数量=主用服务器CPU数量。
长连接内部再启用子连接,将外部的连接分别代理到长连接内部的子连接中,这样就可以不用单独创建连接了,性能比较快,在子连接封装中增加额外的校验码,可以提供比TCP/IP的16位更多的校验码,以及nack重传,提供更高的可靠性,
各个外部连接也做到了完全隔离,另外一方面也降低了主用服务器的连接开销,实现更高的并发。

总之,其实是从零开始设计一个完善的HA系统,然后与现有的代码融合,实现多台主机的对外一致性。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
127 [报告]
发表于 2017-02-23 14:17 |只看该作者
HA的设计非常复杂,计划的开发和测试时间大约是1个月,看实际的执行情况吧,希望能够按时完成。

我们的十年总体设计思路是从底层开始重新做一个NewSQL,
所以,从一开始一直是在网络层/无锁队列/锁设计/C++各类库,磁盘IO和日志框架设计,file_mapping技术方案原型的测试验证,
更高性能的hash_map,重写了部分C++外围库,以便提供更高的性能,全部是最基础的底层框架模型,尽可能提供多线程下的高性能简化模型。
包括各种锁,增加一些标准库没有,但是提供后将降低死锁,降低编程难度的设计。

由于SQL的复杂性,完整ACID的复杂性,分布式事务处理的复杂性,
我们的资源有限,暂时无法同时突破,开始先做一个KV数据库作为产品部分技术的验证,始终保持一个可用的数据库版本,一部分已经成熟的技术架构,将首先在这个平台上实现,验证测试。
最后,在覆盖完全部功能点后,将实现一个分布式NEWSQL.

在设计整个数据库集群架构中,遇到了复杂性难题,为了简化总体设计模型,因此,将集群的框架做了切分,将集群分为切片 和 主备用 2个分层。
主备用在下层提供一个高可用的HA分组,切片在上层。这样, 可以大幅度减少切片的机制复杂度。

我们的远期目标比较宏大,未来数据库NewSQL总体架构是shared_nothing, MPP并行架构数据库集群,支持HA高可用,支持事务处理,支持SQL语言。

论坛徽章:
0
128 [报告]
发表于 2017-02-25 14:33 |只看该作者
我不是泼楼主冷水, 看网站就知道不像高端产品.  "并发数量无上限"怎么理解呢lollol

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
129 [报告]
发表于 2017-02-25 21:29 |只看该作者
dscyw 发表于 2017-02-25 14:33
我不是泼楼主冷水, 看网站就知道不像高端产品.  "并发数量无上限"怎么理解呢lollol

网站是外包出去做的,价格比较便宜,2500元。这个公司是去年9月底成立的,资源有限的情况下,暂时把非核心业务外包出去。

"并发数量无上限"主要是由网络层的架构比较先进,不是过去那种每个连接1个线程,然后一般不超1000--几千个线程,连接数受限于线程数的模型。
我们的网络层架构是属于比较新的 N个线程:M个连接的架构,网络层工作线程数量=CPU数量,每个线程处理多个连接,这样在高并发的情况下,基本没有线程切换的开销,每个CPU都能跑到最大效能。
这种网络层架构下,服务器可以接受的最大并发数量理论上只受限于内存的数量,即使同时并发上万个连接,也会有比较好的性能。

在普通4核8线程3.4G主频CPU下,网络层每秒新建连接的能力大约是 每秒新建4万个连接, 每秒Echo Server包转发能力是87万QPS, 测试工具是ab(apache benmark), 这个性能指标是超越Apache http和Nginx的。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
130 [报告]
发表于 2017-03-03 14:01 |只看该作者
本帖最后由 wlmqgzm 于 2017-03-03 17:25 编辑

前面图省事一直在用全局静态编译,今天将 jemalloc 编译进了程序,由于jemalloc与libc中的 malloc/free/realloc等 函数冲突,所以,采用部分静态链接, 部分动态链接的方法解决。
考虑到不是每个人都安装有jemalloc,为了方便用户,将jemalloc静态链接jemalloc.a, 将libc动态链接libc.so, 这样就避免了冲突也默认启用了jemalloc,  其他函数尽量使用静态链接,包括很多boost库,这种方式的兼容性和性能应该比较综合吧。

最后只有下列动态链接存在,都试过了,缺一不可,理论上:动态链接库越多,软件兼容性越差,最后只剩下这几个动态链接库保留了下来:
执行 ldd ./haisql_memcache_linux
        linux-vdso.so.1 =>  (0x00007ffc3377b000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f247eb8f000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f247e886000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f247e66f000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f247e2a6000)
        /lib64/ld-linux-x86-64.so.2 (0x00005586879f1000)

测试表明,更换为jemalloc后,在没有更改一行代码的情况下,工作模式0,性能从每秒24万提升到26万,大约提升了10%.


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP