search
HomeDatabaseMysql Tutorial如何让你的内存中的 NoSQL 数据存储适合企业级应用

对于关注用户体验的每一个Web或移动应用而言,基于内存的NoSQL数据存储系统(例如开源的 Redis和Memcached)正在成为事实标准。由

对于关注用户体验的每一个Web或移动应用而言,基于内存的NoSQL数据存储系统(例如开源的 Redis和Memcached)正在成为事实标准。由于性能、可扩展性和可用性面临的诸多挑战,很多大企业已经在试图采用这些数据库系统。

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

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

数据库系统的可用性(availability)、可扩展性(scalability)和性能(performance)对于这些项目的成功至关重要。

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

1. 可用性

无论你做什么,对于你的应用来说数据必须是时刻可用的。这对于内存数据库尤为重要;因为,如果没有得当的措施,当下面的情形发生时你的数据将会部分或全部丢失:

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

  • 复制:你要确保将你的数据保存一份到集群的另一节点,如果是另一数据中心则更为可靠,以便应付数据中心发生故障(亚马逊AWS在2012年至少发生了4次故障)。不幸的是事情并非如此简单。随便就能举一个复制非常困难的例子:
    一旦程序写的频率增加,你会发现应用服务器写入速度远大于复制的速度,尤其是在主节点和复制节 点存在网络拥堵的情形下。一旦这种情况发生,如果数据集大到一定程度,复制节点很有可能永不再 与主节点同步。
  • 自动切换:为什么需要这个?内存数据库每秒处理的请求比一般数据库通常多100倍,这就意味着每增加一秒宕机时间就会延迟更多的请求处理并给用户带来不好的用户体验。在实现自动切换时一定要遵循下面的原则:
    1.确保主存储节点一旦失败就立马切换到备用复制节点。这一般基于成熟健壮的看门狗技术 (watchdog),看门狗持续的监控节点,一旦失败就切换到健康的复制节点。
    2.对于你的应用程序而言切换过程要尽量透明;最理想的情况是不需要更改任何配置。更高级的解决方案是仅仅修改DNS中存储节点的IP地址,确保修复过程在几秒钟之内完成。
    3.自动切换应当基于Quorum并且是完全一致(fully consistent)或最终一致(eventually consistent)的。讨论下面继续:
  • 2. 网络分裂过程中和完成后的一致性

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

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

    一个设计得当的基于内存的NoSQL是什么样子的呢?很不幸,你只能从下面两个非常糟糕的候选中选择一个:

  • 如果基于内存的NoSQL数据库是完全一致(fully consistent)的,在某些情况下你是不允许写入任何内容的,除非网络分裂恢复。
  • 如果基于内存的NoSQL数据库是最终一致(eventually consistent)的,应用程序可以对“读”请求采用quorum方法——返回一个值或者阻塞。
  • 注意——在今天的市场上并不存在最终一致(eventually consistent)的基于内存的NoSQL数据库,所以只有选项1是可以实际应用的方案。

    3. 数据持久化

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

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

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

    4. 稳定的性能

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

    5. 网速

    大多数云主机都配置了一块1Gbps网卡。在基于内存的NoSQL数据库中,该网卡需要完成以下操作:

    这很容易成为运行的瓶颈,因此,这里提供一些解决该问题的建议:

    6. 可扩展性

    对于简单的KV(key/value)缓存(例如Memcached或者Redis的简单应用),扩展很少被认为是一个很严重的问题;因为在大多数情况下,这只需要在在服务器列表中增加或删除节点并修改哈希方法。但是,实际经历过该问题的人就会意识到这是一个非常令人痛苦的问题。对于该话题我们有一些建议:

  • 采用一致性哈希(hashing)。如果采用简单的哈希函数(例如求模),在扩展的时候就意味着丢失所有的数据。另一方面,很多人不知道的是:即使采用一致性哈希函数,在扩展的时候你仍然会丢失部分数据。例如,在扩展的时候你会丢失1/N的数据,N是你扩展后节点的数目。所以,如果N比较小,这仍然是一个非常痛苦的过程(如果对于2个节点的集群采用一致性哈希就意味着丢失1/3的数据)。
  • 构建一种方法将扩展操作通知到每一个NoSQL的客户端,以便阻止在扩展过程中不同的应用服务器写入不同节点。
  • 当进行某些复杂操作时,例如 Redis的 UNION 和 INTERSECT 操作,扩展就成为一个真正的问题。这些操作与SQL中的JOIN命令完全一样。在multi-shard架构下,如果不增加一定的的延迟和复杂性这些操作就完全不能实现。应用级别的分片(Sharding)能够解决一定的问题,因为它允许在分片(shard)模式下运行一些复杂的命令。但这需要非常复杂的设计,并且与内存NoSQL数据库的配置密切相关(例如分片的应用必须明确知道每一个主键保存的节点);当遇到扩展时(例如re-sharding)还需要巨大的代码修改和额外开销。

    Statement
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
    Spring Boot与NoSQL数据库的整合使用Spring Boot与NoSQL数据库的整合使用Jun 22, 2023 pm 10:34 PM

    随着互联网的发展,大数据分析和实时信息处理成为了企业的一个重要需求。为了满足这样的需求,传统的关系型数据库已经不再满足业务和技术发展的需要。相反,使用NoSQL数据库已经成为了一个重要的选择。在这篇文章中,我们将讨论SpringBoot与NoSQL数据库的整合使用,以实现现代应用程序的开发和部署。什么是NoSQL数据库?NoSQL是notonlySQL

    PHP和NoSQL数据库的应用PHP和NoSQL数据库的应用Jun 19, 2023 pm 03:25 PM

    在现代的网络应用程序开发中,PHP和NoSQL数据库已经成为了非常受欢迎的技术选择。在过去,PHP曾被广泛应用于开发动态网站和Web应用程序,而NoSQL数据库则是最近才出现的全新的数据存储技术,它提供了更加灵活和可扩展的解决方案。在这篇文章中,我们将会探讨PHP和NoSQL数据库在实际应用中的情况。PHP是一种服务器端编程语言,最初

    使用PHP和MongoDB实现NoSQL数据库,满足不同用户需求使用PHP和MongoDB实现NoSQL数据库,满足不同用户需求Jun 26, 2023 pm 11:39 PM

    NoSQL(NotOnlySQL)数据库是近年来快速发展的一类数据库,与传统关系型数据库相比,其具有更好的可扩展性和性能,并支持更多的数据类型和数据存储方式。其中,MongoDB是一款使用文档数据库模型的NoSQL数据库,被广泛应用于Web应用、移动应用、物联网设备等领域。本文将介绍如何使用PHP编写MongoDB数据库的基本操作,并通过实例演示如何满足

    nosql与mysql的区别是什么nosql与mysql的区别是什么May 06, 2019 pm 02:39 PM

    nosql与mysql的区别是:1、MySQL是一个基于表格设计的关系数据库,而NoSQL本质上是非关系型的基于文档的设计;2、MySQL的严格模式限制并不容易扩展,而NoSQL可以通过动态模式特性轻松扩展等等。

    Redis与NoSQL数据库的比较Redis与NoSQL数据库的比较May 11, 2023 am 10:52 AM

    随着互联网的快速发展,数据量也在不断增加。因此,数据管理成为了一个非常重要的课题。NoSQL(非关系型数据库)已经成为处理大数据问题的热门解决方案之一。而Redis又是一款十分流行的NoSQL数据管理软件。本文将分析和比较Redis和其他NoSQL数据库之间的异同点,帮助理解它们的特点和优缺点。一、Redis概述Redis是一个基于内存的存储系统,允许用户使

    Java API 开发中使用 MongoDB 进行 NoSQL 处理Java API 开发中使用 MongoDB 进行 NoSQL 处理Jun 18, 2023 am 10:24 AM

    随着互联网的发展,数据量越来越大,要对这些数据进行有效的存储和处理变得尤为重要。NoSQL(NotOnlySQL)数据库因其高性能、可伸缩性和便捷性而备受关注,相比传统的关系型数据库,它们更加灵活,适用于各种不同的数据处理场景。MongoDB是一款非常流行的NoSQL数据库,在Java开发中也经常被使用。本文将介绍在JavaAPI开发中

    nosql数据库的特点是什么nosql数据库的特点是什么Nov 28, 2022 pm 07:43 PM

    nosql特点:1、灵活的可扩展性;nosql去掉了关系数据库的关系型特性,数据之间无关系,很简单就能够扩展。2、灵活的数据模型;NoSQL采用键/值、列族等非关系模型,允许在一个数据元素里存储不同类型的数据。3、NoSQL可以凭借自身良好的横向扩展能力,充分自由利用云计算基础设施,很好地融人到云计算环境中。4、nosql有着非常高的读写性能,特别是在大数据量之下。5、高可用。

    如何解决Redis缓存雪崩、击穿与穿透如何解决Redis缓存雪崩、击穿与穿透Nov 03, 2022 pm 05:23 PM

    本篇文章给大家带来了关于redis的相关知识,其中主要介绍了关于怎么解决redis缓存雪崩、击穿与穿透的相关问题,缓存雪崩是指大量的请求无法命中Redis中的缓存数据,也就是在Redis找不到数据了;下面一起来看一下,希望对大家有帮助。

    See all articles

    Hot AI Tools

    Undresser.AI Undress

    Undresser.AI Undress

    AI-powered app for creating realistic nude photos

    AI Clothes Remover

    AI Clothes Remover

    Online AI tool for removing clothes from photos.

    Undress AI Tool

    Undress AI Tool

    Undress images for free

    Clothoff.io

    Clothoff.io

    AI clothes remover

    AI Hentai Generator

    AI Hentai Generator

    Generate AI Hentai for free.

    Hot Article

    R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
    2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
    Repo: How To Revive Teammates
    4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Adventure: How To Get Giant Seeds
    4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

    Hot Tools

    Dreamweaver CS6

    Dreamweaver CS6

    Visual web development tools

    SecLists

    SecLists

    SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

    MantisBT

    MantisBT

    Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

    mPDF

    mPDF

    mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    Powerful PHP integrated development environment