cassandra_Apache Cassandra和低延迟应用程序

cassandra

介绍

多年来, Grid Dynamics拥有许多与NoSQL相关的项目,尤其是Apache Cassandra。 在这篇文章中,我们要讨论一个给我们带来挑战的项目,而我们在该项目中试图回答的问题今天也仍然适用。

数字营销和在线广告在2012年很受欢迎,并且对它们的需求仅在增加。 实时出价(RTB)是领域的组成部分。 实时出价工具假设通过数字广告的实时拍卖来放置(购买和出售)广告。 如果中标,买方的广告将立即显示在发布商的网站上。 实时出价需要服务器端的低延迟响应(<100ms),否则出价将丢失。 我们的客户之一,一家美国媒体公司,对实时出价和用户跟踪(即对网站访问者的行为及其偏好的分析)感兴趣。

最初,客户用于处理RTB请求的基础结构包括安装Kyoto Cabinet 。 在下图(图片1)上,您可以看到RTB和第三方请求的来源。 所有请求都发送到实时应用程序,该应用程序在数据库中执行查找和更新请求。 Kyoto Cabinet会将整个数据集保存在内存中,而自定义附件提供了保留管理和持久性功能。

图1.以前的体系结构。

图1.以前的体系结构。

从延迟的角度来看,上述架构足够好,但是它有几个缺点:

  1. 可扩展性。 该架构假定仅安装了京都橱柜的服务器就可以垂直扩展。 当时,每台服务器都配备了约50GB的内存。 众所周知,增加内存量可以长期解决该问题。
  2. 坚固性。 如果发生故障,仅安装京都橱柜可能会导致非常严重的后果。
  3. 跨数据中心复制。 该体系结构在数据中心之间没有自动同步。 手动同步确实令人头疼,因为它需要大量其他操作。

我们的任务是为系统创建一个新的体系结构,该体系结构不具有上述缺点,同时使我们能够在响应延迟方面获得良好的结果。 换句话说,我们需要一个数据存储区,该数据存储区将允许我们保留用户个人资料以及对其进行查找和更新,并且所有操作都将在特定时间间隔内执行。 该体系结构应该围绕这样的数据存储构建。

要求

新的体系结构旨在解决所有这些问题。 对新体系结构的要求如下:

  • 持久性(一个或两个数据中心停电时,任何数据都不应丢失)
  • 高可用性(应该没有单点故障)
  • 可伸缩性(通过添加更多节点,数据库量应该相对容易增加)
  • 跨数据中心复制(两个数据中心之间的数据应同步)
  • 数据的TTL(过期的用户配置文件应自动清除)
  • 数据量(约10亿个具有多个属性的同类记录,其中一个记录约为400字节)
  • 吞吐量(每个数据中心每秒5000次随机读取+每秒5000次随机写入)
  • 响应延迟(平均3毫秒,对于99%的请求,处理时间不应超过10毫秒)

此外,我们还有一些与基础架构有关的限制。 限制之一是每个数据中心最多只能为每个数据库安装八台服务器。 同时,我们可以选择某些服务器硬件,例如内存量,存储类型和大小。 客户的其他要求之一是使用复制因子TWO,由于数据的统计性质,该因子是可以接受的。 这样可以降低硬件成本。

我们研究了几种可能满足我们要求的解决方案,最后选择了Cassandra。 Cassandra的新体系结构成为一种更为优雅的解决方案。 它只是两个数据中心之间同步的Cassandra集群。 但是有关其硬件规格的问题仍未得到解答。 最初,我们有两个选择:

  • SDD,但内存较少(少于整个数据集)
  • HDD和更多内存(足以保留整个数据集)

实际上,还有一个选项暗示使用硬盘驱动器和更少的内存,但是这种配置不能提供我们所要求的可接受的读取延迟,因为从HDD随机读取甚至需要10ms RPM的硬盘也需要8毫秒。 结果,它从一开始就被拒绝了。

因此,我们有两种配置。 经过一些调整(调整本身将在下一节中讨论),它们都满足了我们的需求。 他们每个人都有自己的优点和缺点。 SSD配置的主要缺点之一是成本。 当时,企业级SDD相当昂贵。 此外,一些数据中心提供商对使用SSD维护服务器收取额外费用。

使用HDD的方法意味着从磁盘缓存中读取数据。 该配置的大多数缺点与高速缓存有关,例如,冷启动问题。 这是由于在系统重新引导后清除了缓存而造成的。 结果,从HDD读取未缓存的数据会导致额外的超时。 实际上,超时是在10毫秒内没有响应的请求。 此外,由于在启动时从Cassandra服务器复制了大量数据,可能会意外清理磁盘缓存。 最后一个问题与内存大小有关,而不是与缓存有关。 增加单个节点的数据量非常困难。 可以添加一个额外的HDD或几个HDD,但是单台计算机的内存大小是有限的,并且不是很大。

最后,我们设法解决了大多数上述HDD配置问题。 通过使用cat实用程序读取数据并将其输出重定向到启动时的/ dev / null,解决了冷启动问题。 修补了用于创建备份的rsync后,与磁盘缓存清理相关的问题就消失了。 但是内存限制问题仍然存在,并在以后引起了一些麻烦。

最后,客户端选择了HDD + RAM配置。 每个节点在RAID 5 + 0中配备了96GB内存和8个HDD。

调整卡桑德拉

我们开始使用的Cassandra版本是1.1.4。 进一步,在开发过程中我们尝试了不同的版本。 最后,我们决定批准使用1.2.2版,因为它包含我们已承诺对Cassandra存储库进行的更改。 例如,我们添加了一项改进 ,该改进使我们可以为每个列族分别指定populate_io_cache_on_flush选项(它将在内存表刷新和压缩时填充磁盘缓存)。

我们必须测试其余两种配置,以选择一种更好的配置。 在我们的测试中,我们使用了一个Cassandra群集,该群集包含3个节点,每个节点具有64GB内存和8个内核。 我们从写操作开始测试。 在测试期间,我们以每秒7000次写入的速度将数据写入Cassandra。 选择的速度与群集大小和所需的吞吐量成正比(将写入速度加倍,以考虑跨数据中心复制的开销)。 这种方法论适用于所有测试。 值得一提的是,我们使用了以下首选项:

  • 复制因子= 2
  • write_consistency_level =两个
  • 分层压缩策略

之所以使用LeveledCompactionStrategy(LCS),是因为该客户端的工作流应该具有很多更新操作。 使用LCS的另一个原因是整体数据集大小和读取延迟减小。 两种配置的测试结果均相同:

  • 平均延迟时间:〜1ms
  • 超时:0.01%
  • CPU使用率:<5%

两种配置都满足了我们的需求,尽管在此阶段我们没有花时间调查超时的性质。 超时将在后面讨论。 据推测,大多数响应时间是由网络传输占用的。 另外,我们尝试增加每秒的写查询次数,并产生了良好的结果。 没有明显的性能下降。

之后,我们进入下一步,即测试读取操作。 我们使用了相同的集群。 所有读取请求均以read_consistency_level = ONE发送。 写入速度设置为每秒3500个查询。 每个服务器上大约有40GB的数据,单个记录的大小约为400字节。 因此,整个数据集适合内存大小。 测试结果如下:

表1.读取操作的初始测试结果

表1.读取操作的初始测试结果

查看两种配置的测试结果,我们发现超时值的百分比不令人满意,它们是所需值的2-3倍(2-3%对1%)。 此外,我们还担心CPU负载过高(约20%)。 至此,我们得出的结论是我们的配置有问题。

找到与超时相关的问题的根源并不是一件容易的事。 最终,我们修改了Cassandra的源代码,并为所有读取请求返回了一个固定值(跳过从SSTables,memtables等进行的任何查找)。 之后,再次对读取操作执行相同的测试。 结果是完美的:GC活动和CPU使用率显着降低,并且几乎没有检测到超时。 我们恢复了更改,并尝试为GC找到最佳配置。 在尝试了其选项之后,我们确定了以下配置:

  • -XX:+ UseParallelGC
  • -XX:+ UseParallelOldGC
  • -XX:MaxTenuringThreshold = 3
  • -Xmn1500M
  • -Xmx3500M
  • -Xms3500M

我们设法减少了GC对Cassandra性能的影响。 值得注意的是,读取操作的超时次数超过了写入操作的超时次数,因为Cassandra在读取过程中在堆中创建了很多对象,这又导致大量的CPU使用率。 至于等待时间,它足够低,并且可以很大程度上归因于数据传输时间。 与更密集的读取一起执行相同的测试表明,与写入操作相比,增加读取操作的数量会显着影响超时的数量。 据推测,这一事实与GC的生长活性有关。

众所周知,应该为每种情况分别配置GC。 在这种情况下,并发标记扫描(CMS)效果不如Parallel Old GC。 将堆大小减小到相对较小的值也很有帮助。 尽管上面的配置可能不是最好的配置,但它是满足我们需求的一种。 另外,我们尝试了不同版本的Java。 Java 1.7使我们相对于Java 1.6有了一些性能改进。 相对超时数减少了。 我们尝试的另一件事是在Cassandra中启用/禁用行/键缓存。 禁用缓存会略微减少GC活动。

下一个产生令人惊讶结果的选项是池中处理Cassandra中的读/写请求的线程数。 由于我们的基准测试模拟了多个客户端(最多500个线程),因此将该值从32增加到128会对性能产生重大影响。 另外,我们尝试了不同版本的CentOS和SELinux的各种配置。 切换到更高的6.3版本后,我们发现Java期货在较短的时间内通过超时返回了控制权。 SELinux的配置更改对性能没有影响。

解决读取性能问题后,我们便以混合模式(读取+写入)进行了测试。 在这里,我们观察到一种情况,如下图所示(图2)。 每次刷新到SSTable之后,Cassandra开始从磁盘读取数据,这又导致客户端超时增加。 此问题与HDD + RAM配置有关,因为从SSD读取不会导致其他超时。

图2.改进之前混合模式(读+写)中的磁盘使用情况。

图2.改进之前混合模式(读+写)中的磁盘使用情况。

我们尝试修改Cassandra配置选项,即populate_io_cache_on_flush(如上所述)。 默认情况下,此选项是关闭的,这意味着文件系统缓存未填充新的SSTables。 因此,当访问来自新SSTable的数据时,将从HDD中读取数据。 将其值设置为true可解决此问题。 下图(图3)显示了改进后的磁盘读取数。

图3.改进后,混合模式下的磁盘使用情况(读+写)。

图3.改进后,混合模式下的磁盘使用情况(读+写)。

换句话说,在整个数据集缓存在内存中后,即使在混合模式下,Cassandra也停止了从磁盘读取数据。 值得注意的是,虽然从配置文件中排除了该选项,但是从2.1版开始,默认情况下在Cassandra中populate_io_cache_on_flush选项处于打开状态。 下面的摘要(表2)描述了我们尝试的更改及其影响。

表2.对Cassandra和系统本身的更改及其对延迟的影响。

表2.对Cassandra和系统本身的更改及其对延迟的影响。

最后,应用了本文中描述的更改之后,我们在SSD和HDD + RAM配置上均取得了可接受的结果。 在调整Cassandra客户端(我们使用Astyanax)以使其在复制因子为2的情况下正常运行并在超时的情况下可靠地按时返回控制方面也付出了很多努力。 我们还希望分享一些有关操作自动化,监控以及确保跨数据中心复制正常工作的细节,但是很难在一个帖子中涵盖所有方面。 如上所述,我们已经开始使用HDD + RAM配置进行生产,并且可以毫无意外地可靠地工作,包括在不停机的情况下在活动集群上进行Cassandra升级。

结论

卡桑德拉(Cassandra)在引入项目时对我们来说是新手。 我们不得不花费大量时间来探索其功能和配置选项。 它使我们能够实现所需的体系结构并按时交付系统。 同时,我们获得了丰富的经验。 我们进行了大量工作,将Cassandra集成到我们的工作流程中。 我们对Cassandra源代码的所有更改都已反馈给社区。 我们的数字营销客户受益于拥有更稳定,可扩展的基础架构以及自动同步功能,从而减少了他们维护系统所需的时间。

关于网格动力学

Grid Dynamics是为Tier 1零售提供开放,可扩展的下一代商业技术解决方案的领先提供商。 Grid Dynamics在商务技术方面拥有深入的专业知识,并广泛参与开源社区。 伟大的公司与Grid Dynamics合作,通过在全渠道平台,产品搜索和个性化以及持续交付领域中实施和管理解决方案,获得了可持续的业务优势。 要了解更多关于网格动态,找到我们在www.griddynamics.com或者按照我们的Twitter @GridDynamics。

翻译自: https://www.javacodegeeks.com/2015/02/apache-cassandra-low-latency-applications.html

cassandra

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅析五种C语言内存分配的方法及区别

点击上方蓝字关注我&#xff0c;了解更多咨询在C语言中&#xff0c;内存分成5个区&#xff0c;他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈&#xff0c;就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清楚的变量的存储区。里面的变量通常…

电脑装机完没有efi_电脑装机如何选内存?看完这篇就全懂了

电脑运行太慢&#xff0c;很多小伙伴第一想到的就是加个内存&#xff0c;没错&#xff0c;一般主板上预留了两个以上的内存插槽&#xff0c;加内存是升级电脑最划算的一个硬件升级&#xff0c;其次&#xff0c;可能是加个固态硬盘来提速。今天电脑学习小编教你如何选择适合自己…

塞尔达盾反机器人_微软商店惊现《塞尔达传说:旷野之息》!任天堂暗示《喷射战士3》?| Jump简报...

首先还是祝各位Jumper圣诞快乐&#xff01;业界新闻1. 各大厂商新年寄语&#xff0c;表明未来动向Fami通收到了54家日厂的新年贺卡&#xff0c;其中表明了相当多的新游戏和企划&#xff0c;具体如下&#xff1a;Atlus &#xff1a;《真女神转生V》和《PROJECT Re FANTASY》正在…

PHP 社区拒绝在俄乌冲突中“站队”

点击上方蓝字关注我&#xff0c;了解更多咨询几天前&#xff0c;PHP 社区邮件讨论列表出现了一封“申请援助乌克兰”的邮件&#xff0c;该邮件由非 PHP 开发者发起&#xff0c;目的在于呼吁 PHP 社区火速参与俄乌冲突...邮件机翻译文如下&#xff1a;有意思的是&#xff0c;非 …

jvm内存 大于 xmx_为什么我的JVM访问的内存少于通过-Xmx指定的内存?

jvm内存 大于 xmx“嘿&#xff0c;你能来看看奇怪的东西吗&#xff1f;” 这就是我开始研究支持案例的方式&#xff0c;将我引向了这篇博客文章。 眼前的具体问题与报告可用内存数量不同的不同工具有关。 简而言之&#xff0c;一位工程师正在研究特定应用程序的过多内存使用情…

为什么说PHP是很糟糕的,也是很好的编程语言

点击上方蓝字关注我&#xff0c;了解更多咨询PHP 又是一门相当奇怪的编程语言。当人们抱怨这门语言“很糟糕”时&#xff0c;他们并没有说错。这门语言确实有很多不好的地方。搁在以前&#xff0c;这门语言还有更多糟糕的问题。嘲笑 PHP 的博文《全面解析 PHP 的糟糕设计》(PHP…

Objective-C学习中对 C语言的扩展

点击上方蓝字关注我&#xff0c;了解更多咨询Objective-C学习中对 C 的扩展是本文要介绍的内容&#xff0c;Objective-C和Cocoa是苹果公司Mac OS X操作系统的核心。Objective-C语言是C语言的一个扩展集&#xff0c;许多具备Mac OS X外观的应用程序都是使用该语言开发的。Cocoa是…

神武4手游服务器维护,神武4手游 本周新手服限服开启 !

《神武4》手游新老玩家互动福利新手服即将于本周在天下无双、二〇二〇、见龙在田限服开启&#xff0c;通过“老带新”模式&#xff0c;助力萌新玩家快乐成长的同时&#xff0c;也为老玩家送出更多福利好礼。【《神武4》手游新手服限服开启 】服务器等级≥65且自身等级≥69级的玩…

双向数据绑定是什么

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新双向绑定就很容易联想到了&#xff0c;在单向绑定的基础上&#xff0c;用户更新了View&#xff0c;Mo…

织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题

最近在工作中遇到一个问题&#xff0c;用织梦搭建好的网站&#xff0c;在本地上测试没问题但是上传到正式服务器上就出问题了&#xff0c;在后台登陆的时候&#xff0c;验证码的图片老是显示不出来&#xff0c;后来查阅了相关资料才终于找到问题的根本原因&#xff0c;下面就分…

Python与C语言的区别是什么?

点击上方蓝字关注我&#xff0c;了解更多咨询Python与C语言的区别是什么?Python是由C语言实现&#xff0c;C语言是编译型语言&#xff0c;经过编译后生成机器码再运行&#xff0c;执行速度快不能跨平台&#xff0c;一般用于操作系统驱动等底层开发。Python是理解为解释型语言执…

C语言数据类型从计算机原理的角度是怎样看待的?

点击上方蓝字关注我&#xff0c;了解更多咨询初学C语言&#xff0c;首先要接触的就是数据类型了&#xff0c;这也是学习任何一门语言所必须经历的阶段。很多同学在学习的时候不理解数据类型&#xff0c;因为对计算机及原理知之甚少。所以&#xff0c;在学习数据类型之前&#x…

android module中获取 app_Android组件化架构 - 4. 动态创建

Android 组件化中使用动态创建的作用是解耦&#xff1b;1. 反射机制反射有两个作用&#xff1a;1.反编译&#xff1a;.class->.java;2.通过反射机制访问java对象中的属性&#xff0c;方法&#xff0c;构造器等&#xff1b;实现反射&#xff0c;实际上是得到Class对象2. 动态…

小白适用的C语言数据类型转换及转换规则

点击上方蓝字关注我&#xff0c;了解更多咨询1.不同类型数据间的混合运算与类型转换&#xff1a;①若参与运算量的类型不同&#xff0c;则先转换成同一类型&#xff0c;然后进行运算②转换按数据长度增加的方向进行&#xff0c;以保证精度不降低。如int型和long型运算时&#x…

jax-ws和jax-rs_带有JAX-RS和PrimeFaces的RESTful图表

jax-ws和jax-rs通常&#xff0c;利用图表提供数据的直观表示很有用。 PrimeFaces提供制图解决方案&#xff0c;可轻松将数据的可视表示形式添加到Web和移动应用程序中。 如果我们将PrimeFaces图表组件的使用与RESTful Web服务数据结合在一起&#xff0c;我们可以创建自定义图表…

udp 使用connect优点_nodejs源码分析第十九章 -- udp模块

udp不是面向连接的协议&#xff0c;所以使用上会比tcp简单&#xff0c;他和tcp一样&#xff0c;使用四元组来标记通信的双方&#xff08;单播的情况下&#xff09;。我们看看udp作为服务器和客户端的时候的流程。1 在c语言中使用udp1.1 服务器流程&#xff08;伪代码&#xff0…

C语言与Java的对比,你想好选谁了吗?

点击上方蓝字关注我&#xff0c;了解更多咨询很多同学纠结自己应该学C语言还是学Java&#xff0c;本篇文章带你细致了解C语言与Java的各方面的不同之处&#xff0c;让你能够更全面的把握编程语言&#xff01;1.Java与C语言各自的优势C语言是面向过程的语言&#xff0c;执行效率…

C语言:初始C语言

点击上方蓝字关注我&#xff0c;了解更多咨询什么是C语言为什么学习C语言&#xff1f;第一个C语言程序什么是C语言说到语言&#xff0c;可能会想到汉语&#xff0c;英语这些人与人之间交流的语言&#xff0c;语言是人与人之间沟通的桥梁&#xff0c;通过语言&#xff0c;我们得…

apache camel_带有调试器的Apache Camel Eclipse工具

apache camel大约2个月前&#xff0c; Lars Heineman在 JBoss工具堆栈中写了关于改进的Apache Camel Eclipse工具的博客。 在即将发布的版本中&#xff0c;他们将Camel调试器与本机Eclipse调试器集成在一起&#xff0c;因此当您使用断点时&#xff0c;您将获得Eclipse调试体验…

服务器皮肤在哪个文件里,服务器怎么使用皮肤

服务器怎么使用皮肤 内容精选换一换在使用云服务器备份制作的整机镜像创建弹性云服务器时&#xff0c;创建速度很慢&#xff0c;或者界面提示用户&#xff1a;该镜像不支持快速创建云服务器功能。CSBS服务早期提供的老备份格式无法支持快速创建云服务器&#xff0c;因此&#x…