如何让NoSQL内存数据库适合企业级应用

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 英文原文:How to Make Your In-memory NoSQL Datastores Enterprise-Ready 对于每一个关注用户体验的Web应用或移动应用而言,NoSQL内存数据库(例如开源的 Redis和Memcached)正逐步成为事实上的标准。

英文原文:How to Make Your In-memory NoSQL Datastores Enterprise-Ready


对于每一个关注用户体验的Web应用或移动应用而言,NoSQL内存数据库(例如开源的 Redis和Memcached)正逐步成为事实上的标准。但是,近几年来,大型企业在采用这些数据库方面还面临着诸多挑战,主要是由于性能、可扩展性和可用性方面的问题。

非常幸运的是,现代编程语言(例如Ruby、Node.js、Python等)和开发平台(例如Rails、Sinatra、Django等)已经内置了很多工具和开发库。这些工具和开发库能够有效利用内存数据库的高性能和各种操作命令,能够实现当前流行的多种应用项目。

这些开源项目的案例包括作业管理、论坛、实时分析、Twitter克隆、地理位置搜索以及高级缓存等等。

但是,对于这些项目成功至关重要的是数据库系统的可用性(Availability)、可扩展性(Scalability)和性能(Performance)。

本文粗略的介绍如何利用内存数据库构建企业级应用,包括一些技巧和建议;这些技巧和建议能够解决云端NoSQL数据库管理面临的七大挑战。

一、可用性(Availability)


无论你在做什么,对于你的应用来说数据必须是时刻可用的。这对于内存数据库来说尤为重要;因为,如果没有适当的措施,当下面的情形发生时你的数据将会部分或全部丢失:
1) 节点失效(在云中经常发生)
2) 进程重启(你可能需要不时的进行重启)
3) 按需要扩展(我们假设你可能需要这个)

对于情形1和情形2有两种方式来解决;情形3将在稍后讨论。

1、复制:你要确保将你的数据集保存一份到集群的另一节点,如果是另一数据中心则更为可靠,以便应付数据中心发生故障(亚马逊AWS在2012年至少发生了4次故障)。不幸的是事情并非如此简单。随便就能举一个复制非常困难的例子:

一旦程序的写频率增加,你会发现应用服务器写入速度远大于复制的速度,尤其是在主节点和复制节点存在网络拥堵的情形下。一旦发生这种情况,如果数据集非常大,节点的复制同步很有可能永远也完不成。

2、自动切换:为什么需要这个?内存数据库每秒处理的请求比一般数据库通常多100倍,这就意味着每增加一秒宕机时间就会延迟更多的请求处理并给用户带来不好的用户体验。在实现自动切换时一定要遵循下面的原则:

(1) 确保主存储节点一旦失效就立刻切换到备用复制节点。这一般基于成熟健壮的看门狗技术 (Watch Dog),看门狗持续的监控节点,一旦发现失效就切换到健康的复制节点。
(2) 对于你的应用程序而言切换过程应尽可能透明;最理想的情况是无需更改任何配置。更高级的解决方案是仅仅修改DNS中存储节点的IP地址,确保修复过程在几秒钟之内完成。
(3) 自动切换应当基于Quorum并且是完全一致(Fully Consistent)或最终一致(Eventually Consistent)的。讨论下面继续:

二、网络分割过程中和完成后的一致性


网络分割(Network Split)在云中频繁发生,对地球上的分布式存储系统而言也是最复杂的问题。一旦发生分割,应用程序可能只会找到内存数据库的部分节点;同时,每个NoSQL内存数据库节点也可能只能找到其他部分NoSQL数据库节点。

为什么说这是一个非常严重的问题呢?如果你的数据库包含一些隐蔽的设计缺陷,当网络分割发生时,应用程序很可能会把数据写入错误的节点。这意味着,当网络分割的情况恢复时,应用程序之前的写请求操作的数据就会丢失。这对NoSQL内存数据库来说这是一个非常重要的话题,因为NoSQL内存数据库每秒的写操作数量远大于其他NoSQL数据库系统。 

一个设计得当的NoSQL内存数据库是什么样子的呢?很不幸,你只能从下面两个非常糟糕的候选中进行选择:
(1) 如果NoSQL内存数据库是完全一致的,在某些情况下你是不允许写入任何内容的,除非网络分割恢复。
(2) 如果NoSQL内存数据库是最终一致的,应用程序可以对“读”请求采用quorum方法——返回一个值或者阻塞。 

注意:到目前为止,业界并不存在最终一致的NoSQL内存数据库产品,所以只有选项1是可以实际应用的方案。

三、数据的耐久性(Durability)


尽管NoSQL内存数据库解决方案提供了多种复制选择,你还是需要着重考虑数据的持久化和备份,原因如下:

(1) 或许你不想为内存复制支付额外的费用,但是仍希望将数据集保存在某个地方,以便在遇到节点故障时能够将数据恢复(即使恢复速度很慢)。
(2) 你肯定希望在遇到任何故障时(比如节点故障、多节点故障、数据中心故障等)都能将数据恢复并且希望保留另外一个选择——将数据保存在另外一个安全的地方,即使数据不能与最新的修改同步。
(3) 还有其他一些采用数据持久化的理由,比如导入产品数据集到阶段环境,以便于测试。

现在你已经确信数据持久化是必要的,在大多数云环境中你应当使用附属在云主机上的存储设备(像AWS的EBS、Azure的Cloud Derive等)。如果你将数据保存在本地硬盘,当遇到节点故障时你就会丢失数据。

一旦数据得到持久化保存,你最大的挑战将变成:在更新数据持久化存储的同时保证NoSQL内存数据库的速度。 

四、稳定的性能


NoSQL内存数据库(例如Redis或Memcached)的设计目标是:在毫秒延迟内,每秒钟能够处理超过10万个请求。但是,这个数字在云环境下是很难达到的,除非你遵循以下原则:

1、确保你的解决方案使用的是功能强大的云主机(Cloud Instance),比如AWS的 m2.2xlarge/m2.4xlarge云主机或者是Azure的A6/A7云主机,而且还有一个专用环境。

另外,可以实现一种预防跨不同云账户的“吵闹的邻居”现象的机制。此机制应该能监控你的数据集的性能,可实时监控、按命令监控、基于一定的规则去监控、或根据一套机制去监控,比如当发现延迟超过阈值就自动迁移数据集到另一个节点。

2、避免存储的I/O瓶颈,确保解决方案使用了功能强大的存储设备,最好是配置了RAID。其次,要确保在“请求数突然暴增”的情况下也不会阻塞你的应用。例如,使用开源Redis方案,你可以配置slave节点执行持久化存储操作;master节点专注于处理用户请求,在“请求数突然暴增”的情况下避免超时现象。

3、测试云厂商提供的各种关于存储I/O优化的建议,例如AWS的PIOPS。大多数情况下,这些建议对随机访问(读或写)来说很有用;但是,对于NoSQL内存数据库经常采用的像顺序写之类的情况来说就没什么优化价值。
AWS的PIOPS

4、 如果内存数据库基于单线程架构(例如Redis),要确保不要在同一个线程中运行多个数据库。不然,某个数据库在执行命令的过程中很有可能会阻塞另外一个数据库。 
 

五、网速


大多数云主机都配置了一块千兆(1Gbps)网卡。在NoSQL内存数据库上下文中,此千兆网卡需要处理:

1、应用程序的请求
2、集群内部的通信
3、复制
4、存储访问

这很容易造成运行瓶颈。因此,下面提供一些建议可解决此问题:

(1) 为每一台云主机配置万兆网卡(10Gbps,但是要有心理准备,它非常昂贵)
(2) 选择能够为一些特殊应用在VPC内部配置多块千兆网卡的云服务商,例如AWS
(3) 采用能够在NoSQL内存数据库节点之间高效分配资源的解决方案以便让网络阻塞最小 

六、可扩展性(Scalability)


对于简单的键值(Key / Value)缓存解决方案(例如Memcached或者Redis的简单应用),其扩展不会被认为是严重问题;因为在大多数情况下,它只需在服务器列表中增加或删除节点并修改哈希函数。但是,对于实际遭遇过此问题的人就会意识到它仍然是一个令人痛苦的问题。

对于此问题我们有一些建议:

1、采用一致性哈希(Hashing)。
用简单的哈希函数(例如求模)做扩展时,意味着遇到扩展事件会丢失所有的键数据。另一方面,很多人不知道的是:即使采用一致性哈希函数,在扩展的时候你仍然会丢失部分数据。例如,在扩展的时候你会丢失1/N的键数据,N是你扩展后的节点数目。所以,如果N比较小,它就是一个很痛苦的过程(比如对2个节点的集群采用一致性哈希函数进行扩展,就意味着会丢失1/3的数据)。

2、建立一种机制,用扩展事件同步所有的NoSQL内存数据库的客户端,以预防这样的事件发生——在扩展过程中不同的应用服务器写入到不同的节点。
当进行某些复杂操作时,例如Redis的UNION和INTERSECT操作,扩展就会成为非常实际的问题。这些命令等同于SQL中的JOIN命令,在多线程架构下,如果不增加一定的延迟和复杂性,这些操作就不能实现。应用程序级的分片(Sharding)能够解决一定的问题,因为它允许在分片级运行一些复杂命令。但是,这需要很复杂的设计,并且与NoSQL内存数据库的配置有一定的关联。比如,分片的应用必须注意节点上存储的每一个主键;扩展事件(如重分片)需要修改大量代码和额外的执行开销。

另外,一些人声称,新一代的超高速RAM,比如亚马逊AWS的HIgh Memory Cluster Eight Extra Large 244GB内存(cr1.8xlarge),能够解决节点扩展中遇到的大多数问题。
但现实是有所不同的,对于25GB-30GB数据集规模,对于像Redis之类的内存数据库,还有一些其他的操作问题会阻止扩展的执行。这些问题与本文前面提到的挑战密切相关,像复制、存储I/O、单核的单线程架构限制、网络带宽开销等。

七、巨大的运维开销


NoSQL内存数据库在处理所有的操作方面会产生巨大的额外开销。你需要对这些技术进行深入了解,以便在紧要关头能做出正确的决策。同时,因为这些技术更新频率很快(可能是非常快),你还要时刻关注这些系统的趋势和最新变化。

八、结论


正如我们上面所说的一样,为了更好的利用Redis、Memcached等开源技术带给我们的优势,我们需要对这些技术进行深入了解和掌握。对于企业IT团队来说,为了能够在企业环境中使用NoSQL内存数据库,了解如何更好的应对这些挑战就显得尤为重要。不是我持有偏见,我强烈建议寻找一些能够攻克可扩展性和高可用性限制而不损害功能和性能的商业解决方案;因为执行这些内部操作需要该领域的高级专家,而这是非常稀少的。

在市场上有一些关于Redis和Memcached的NoSQL服务(NoSQL-as-a-service);我建议你对每一个可用的服务进行深入的比对(就像DIY),以便挑选一个最佳的解决方案。能够实际体验一下这些服务就更好了,很多服务商为这个目的都提供了免费体验。 
目录
相关文章
|
1月前
|
存储 人工智能 NoSQL
AI大模型应用实践 八:如何通过RAG数据库实现大模型的私有化定制与优化
RAG技术通过融合外部知识库与大模型,实现知识动态更新与私有化定制,解决大模型知识固化、幻觉及数据安全难题。本文详解RAG原理、数据库选型(向量库、图库、知识图谱、混合架构)及应用场景,助力企业高效构建安全、可解释的智能系统。
|
4月前
|
存储 关系型数据库 数据库
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
本文通过一个 Agentic RAG 应用的完整构建流程,展示了如何借助 RDS Supabase 快速搭建具备知识处理与智能决策能力的 AI 应用,展示从数据准备到应用部署的全流程,相较于传统开发模式效率大幅提升。
附部署代码|云数据库RDS 全托管 Supabase服务:小白轻松搞定开发AI应用
|
1月前
|
人工智能 运维 NoSQL
云栖大会|AI浪潮下的NoSQL演进:下一代数据库的破局之道
AI浪潮下的NoSQL演进:下一代数据库的破局之道
|
2月前
|
存储 弹性计算 Cloud Native
云原生数据库的演进与应用实践
随着企业业务扩展,传统数据库难以应对高并发与弹性需求。云原生数据库应运而生,具备计算存储分离、弹性伸缩、高可用等核心特性,广泛应用于电商、金融、物联网等场景。阿里云PolarDB、Lindorm等产品已形成完善生态,助力企业高效处理数据。未来,AI驱动、Serverless与多云兼容将推动其进一步发展。
181 8
|
2月前
|
存储 弹性计算 安全
现有数据库系统中应用加密技术的不同之处
本文介绍了数据库加密技术的种类及其在不同应用场景下的安全防护能力,包括云盘加密、透明数据加密(TDE)和选择列加密。分析了数据库面临的安全威胁,如管理员攻击、网络监听、绕过数据库访问等,并通过能力矩阵对比了各类加密技术的安全防护范围、加密粒度、业务影响及性能损耗。帮助用户根据安全需求、业务改造成本和性能要求,选择合适的加密方案,保障数据存储与传输安全。
|
4月前
|
SQL 缓存 安全
深度理解 Java 内存模型:从并发基石到实践应用
本文深入解析 Java 内存模型(JMM),涵盖其在并发编程中的核心作用与实践应用。内容包括 JMM 解决的可见性、原子性和有序性问题,线程与内存的交互机制,volatile、synchronized 和 happens-before 等关键机制的使用,以及在单例模式、线程通信等场景中的实战案例。同时,还介绍了常见并发 Bug 的排查与解决方案,帮助开发者写出高效、线程安全的 Java 程序。
227 0
|
3月前
|
存储 人工智能 数据库
视图是什么?为什么要用视图呢?数据库视图:定义、特点与应用
本文三桥君深入探讨数据库视图的概念与应用,从定义特点到实际价值全面解析。视图作为虚拟表具备动态更新、简化查询、数据安全等优势,能实现多角度数据展示并保持数据库重构的灵活性。产品专家三桥君还分析了视图与基表关系、创建维护要点及性能影响,强调视图是提升数据库管理效率的重要工具。三桥君通过系统讲解,帮助读者掌握这一常被忽视却功能强大的数据库特性。
893 0
|
4月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1508 0
|
4月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
453 1

热门文章

最新文章