游客 你可以选择到 登录 注册帐号 忘记密码?
  • 服务热线:
    13999268016
您现在的位置:首页主页 > 下载中心 > 文档下载 >
网页加速必备高性能数据库HaiSQL_memcache介绍

文件介绍:

                                                                                 网页加速必备高性能数据库HaiSQL_memcache
优点概括:
        我公司研发了一个国产的高性能数据库haisql_memcache,性能上远远超越了国际上流行的KV数据库memcached和Redis,Memcached/Redis是由国际上顶级的专家编写,而我们的产品比Memcached更多功能,支持事务,支持微线程,支持pipeling,支持线程安全的shared_ptr,支持数据日志,支持掉电保护的高性能KV数据库,具有高并发性,并发数量无上限,性能非常快,实现了实时数据库的性能。在低端4核CPU上,查询性能比memcache快70%,更新插入性能比memcached快30%,单核性能比Redis更快。同时兼容memcached指令集,包括返回的内容和错误提示均一致,可作为一个特殊版本的服务器直接与memcached客户端连接。
        我们的产品内存占用低于redis,例如100万4.1KByte,redis占用8G, 我们占4.1G,对于数据底层库优化,我们有超越std::unordered_map/set性能70%的自研hash_map/set,还做了比boost lockfree spsc queue快50%的wait free queue,支持任意大小,任意对象,有比std::shared_ptr快一倍,功能全覆盖,支持完全线程安全的新共享指针库;有新型更高性能spin lock和多种新型锁;有比boost asio io_service快五倍的std function任务调度库,还有大量计划中正在编写或已实现的底层库,包括二进制转十进制,用新算法将慢速除法优化为更快的乘法,比std::to_string提升了数倍.
        数据结构比较简单,因为是内存数据库,全部数据都在内存中,各类操作简单到了极致,全部都是文本格式,包括日志在内,都一样。
     因为是内存数据库不需要读磁盘,这个产品没有使用file_mapping等磁盘读技术,磁盘IO只使用了C++ iofstream。各种逻辑处理也比较简单,例如:
    日常的更新删除插入操作,要写日志,日志内容就是set指令和delete指令。
在正常退出的时候,将全部数据保存(更名数据表为旧,保存数据,保存成功删除旧数据表),如果全部数据表都保存成功,就清空日志。
    在启动时,先检查是否存在旧数据表,如果存在,读取旧数据表,再读取日志,否则,直接读取新数据表就可以.
优点详细介绍:
      1.我们使用了先进的stackless微线程架构用于数据处理,stackless微线程调度的内存开销是一个函数对象, 通常大小不过几个字节到几KB字节. 因此stackles微线程无需当心内存开销,也没有CPU线程切换的开销,性能非常好。
微线程的优点:
     (1)消耗小, 切换快, 一个进程可以创建成千上万个微线程.
     (2)小任务顺序编程很符合人的思维方式, 规避纯异步编程中状态机的复杂性. 使得使用微线程写的程序将更加的直观, 逻辑描述方便, 简化编程.纤程用于化异步为同步, 你可以进行一个异步操作以后就切换纤程,等到异步操作完成以后在切换回来,这样,在逻辑上相关的代码就可以写到一个函数里面,而不用人为的分到多个回调函数中.
     (3)每个CPU只绑定一个线程,每个线程处理多个微线程的TCP/IP数据包,形成一个N个CPU:M个连接的方案,这样就完全避免了线程的切换,极大的提高了网络层的并发量. 
     2.haisql_memcache支持日志功能,当服务器突然断电时造成的损失,意外关闭造成的损失,只要存在数据日志,就可以通过利用它来恢复数据,轻松排除数据库故障.在系统崩溃/故障等情况下,可以保证数据库的一致性,从而提高了数据库的可靠性。
故障一:服务器突然断电造成的损失
  服务器如果因为突然断电或者其他一些原因意外关机时,再重新启动服务器后会出现一些数据的损失,这是因为数据库中的数据发生更改后,并不会在第一时间就把数据写入到硬盘中,为了提高数据库的运行效率,往往是先把数据写入到数据高速缓存中,同时把更改情况写入到日志中,等到一定情况数据库系统才会把数据写日到硬盘文件中,此时,如果数据库系统突然发生断电或故障,数据库系统很有可能还没有把缓存中的修改后的数据写入到硬盘中,而日志文件的存在,支持了掉电恢复,即当重新启动时,系统会对每个数据库执行恢复操作,将日志中每个未完成的事务都将回调,以确保数据库数据的完整性.
故障二:解决服务器意外关闭造成的损失
   有时候出于数据库高可用性的目的,需要在生产服务器之外的地方再部署一台数据库服务器,当生产服务器出现故障不可用时,则可以马上启用这个备用的服务器,所以就需要保证生产服务器与备用服务器之间数据的同步,而haisql_memcache数据库就是通过日志的复制来实现生产服务器与备用服务器之间的同步的.生产服务器将生产数据库的活动日志发送到一个或多个目标服务器,每个辅助服务器将该日志还原为其本地的辅助数据库,从而实现备用服务器与生产服务器之间数据的一致性.
      3.性能非常快,主要体现在:
      1)有一个快速的网络层,基于Boost::asio基础上二次封装优化改进后的网络库,网络层总行数超过4000行。
   2)比std::unordered_map快70%的基于环形队列的新型hash_map/ set库,比std::unordered_map更快,rehash性能抖动小的自主研发的高性能circular_hash_map 库。环形队列大小自动收缩扩展。
   3)log日志单独线程处理,因此, 有更快的速度,有更多的合并写,极大提高了日志的写性能。
      4)不浪费内存,且性能更好的malloc库.
   5)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::atomic和memory_order相关的命令来实现,有一定的技术难度。使用时,预先设置各function函数,主程序只要push数据,其他过程都是自动完成的。
        6)各种高性能外围库的实现,重写了很多std库。 例如:常用的二进制和十进制互转,常规std库一般是循环将二进制除10来实现的, 我们的库是使用了 5的魔术数字的 乘法+移位来实现的,性能提高了很多。类似std::to_string(T&)之类的库, 性能都有了几倍的提高.
  7)各类锁,很多公司和产品都有提供自己写的锁,以便提供比std:;mutex更好的性能,例如:mysql中的自旋锁, 与很多公司此类库直接使用cas指令不同,我们主要是用std::atomic来实现,兼容性更好,参考了C++标准化委员会的建议代码,增加了锁冲突后yield()的机制,无其他任务可执行时候每次spin检查延迟时间只有0.1微秒,有其他任务可执行时将切换线程释放CPU,标准锁class大小只有1个字节, 兼容所有操作系统和所有CPU。
        库中已经实现的锁包括:标准锁,读写锁(写优先锁), 读写锁(读优先锁),可重入锁。所有的锁在用法上与std库兼容, 因此,可以直接使用std::lock_guard等各类上锁的标准std操作。
        4.我们产品的单核查询性能比redis快,测试方法:在双核CPU下本地测试,等效于1个CPU做客户端,1个做服务器端, 利用redis_benchmark测试redis, 用memcslap测试我们的软件,总体流程都是先插入10000条记录,然后新建900连接查询,每连接10000次查询,总共测试900万次查询,每次查询value包大小4096字节,redis花费93.46秒, 我们的软件花费63.792秒, 在双核下我们性能比redis的性能快46.5%,在多核CPU下快数倍.
        5.我们产品的查询性能比memcache快70%,测试方法:memcslap, KV 数据包大小4Kbyte, 4核8线程3.4G主频DDR3内存,读900万次数据,900并发,读性能39万QPS,比memcache快70%;写100万次数据, 100并发,写性能32万TPS,比memcache快30%。 
        6.我们的产品采用性能快且线程安全的 shared_ptr,目前已经开发并测试完成了线程安全的共享指针shared_ptr模型.我们使用了大量创新的超前技术,研发出的下一代高性能线程安全智能指针,与现有shared_ptr/ weak_ptr/enable_shared_from_this/make
_shared在写法上完全兼容,可以简单无缝切换std/boost 库的相关对象. 具备单写多读的线程安全特性,大大方便了多线程程序的开发, 只需要保证最多只有一个线程写这个shared_ptr,就可以保证所有读操作的安全性,同时还可以使用引用方式 &shared_ptr来传送数据,减少调用过程的 increase_count 和 decrease_count;使用创建一个新shared_ptr,赋值给旧的 shared_ptr,这整个过程都是无锁的,没有读并发冲突,大大提高了性能.
        7.我们产品的服务器的并发数量理论上只受限于内存的数量,因此在内存足够的情况下,可以达到并发数量无上限。Haisql_memcache在普通4核8线程3.4G主频CPU下,网络层每秒新建连接的能力大约是每秒新建4万个连接,每秒网络层包转发能力超过百万QPS, 测试工具是ab(apache benmark), 这个性能指标是超越Apache http和Nginx的网络层性能,可在网站下载Echo Server测试验证。
        8.Haisql_memcache目前的集群方案是利用客户端Hash,今后有更好的集群方案。客户端做了一次哈希,可以增加大量haisql_memecache到集群中。
        我们团队拥有自主研发的高并发高性能C++基础库,核心包括:高性能智能指针,功能全覆盖,支持完全线程安全的新共享指针库,比std库的智能指针(shared_ptr/unique_ptr等)快一倍;内存占用低于redis,例如100万4.1KByte,redis占用8G, 我们只占4.1G;先进的无锁无等待wait_free_queue队列,支持任意大小,任意对象,比boost库快50%; 新型更高性能spin lock和多种新型锁(包括了标准锁,读写锁,支持读锁升级为写锁等等)比现有std库快很多;微线程任务调度库std function,比boost asio io_service快五倍;二进制/十进制互转换,用新算法将慢速除法优化为更快的乘法,比std::to_string提升了数倍;自研更快的hash_map/set库,超越std::unordered_map/set性能70%;基于Intel SSE4.2的更快的硬件编码crc32/crc64库, 比boost库快数倍,这些库都是公司自主研发的,并且性能上具前列,远远超越了C++ std库和boost库的性能,因此,任何高并发软件只需要用我们的库重新链接编译一次,性能上都会有不少的提高,也说明了我们对于C/C++语言的理解和积累超越了多数团队。
        技术团队掌握自主研发的核心技术,掌握了下一代数据库的关键技术,已经研发出上线的内存数据库比主流memcache快60%,比常规数据库快数十倍,SQL数据库还在研发中,性能上在数据库领域有望成为下一代数据库的领跑者。
公司官网:    http://www.haisql.com/
产品下载链接:http://www.haisql.com/fwzc/soft/ (免费试用期90天)
产品购买链接:
https://item.taobao.com/item.htm?spm=a230r.1.14.1.NnoH17&id=548068063166&ns=1&abbucket=1#detail       
联系方式:0991-6583723     13999268016    
QQ:459321881              微信公众号:HaiSQL大数据库              

下载地址:

  • 本地下载
  •  
     上一篇:Haisql_memcache最佳实践方案.docx
     下一篇:没有了
    咨询热线:13999268016
    地址:新疆维吾尔自治区乌鲁木齐市水磨沟区南湖东路77号新疆上海科技合作基地八层801室 固话:6583723
    返回首页 | 网站地图 | 联系我们
    技术支持:创世网络
    乌鲁木齐云山云海信息技术有限责任公司 版权所有 备案号:新ICP备17001390号
    新公网安备 65010502000200号
    网站访问人数: