当规模到亿级,MySQL是一个更好的NoSQL!-阿里云开发者社区

开发者社区> 努力酱> 正文

当规模到亿级,MySQL是一个更好的NoSQL!

简介:
+关注继续查看


MySQL是一个更好的NoSQL数据库。当考虑到NoSQL的使用案例,比如对Key/Value键值存储来讲,MySQL在性能、易用性和稳定性方面更有意义。MySQL毕竟是一款成熟稳定的产品,在互联网上有大量的在线教程,范围从操作到失败案例,从主从复制到其它不同模式的应用,不一而足。基于这个原因,MySQL相比其他新兴并没有经过多年洗礼的NoSQL来讲,确实有一定的优势。

 

近些年来,NoSQL慢慢成为了主流。许多开发者把这些NoSQL数据库,比如MongoDB、Cassandra、Redis或者Hadoop等,当作他们构建应用的数据库首选,而把老旧的传统数据库废弃不用。

 

选用NoSQL数据库,经常是建立在其不实或者夸大的宣传,和对传统关系型数据库性能不佳的假定上。开发者在选择数据库时,会特别看重操作成本,以及稳定性和成熟性。更多的不同NoSQL和关系型数据库的局限对比,可以参考Aphyr上Jepsen的一些列文章。

 

这篇文章会解释给大家为什么我们发现MySQL对于键值存储场景来说,比大多数专有NoSQL引擎还要好。另外,本文也会提供给大家在MySQL中如此应用的参考。

 

当用户点击一个链接到Wix网站时,他/她的浏览器会发送一个带有网站地址的HTTP请求给Wix的服务器。无论是自定义域名(比如:domain.com)请求一个Wix的优质地址,还是一个在Wix域名下的免费的子域名(比如:user.wix.com/site),这个HTTP请求都会发生。服务器不得不在网站地址中执行键值查询来处理用户对某个地址的请求。我们用路由来表示URL,进行下面的讨论。

 

路由表用于将站点地址解析为一个站点对象。因为站点可以暴露在多个路由中,所以是多对一的关系。一旦网站被发现,则应用将其加载以备使用。站点对象本身具有复杂的结构,其中包涵两个子列表,列表中的对象表示了站点使用的不同服务。下面是一个对象的模型图,假设使用了标准SQL数据库和归一化模型:

 

20160623101948927.jpg


当使用传统的归一化模型更新网站时,我们需要一个事务来更新多表,以确保保持数据一致性(注意,这里的事务使用的是数据库级别的锁来避免并发写,有些时候用来避免在受影响的表中并发读)。继续使用这一模型,我们可能会有每张表的串行键、外键以及在路由表中对于URL列的索引。

 

然而,这里有几个使用归一化模型带来的问题:

  • 数据库锁限制了对表的访问,所以在高吞吐量的场景下,我们的性能可能会受一些影响

  • 读取对象涉及几个SQL查询(在本例中使用了4个)或联接——再次影响了延迟

  • 串行键施加锁和再次限制写入吞吐量

 

这些问题相当于限制了我们使用MySQL(或者其它任何SQL引擎)时的吞吐量和并发。因为这些短板,外加事实上我们需要的是键值存储,所以许多开发者倾向于使用NoSQL作为解决方案以提供更高的吞吐和更多的并发,甚至是更好的稳定性、一致性和高可用。

 

在Wix,我们发现,当我们“有创造性的”使用MySQL作为键值存储时,能够提供比上面提到的使用归一化数据模型或者其它大多数NoSQL数据库引擎更好的性能。简单的使用MySQL来作为NoSQL引擎,我们现有的系统,无论是在伸缩性、吞吐量、并发和延迟指数上,相较NoSQL都具有令人惊艳的性能。下面列举一些数据:

  • 横跨三个数据中心的异地多活

  • 吞吐量在200,000RPM的数量级

  • 路由表记录在100,000,000的数量级,10GB的存储

  • 站点表记录在100,000,000的数量级,200GB的存储

  • 读延迟平均在1.0-1.5毫秒(事实上,在一个数据中心,延迟为0.2-03毫秒)

 

值得注意的是,对于绝大多数的键值引擎,无论是开源数据库还是云数据库,1.0毫秒的延迟被认为是相当令人惊讶的水平。然而我们用MySQL就实现了这一壮举(考虑到还使用了基本的SQL引擎)

 

这是我们实际使用的模型:

 

20160623101936635.jpg

20160623101925476.jpg

 

任何未被当做查询条件的字段,都被放置在一个单一的blob字段(上面的site_data字段)。其中包含子对象表,和其他表本身的字段。另外注意,我们并未使用串行键,相反的,我们使用了一个varchar(50)的字段,用于存储客户端生成的GUID值——关于这部分,详见下一章节。

 

下面是我们使用的一个查询,具备高吞吐的同时,还具备了低延迟:

 

20160623101914785.jpg

 

工作原理是这样的,首先使用唯一索引在路由表上执行查询,应该尽的到一条记录。接着使用这条记录的主键,在站点表执行查询,返回的记录也是一条。

 

嵌套的查询语法可以确保这两个 SQL查询仅在数据库记录中查询一次。

 

上面的结果显示,平均延迟在1毫秒以下,并且在高流量和高更新率的情况下能保证一致性。虽然没有使用事务,但是update却是半事务的。因为我们在一条插入语句中输入了完整的网站地址,直到进入路由表,这条记录才会被发现。

 

所以如果我们首先输入了站点网址,然后是路由,我们就能确保有一个一致性的状态,即使是在最边缘的情况下,我们也仅仅是在站点表中有一些“孤儿”数据。

 

使用从上面例子(或者在Wix的其它案例)中的到的经验,我们简要的列举出了一个使用MySQL当做NoSQL引擎使用的参考。

 

当使用MySQL当做NoSQL引擎使用时,首先要记住的一点是避免使用数据库级别的锁或者是复杂查询:

不要使用事务,因为事务引入了锁。相反的,使用应用来控制事务

不要使用串行键。串行键引入了锁和其它敷在的启动配置

使用客户端生成唯一键,我们使用了GUID

 

当为优化读设计模型时,鞋面是额外的一些经验仅供参考:

  • 不使用归一化模型

  • 所有的字段在被索引时才有必要存在。如果字段在查询时不需要,则将其放到一个blob/text字段中(如JSON或者XML)

  • 不要使用外键

  • 设计你的模型,来确保查询时仅读取单独的一行

  • 不要在表上使用alter命令。修改表的命令引入了锁和停机时间,相反的,尝试使用实时迁移

 

当查询时:

  • 使用主键或者索引查询记录

  • 避免使用表连接

  • 避免使用聚合函数

  • 尽量在从库上执行较为复杂的查询(如BI,数据研究等),避免在master数据库上执行上述操作

 

我们打算另外写一篇文章来介绍有关实时迁移和应用控制事务的更多内容。

 

总结

 

最值得在这篇文章中看到的是如何打破思维尝试不同的思考。使用MySQL来当做NoSQL引擎,看起来是不错的,虽然MySQL最开始并不是为此而设计的。本文中演示的,是一个使用MySQL而不是NoSQL引擎来构建键值访问。在Wix,MySQL是我们的键值存储场景的选择是因为操作简单、使用简单,并且MySQL本身有极好的生态。此外,MySQL还能提供额外的低延迟、高吞吐和数据一致性保证,即使不能超越其它NoSQL引擎,至少也算打个平手吧。

 

来源:解放号杰微刊

译者:张帆

本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2016-06-23

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
4056 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4440 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
7743 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9415 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
5433 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
16776 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3208 0
+关注
287
文章
3
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载