ruhendervulkan 2013-10-03
对于关注用户体验的每一个Web或移动应用而言,基于内存的NoSQL数据存储系统(例如开源的 Redis和Memcached)正在成为事实标准。由于性能、可扩展性和可用性面临的诸多挑战,很多大企业已经在试图采用这些数据库系统。
非常幸运的是,现代编程语言(例如Ruby、Node.js、Python等)和开发平台(例如Rails、Sinatra、Django等)已经内置了很多工具和开发库(libraries)。这些工具和开发库能够有效利用内存数据库的高性能和各种操作命令,能够实现当前流行的多种应用项目。
这些开源的示例项目包括作业管理、论坛、实时分析、Twitter克隆、地理位置搜索以及高级缓存等等。
数据库系统的可用性(availability)、可扩展性(scalability)和性能(performance)对于这些项目的成功至关重要。
本文粗略的介绍如何构建企业真正可用的基于内存的NoSQL数据库,包括一些技巧和建议;这些技巧和建议能够解决云端NoSQL数据库管理面临的七大挑战。
无论你做什么,对于你的应用来说数据必须是时刻可用的。这对于内存数据库尤为重要;因为,如果没有得当的措施,当下面的情形发生时你的数据将会部分或全部丢失:
对于情形1和情形2有两种方式来解决;情形3将在稍后讨论。
网络分裂(network splits)在云中频繁发生,对地球上的分布式存储系统而言也是最复杂的问题。一旦发生分裂,应用程序可能只会发现内存数据库的部分节点;同时,每个内存NoSQL数据库节点也很有可能只能发现一部分的其他节点。
为什么说这是一个非常严重的问题呢?如果你的数据库包含一些隐蔽的设计缺陷,当网络分裂发生时,应用程序很可能会写入错误的节点。这意味着,当情况恢复时,应用程序发起的写入就会丢失。这对基于内存的NoSQL数据库来说这是一个非常有意义的话题,因为基于内存的NoSQL数据库每秒的写操作远大于其他的NoSQL数据库系统。
一个设计得当的基于内存的NoSQL是什么样子的呢?很不幸,你只能从下面两个非常糟糕的候选中选择一个:
注意——在今天的市场上并不存在最终一致(eventually consistent)的基于内存的NoSQL数据库,所以只有选项1是可以实际应用的方案。
尽管基于内存的NoSQL解决方案提供多种复制选择,你仍需要着重考虑数据持久化和备份,原因如下:
现在你已经确信数据持久化是必要的,在大多数云环境中你应当使用附属在云主机上的存储设备(像AWS的EBS、Azure的Cloud Derive等)。如果你将数据保存在本地硬盘,当遇到节点故障时你就会丢失数据。
一旦数据得到持久化保存,你最大的挑战将变成:在将改变实时写入到持久化存储的同时保证内存NoSQL数据库的速度。
基于内存的NoSQL数据库(例如Redis和Memcached)的设计目标是:在毫秒延迟内,每秒钟能够处理超过10万个请求。但是,这个数字在云环境下是很难达到的,除非你遵循以下的原则:
大多数云主机都配置了一块1Gbps网卡。在基于内存的NoSQL数据库中,该网卡需要完成以下操作:
这很容易成为运行的瓶颈,因此,这里提供一些解决该问题的建议:
对于简单的KV(key/value)缓存(例如Memcached或者Redis的简单应用),扩展很少被认为是一个很严重的问题;因为在大多数情况下,这只需要在在服务器列表中增加或删除节点并修改哈希方法。但是,实际经历过该问题的人就会意识到这是一个非常令人痛苦的问题。对于该话题我们有一些建议:
当进行某些复杂操作时,例如 Redis的 UNION 和 INTERSECT 操作,扩展就成为一个真正的问题。这些操作与SQL中的JOIN命令完全一样。在multi-shard架构下,如果不增加一定的的延迟和复杂性这些操作就完全不能实现。应用级别的分片(Sharding)能够解决一定的问题,因为它允许在分片(shard)模式下运行一些复杂的命令。但这需要非常复杂的设计,并且与内存NoSQL数据库的配置密切相关(例如分片的应用必须明确知道每一个主键保存的节点);当遇到扩展时(例如re-sharding)还需要巨大的代码修改和额外开销。
另一方面,很多人声称新一代的超高性能RAM能够解决节点扩展中遇到的大多数问题。但现实与他们的声称有所不同,在25GB-30GB数据规模上,对于像Redis一样的内存数据库,还有一些其他方面的问题会阻止扩展的真正实施。这些问题与本文前面提到的挑战密切相关,像复制、I/O、每核一个线程的架构、网络开销等。
基于内存的NoSQL数据库的运维会产生巨大的额外开销。它需要对这些技术进行深入了解,以便在紧要关头做出正确决策。同时,因为这些技术变化频率很快(可能是非常快),你还要时刻关注这些系统的趋势和最新修改。
正如我们上面所说的一样,为了更好的利用Redis、Memcached等开源技术带给我们的优势,我们需要对这些技��进行深入了解和掌握。对于企业的IT团队来说,为了能够在企业环境中使用基于内存的NoSQL数据库,了解如何更好的应对这些挑战就显得更为重要。不是我持有偏见,我强烈建议寻找一些能够克服可扩展性和高可用性限制而不损害功能和性能的商业解决方案;因为运行维护基于内存的NoSQL数据库需要该领域的高级专家,这是非常稀少的。
在市场上有一些关于Redis和Memcached的NoSQL服务(NoSQL-as-a-service);我建议你对每一个可用的服务进行深入的比对(就像DIY),以便挑选一个最好的解决方案。能够实际体验一下这些服务就更好了,很多服务商为这个目的都提供了免费体验。
推荐阅读: