haisql_memcache高性能数据库产品介绍

2022-04-14 00:00:00 数据 数据库 线程 服务器 性能

                            Haisql_memcache产品介绍

优点概括:

    公司研发的国产的高性能数据库haisql_memcache性能上远远超越了国际上流行的KV数据库memcached和Redis,Memcached/Redis是由国际上的专家编写,而我们的产品Memcached更多功能,支持事务,支持微线程,支持pipeling,支持数据日志,支持掉电保护的高性能KV数据库,具有高并发性,并发数量无上限,性能非常快,数量无上限,实现了实时数据库的性能。在低端4核CPU上,查询性能memcache快70%,更新插入性能比memcached快了30%,单核性能比Redis更快。同时兼容memcached指令集,包括返回的内容和错误提示均一致,可作为一个特殊版本的服务器直接与memcached客户端连接

    数据结构比较简单,因为是内存数据库,全部数据都在内存中,各类操作简单到了,全部都是文本格式,包括日志在内,都一样。
    因为是内存数据库不需要读磁盘,这个产品没有使用file_mapping等磁盘读技术,磁盘IO只使用了C++ iofstream。各种逻辑处理也比较简单,例如:
      日常的更新删除插入操作,要写日志,日志内容就是set指令和delete指令。
在正常退出的时候,将全部数据保存(更名数据表为旧,保存数据,保存成功删除旧数据表),如果全部数据表都保存成功,就清空日志。
      在启动时,先检查是否存在旧数据表,如果存在,读取旧数据表,再读取日志,否则,直接读取新数据表就可以.

优点详细介绍:

    1.我们使用了先进的stackless微线程架构用于数据处理,stackless微线程调度的内存开销是一个函数对象, 通常大小不过几个字节到几KB字节. 因此stackles微线程无需当心内存开销,也没有CPU线程切换的开销,性能非常好

微线程的优点:
    (1)消耗小, 切换快, 一个进程可以创建成千上万个微线程.
    (2)小任务顺序编程很符合人的思维方式规避纯异步编程中状态机的复杂性使得使用微线程写的程序将更加的直观逻辑描述方便简化编程.纤程用于化异步为同步你可以进行一个异步操作以后就切换纤程,等到异步操作完成以后在切换回来,这样,在逻辑上相关的代码就可以写到一个函数里面,而不用人为的分到多个回调函数中.
    (3)每个CPU只绑定一个线程,每个线程处理多个微线程的TCP/IP数据包,形成一个NCPU:M个连接的方案,这样就完全避免了线程的切换,极大的提高了网络层的并发量.

    2.haisql_memcache支持日志功能,当服务器突然断电时造成的损失,意外关闭造成的损失,只要存在数据日志,就可以通过利用它来恢复数据,轻松排除数据库故障.在系统崩溃/故障等情况下,可以保证数据库的一致性,从而提高了数据库的可靠性。

故障一:服务器突然断电造成的损失
   服务器如果因为突然断电或者其他一些原因意外关机时,再重新启动服务器后会出现一些数据的损失,这是因为数据库中的数据发生更改后,并不会在时间就把数据写入到硬盘中,为了提高数据库的运行效率,往往是先把数据写入到数据高速缓存中,同时把更改情况写入到日志中,等到一定情况数据库系统才会把数据写日到硬盘文件中,此时,如果数据库系统突然发生断电或故障,数据库系统很有可能还没有把缓存中的修改后的数据写入到硬盘中,而日志文件的存在,支持了掉电恢复,即当重新启动时,系统会对每个数据库执行恢复操作,将日志中每个未完成的事务都将回调,以确保数据库数据的完整性.
故障二:解决服务器意外关闭造成的损失
    有时候出于数据库高可用性的目的,需要在生产服务器之外的地方再部署一台数据库服务器,当生产服务器出现故障不可用时,则可以马上启用这个备用的服务器,所以就需要保证生产服务器与备用服务器之间数据的同步,而haisql_memcache数据库就是通过日志的复制来实现生产服务器与备用服务器之间的同步的.生产服务器将生产数据库的活动日志发送到一个或多个目标服务器,每个辅助服务器将该日志还原为其本地的辅助数据库,从而实现备用服务器与生产服务器之间数据的一致性.

3.性能非常快,主要体现在:

    1)有一个快速的网络层,基于Boost::asio基础上二次封装优化改进后的网络库,网络层总行数超过4000行。
    2)std::unordered_map更快,rehash性能抖动小的自主研发的高性能 基于 环形队列 结构的 circular_hash_map 库。环形队列大小自动收缩扩展。
    3)log日志单独线程处理,因此, 有更快的速度,有更多的合并写,极大提高了日志的写性能。
    4)wait_free_mpsc_queue 多生产者单消费者无等待队列的应用, 极大的提高了多线程的并发性能。 多线程写日志就是通过此队列传递给log单线程实现。
自主研发的多生产者单消费者无等待队列,性能非常好,比boost库中快的wait_free_spsc_queue快很多, 时延更小,可以支持任意对象放入到队列中(boost库中的那个只支持普通POD数据,大长度8字节),支持双向数据传送(boost库只支持单向,我们的版本支持pop处理后的push线程的callback回调数据的传送),支持无任务自动休眠,支持push自动回调10微秒),自动pop处理自动调用after_pop_all,自动call_back调用.  内部主要是基于std::atomicmemory_order相关的命令来实现,有一定的技术难度。
    使用时,预先设置各function函数,主程序只要push数据,其他过程都是自动完成的。
    5)各种高性能外围库的实现,重写了很多std库。 例如:常用的二进制和十进制互转,常规std库一般是循环将二进制除10来实现的, 我们的库是使用了 5的魔术数字的 乘法+移位来实现的,性能提高了很多。类似std::to_string(T&)之类的库性能都有了几倍的提高。
    6)各类锁,很多公司和产品都有提供自己写的锁,以便提供比std:;mutex更好的性能,例如:mysql中的自旋锁, 与很多公司此类库直接使用cas指令不同,我们主要是用std::atomic来实现,兼容性更好,参考了C++标准化委员会的建议代码,增加了锁冲突后yield()的机制,无其他任务可执行时候每次spin检查延迟时间只有0.1微秒,有其他任务可执行时将切换线程释放CPU,标准锁class大小只有1个字节兼容所有操作系统和所有CPU

    库中已经实现的锁包括:标准锁,读写锁(写优先锁), 读写锁(读优先锁),可重入锁。所有的锁在用法上与std库兼容, 因此,可以直接使用std::lock_guard等各类上锁的标准std操作。

    4.我们产品的单核查询性能比redis快,测试方法:在双核CPU下本地测试,等效于1CPU做客户端,1个做服务器端, 利用redis_benchmark测试redis, memcslap测试我们的软件,总体流程都是先插入10000条记录,然后新建900连接查询,每连接10000次查询,总共测试900万次查询,每次查询value包大小4096字节,redis花费93.46秒, 我们的软件花费63.792, 在双核下我们性能比redis的性46.5%,在多核CPU下快数倍.

    5.我们产品的查询性能比memcache70%,测试方法:memcslap, KV 数据包大小4Kbyte, 48线程3.4G主频DDR3内存,900万次数据,900并发,读性能39QPS,memcache70%;100万次数据, 100并发,写性能32TPS,memcache快了30% 

    6.我们产品的服务器的并发数量理论上只受限于内存的数量,因此在内存足够的情况下,可以达到并发数量无上限。Haisql_memcache在普通48线程3.4G主频CPU下,网络层每秒新建连接的能力大约是每秒新建4万个连接,每秒网络层包转发能力超过百万QPS, 测试工具是ab(apache benmark), 这个性能指标是超越Apache httpNginx的网络层性能,可在网站下载Echo Server测试验证。

    7.Haisql_memcache目前的集群方案是利用客户端Hash,今后有更好的集群方案。客户端做了一次哈希,可以增加大量haisql_memecache到集群中。

  8.我们团队拥有自主研发的高并发高性能C++基础库,核心包括:高性能智能指针,比std库的智能指针(shared_ptr/unique_ptr等)快一倍,先进的无锁无等待wait_free_queue队列,比boost库快50%, 各种高性能并发锁(包括了标准锁,读写锁等)比现有std库快很多, 微线程任务调度库,二进制/十进制互转换,比std库快数倍,更快的hash_map库,基于Intel SSE4.2的更快的硬件编码crc32/crc64库, 比boost库快数倍,这些库是公司自主研发的,并且性能上具前列, 远远超越了C++ std库和boost库的性能, 因此,任何高并发软件只需要用我们的库重新链接编译一次,性能上都会有不少的提高, 也说明了我们对于C/C++语言的理解和积累超越了多数团队。

  技术团队掌握自主研发的核心技术,掌握了下一代数据库的关键技术,已经研发出上线的内存数据库比主流memcache快60%,比常规数据库快数十倍,SQL数据库还在研发中,性能上在数据库领域有望成为下一代数据库的领跑者。

来自:https://mp.weixin.qq.com/s/MgoD4PzPLVAT6T17b-WWlg

相关文章