热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysqlnosql_扩展到100M:MySQL是更好的NoSQL

mysqlnosqlMySQL是更好的NoSQL。在考虑NoSQL用例(例如键值存储)时,MySQL在性能,易用性和稳定性方

mysql nosql

MySQL是更好的NoSQL。 在考虑NoSQL用例(例如键/值存储)时,MySQL在性能,易用性和稳定性方面更具意义。 MySQL是一个可靠的引擎,具有许多在线资料,从操作和故障案例到复制和不同的使用模式,不一而足。 因此,与未经测试的新型NoSQL引擎相比,它具有优势。

近年来,NoSQL引擎已成为主流。 许多开发人员将NoSQL引擎(例如MongoDB,Cassandra,Redis或Hadoop)视为构建应用程序的首选,认为它们是弃用旧SQL引擎的单个产品系列。

选择使用NoSQL数据库通常是基于炒作,或者是错误的假设,即关系数据库不能像NoSQL数据库那样好执行。 在选择数据库时,工程师通常会忽略运营成本以及其他稳定性和成熟度方面的问题。 有关不同NoSQL(和SQL)引擎的局限性和缺点的更多信息,请参阅Aphyr的Jepsen系列文章。

这篇文章将解释为什么我们发现将MySQL用于键/值用例比大多数专用NoSQL引擎要好,并提供了以这种方式使用MySQL时应遵循的指南。

Wix网站解析

当某人单击指向Wix站点的链接时,他的浏览器会将HTTP请求发送到具有站点地址的Wix服务器。 无论地址是指向具有自定义域的Wix高级站点(例如domain.com )还是位于Wix域的子域上的免费站点(例如user.wix.com/site ), 都会发生这种情况 。 该服务器必须通过执行站点的键/值查找URL来从站点地址解析请求的站点。 我们将URL表示为以下讨论的途径。

路由表用于将站点地址解析为站点对象。 因为站点可能会暴露在多条路线上,所以这种关系是多对一的。 找到该站点后,应用程序将加载该站点以供使用。 站点对象本身具有复杂的结构,其中包括两个子对象列表-站点使用的不同服务。 这是我们的对象的示例模型,假设使用标准SQL数据库和规范化架构:

MySQL更好NoSQL-1

当使用传统的标准化模型更新站点时,我们需要使用事务来更新多个表,以确保我们保持数据的一致性。 (请注意,事务正在使用DB级锁,以防止从受影响的表中进行并发写入,有时甚至是从受影响的表中读取。)继续使用此模型,我们可能在每个表中都有一个串行键,外键和一个索引。路由表中的URL字段。

但是,标准化的模式化建模方式存在许多问题:

  • 锁限制了对表的访问,因此在高吞吐量的用例中,它可能会限制我们的性能。
  • 读取对象涉及一些SQL查询(在这种情况下为4)或联接-再次涉及延迟。
  • 串行密钥强加了锁定,并再次限制了写入吞吐量。

这些问题构成了我们可以从MySQL(或任何其他SQL引擎)获得的吞吐量和并发性的限制。 由于这些缺点,以及用例实际上是关键/价值这一事实,因此许多开发人员选择寻找提供更好的吞吐量和并发性的NoSQL解决方案,即使是以稳定性,一致性或可用性为代价。

在Wix,我们发现,与具有标准化数据模型(如上述模型)MySQL和大多数NoSQL引擎相比,将MySQL创造性地用作键/值存储时,可以做得更好。 只需将MySQL用作NoSQL引擎即可。 我们现有的系统具有可伸缩性/吞吐量/并发性/延迟数字,这对于任何NoSQL引擎而言都是令人印象深刻的。 这是我们的一些数据:

  • 跨三个数据中心的主动-主动-主动设置。
  • 吞吐量约为200,000 RPM。
  • 路由表的数量级为100,000,000个记录,存储空间为10GB。
  • 站点表的数量级为1亿条记录,200 GB的存储空间。
  • 读取延迟平均为1.0-1.5毫秒(实际上,一个数据中心为0.2-0.3毫秒)。

请注意,对于大多数关键/价值引擎(包括开源和基于云的引擎)而言,大约1.0毫秒的延迟被认为是令人印象深刻的! 我们使用MySQL(被认为是基本SQL引擎)实现了这一点。

这是我们正在使用的实际架构:

MySQL更好NoSQL-2

CREATE TABLE `routes` (`route` varchar(255) NOT NULL,`site_id` varchar(50) NOT NULL,`last_update_date` bigint NOT NULL,PRIMARY KEY (`key`),KEY (`site_id`)
)CREATE TABLE `sites` (`site_id` varchar(50) NOT NULL,`owner_id` varchar(50) NOT NULL,`schema_version` varchar(10) NOT NULL DEFAULT '1.0',`site_data` text NOT NULL,`last_update_date` bigint NOT NULL,PRIMARY KEY (`site_id`)
) /*ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=16*/;

任何未在查询中用作条件的字段都被折叠到单个Blob字段(site_data文本字段)中。 这包括子obj表以及对象表本身上的任何字段。 还要注意,我们没有使用串行密钥。 取而代之的是,我们使用varchar(50),它存储客户端生成的GUID值-在下一节中将详细介绍。

下面是我们正在使用的查询,它具有高吞吐量和低延迟:

select * from sites where site_id = (select site_id from routes where route = ?
)

它的工作方式是首先通过唯一索引对路由表执行查询,该索引仅返回一个结果。 然后,我们通过主键查找站点,再次查找一条记录。 嵌套查询语法确保我们仅对数据库执行一次往返操作以运行两个SQL查询。

上面显示的结果是,在高流量和高更新率的情况下,平均性能约为1毫秒。 即使不使用事务,更新也是半事务的。 这是因为我们在一个插入语句中输入了完整的站点,并且在我们输入路由之前,它不会在查询中找到。 因此,如果我们先进入站点,然后进入路线,即使在站点表中可能有孤立数据的极端情况下,也要确保我们具有一致的状态。

将MySQL用作NoSQL引擎的准则

利用从上面的示例(以及Wix的其他此类案例)获得的经验,我们制定了一些简短的准则来将MySQL用作NoSQL引擎。

将MySQL用作NoSQL引擎时,要记住的主要事情是避免使用数据库锁或复杂的查询。

  • 不要使用会引入锁的事务。 而是使用应用交易。
  • 不要使用串行键。 串行密钥引入了锁定并使主动-主动配置复杂化。
  • 使用客户端生成的唯一密钥。 我们使用GUID。

在设计要针对读取进行优化的架构时,请遵循以下其他准则:

  • 不规范。
  • 仅存在要建立索引的字段。 如果索引不需要字段,则将其存储在一个Blob /文本字段中(例如JSON或XML)。
  • 不要使用外键。
  • 设计架构以启用读取查询中的一行。
  • 不要执行表alter命令。 表alter命令引入了锁定和停机时间。 相反,请使用实时迁移。

查询数据时:

  • 通过主键或索引查询记录。
  • 不要使用联接。
  • 不要使用聚合。
  • 在副本而不是主数据库上运行内务查询(BI,数据浏览等)。

我们打算撰写另一篇博客文章,其中包含有关实时迁移和应用交易的更多信息。

摘要

这篇文章最重要的一点是,允许您以不同的方式思考。 将MySQL用作NoSQL引擎真是太好了,这不是它设计的工作方式。 如本文所演示的,此示例使用MySQL而不是为键/值访问而构建的专用NoSQL引擎。 在Wix上,MySQL是键/值案例(以及其他案例)的首选引擎,因为它易于使用和操作,并且是一个很棒的生态系统。 而且,它提供的延迟,吞吐量和并发度指标可以与大多数NoSQL引擎相匹配(甚至超过)。

翻译自: https://www.javacodegeeks.com/2015/12/scaling-100m-mysql-better-nosql.html

mysql nosql



推荐阅读
  • NoSQL数据库,即非关系型数据库,有时也被称作Not Only SQL,是一种区别于传统关系型数据库的管理系统。这类数据库设计用于处理大规模、高并发的数据存储与查询需求,特别适用于需要快速读写大量非结构化或半结构化数据的应用场景。NoSQL数据库通过牺牲部分一致性来换取更高的可扩展性和性能,支持分布式部署,能够有效应对互联网时代的海量数据挑战。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
  • 开发心得:利用 Redis 构建分布式系统的轻量级协调机制
    开发心得:利用 Redis 构建分布式系统的轻量级协调机制 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在关系型数据库中,数据约束是指在向数据表中插入数据时必须遵循的限制条件。在MySQL和MariaDB中,常见的数据约束包括主键约束、唯一键约束、外键约束以及非空约束等。这些约束确保了数据的完整性和一致性,是数据库管理中的重要组成部分。通过合理设置和使用这些约束,可以有效防止数据冗余和错误,提升数据库的可靠性和性能。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • 在 Kubernetes 中,Pod 的调度通常由集群的自动调度策略决定,这些策略主要关注资源充足性和负载均衡。然而,在某些场景下,用户可能需要更精细地控制 Pod 的调度行为,例如将特定的服务(如 GitLab)部署到特定节点上,以提高性能或满足特定需求。本文深入解析了 Kubernetes 的亲和性调度机制,并探讨了多种优化策略,帮助用户实现更高效、更灵活的资源管理。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 在搭建Hadoop集群以处理大规模数据存储和频繁读取需求的过程中,经常会遇到各种配置难题。本文总结了作者在实际部署中遇到的典型问题,并提供了详细的解决方案,帮助读者避免常见的配置陷阱。通过这些经验分享,希望读者能够更加顺利地完成Hadoop集群的搭建和配置。 ... [详细]
author-avatar
小猪爱情守护者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有