Scaling with IMDG通过内存数据网格进行伸缩

今天看了一篇文章觉得不错,大体上总结如下:

说到伸缩性,我们一般都会想到存储的伸缩以及本身应用程序的伸缩,下面这篇文章讲解了对传统的关系数据的伸缩以及如何通过内存数据网格来进行应用程序的伸缩。

首先对于传统的RDBMS的伸缩,大家比较熟悉主要有以下两种方式:

Databasereplication:这也是经典的Master/salve模式的实现,这种方式最大的优点就是通过增加savle来进行read操作的负责均衡,是一种对readscaleout方式,但是同时这种方式也存在以下的缺点:

1只是适合于read频繁的情况,Databasereplication方式通过多个replica来对read进行伸缩,但是对于write操作则不能进行scaleout.

2性能问题,因为数据库操作是一种磁盘io操作

3一致性(consistence),关于这个问题,如果深入讨论可以独立写一篇文章来进行讨论,这里简短的说一下,Master/savle中,如果采用异步复制,那么不同的节点的状态可能是不一致的,相反的如果采用同步方式,那么又会造成很大的延迟。

4容量问题,复制(replication)技术要求每个节点保存完整的数据,这就带来了两个问题,第一个问题就是对于每个节点来说,数据还是会变得越来越多,这样查询的速度也会相应的变慢,第二个问题就是我们需要提供N+1倍的存储空间。

5复杂性以及非标准化问题,大多数的数据库复制技术都是相对复杂的,同时不同的厂商所采用的方式也是不一样的,这样就会造成应用和存储的依赖性。

Datebasepartitioning:这种方式也就是大家熟悉的数据库sharding技术,这种方式使得数据库中数据分布在多个节点上面,这样每个节点都存储一部分数据,这样的好处就是可以对readwriter操作都具有一定的scaleout,但是同样这种方式也存在以下的缺点:

1要求应用程序的数据必须是能很容易切分的。

2性能问题,因为数据库操作是磁盘IO

3要求改变数据模型,很多的数据sharding技术都要求应用程序知道数据在哪一个partition上面。

4需要改变应用程序代码

5静态性,在许多的数据库实现中,当增加Partition的时候,都要求重新的划分partition.相反的目前流行的key-value存储系统通过consistenthashing解决了这个问题。

6复杂性

7非标准的

前面是针对传统的数据库对scalability的解决方案,下面作者指出了如何通过内存数据网格(In-memorydategrids)来进行应用程序的scaleout.

在说IMDG之前,作者也指出了目前很多互联网公司采用的方式:通过内存缓存来scaleout应用程序,目前比较经典的做法就是在DB前端引入分布式的缓存系统(memcached,terracotta),这样可以对大部分的读取操作进行非常有效的scaleout,但是此种方案还是没有解决对write操作的scaleout

下面就说说IMDGscaleout的解决方案。

作者指出了Paas的说法,说白了就是将对象和数据的持久化仅仅当做是一种服务而已,以下作者以问答的方式阐述了几个常见的问题。

1Paas如何工作

利用PaasIMDG将会屏蔽到数据库,内存IMDG和底层数据库的同步操作由IMDG来完成,这种内存和数据库的同步可以通过异步的方式来进行。

2PaasRDBMS相比是如何提供性能的

2.1Paas依赖内存来存储系统的状态,而内存操作和磁盘IO操作来比是非常快速的,同时也支持更大的并发访问。

2.2因为是内存存储,所以数据访问通过内存引用或者指针,而不需要序列化的开销。

2.3数据操作直接针对内存对象

2.4减低了竞争条件,这种方式是将数据分配到多个内存节点上。

2.5并行的聚合查询,这种方式非常类似Map-reduce并行计算模型,它是一种将计算移动到存储数据的节点进行并行计算的方式,这样将会更好的利用CPU和内存资源

2.6避免了ORM,读取操作直接从内存进行,避免了ORM的开销,ORM只是在初始化的时候进行。

3如果要同步数据库,那么此种解决方案不会受到数据性能的影响吗?

不会,原因如下:

3.1数据以批量的方式异步的同步到数据库。

3.2更新操作是可以在多个Partition节点并行的进行

3.3更新操作发生在和需要更新的数据在同一台物理机器上面,这样避免了网络开销.

3.4我们不是为了高可用性的目的来使用RDBMS的,RDBMS是一个强一致性,低可用性的解决方案(CAP理论),采用IMDG所有的查询操作都是直接的内存操作,而只有updateinsert操作才会触发数据库,并且这个时候会以partition的方式,也就是说write操作也是被scaleout的操作。

3.5应用程序和数据库现在是松耦合的,这样更加方便进行优化

4异步的同步IMDG和数据库是不是意味着当失败发生的时候,数据可能会丢失?

IMDG会进行backup,当一个节点发生失败的时候,备份节点会接着进行,所以不会失败。

5如果其中一个内存节点失败会发生什么问题?

这个问题非常类似于hadoopNamenodedatenode节点模型,熟悉hadoop的朋友应该能容易理解。

6如果数据失败会发生什么问题?

IMDG会保留一个记录所有更新和插入的日志,当数据库失败的时候,更新和插入操作还会继续,不会影响到系统终端用户,当底层数据库再次可用的时候,IMDG会根据日志来同步数据。

7IMDG怎么处理事务完整性?

大家都知道2PC事务是一种反伸缩性的实践,它使得所有的partition耦合在同一事务当中,目前比较好的做法就是将事务分为几个小的事务,每个小的事务都在单独的partition上面完成,这样即使存在部分partition失败,但是IMDG还是会保证整个系统处于一致性的状态。

下面我发发牢骚。

目前随着互联网的的快速发展,对于一些热门的应用会造成非常大的读写压力,尤其是目前社会化网络使得传统的RDBMS更加受到打击。

说到伸缩性,我们一般都会想到应用程序本身的伸缩和存储的伸缩,应用的伸缩要求我们对应用程序进行合理的切分,按照功能,按照层的方式进行,而存储的伸缩,传统方式采用复制,sharding等方式,但是这种方式是有很多限制的,限制上面也说了。因此我们如何寻找一种能对readwrite都具有scaleout的解决方案就成了目前一个难题。幸好,目前NOSQL运动给我们带来了福音,通过分布式的key-value存储系统可以更好的对readwrite操作进行scaleout.比如像Twitter这样的应用,它是一个读和写都很频繁的应用,采用传统的解决方案肯定是不行,因此需要一种新的解决方案,这就要求我们吸取NOSQL运动的思想,Twitter每天的有100亿条数据写操作,因此这么频繁的write就需要通过consistenthashing根据用户的ID或者名称来进行均匀的切分,比如hash(userID)%node_number,这样又会造成一个问题,就是读取操作怎么办?因为通过切分,不同的用户被分配到了不同的虚拟节点上面,那么一个Twitter用户想要读取最新Tweet的时候就需要从多个节点进行读取,这个时候就需要利用map-reduce的思想,通过移动运算到存储数据的地方,最后在聚合所有的查询操作(在客户端进行reduce操作)。

原文地址:Scaling with mysql

<!--EndFragment-->

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc