精华内容
下载资源
问答
  • 应用服务器的性能优化大体上可以从一下四个方向入手...缓存的本质是一个内存Hash表,网站应用中,数据缓存以一对Key,Value的形式存储在内存Hash表中。缓存主要用来存放那些读写比很高、很少变化的数据。 二八定律...

    应用服务器的性能优化大体上可以从一下四个方向入手:

    1. 使用缓存
    2. 使用异步
    3. 进行服务器集群
    4. 进行代码优化

    应用服务器性能优化(一)——缓存


    一、使用缓存优化网站性能

    网站性能优化第一定律:优化考虑使用缓存优化性能

    缓存的本质是一个内存Hash表,网站应用中,数据缓存以一对Key,Value的形式存储在内存Hash表中。缓存主要用来存放那些读写比很高、很少变化的数据。

    二八定律:80%的访问落在20%的数据上。

    使用缓存需要注意的问题

    1. 把频繁修改的数据放入缓存。容易出现数据写入缓存后,应用还来不及读取缓存,数据就已经失效的情形,徒增系统负担。一般来说,数据的读写比在2:1以上,缓存才有意义。
    2. 没有热点的访问。 缓存使用的内存资源非常宝贵,只能将最新访问的数据缓存起来,而把历史数据清理出缓存。即缓存资源应该留给20%的热点数据。
    3. 数据不一致与脏读。 一般会对缓存设置失效时间,超过失效时间,就要从数据库重新加载。因此应用要忍受一定时间的数据不一致。另一种策略是数据更新时立即更新缓存,不过这也会带来更多的系统开销和事务一致性的问题。
    4. 缓存可用性。 业务发展到一定阶段时,缓存会承担大部分数据访问的压力,数据库已经习惯了有缓存的日子,所以当缓存服务器崩溃时,数据库会因为完全不能承受如此大的压力而宕机,进而导致整个网站不可用。这种情况被称作缓存雪崩,发生这种故障,甚至不能简单地重启缓存服务器和数据库服务器来恢复网站访问。 解决方式:1、缓存热备(当某台服务器宕机时,将缓存访问切换到热备服务器上。);2、缓存服务器集群
    5. 缓存预热。 缓存中存放的是热点数据,热点数据是缓存系统用LRU对不断访问的数据筛选出来的,这个过程需要较长的时间。新启动的缓存系统没有任何数据,此时系统的性能和数据库负载都不太好。因此可以选择在启动缓存是就把热点数据预加载好。
    6. 缓存穿透。 因为不恰当的业务或恶意攻击,持续高并发地访问某一个不存在的数据,如果缓存不保存该数据,就会有大量的请求压力落在数据库上。简单的解决方式是把请求的不存在的数据也放进缓存,其value是null。

    二、分布式缓存

    分布式缓存架构

    分布式缓存有两种架构方式,一种是以JBoss Cache为代表的需要更新同步的分布式缓存,另一种是以Memchached为代表的不互相通信的分布式缓存。

    应用服务器性能优化(二)——异步操作


    使用消息队列“削峰”

    使用消息队列将调用异步化,可改善网站的扩展性和网站的性能。
    在不使用消息队列的情况下,用户的请求数据直接写入数据库,在高并发地情况下,会对数据库造成巨大的压力,同时使得响应延迟加剧。
    在使用消息队列后,用户请求的数据发送给消息队列后立即返回,再由消息队列的消费者进程(通常情况下,该进程通常独立部署在专门的服务器集群上)从消息队列获取数据,异步写入数据库。

    注意使用消息队列,由于数据写入消息队列后立即返回给用户,数据在后续的业务校验写数据库等操作可能失败,因此在使用消息队列进行业务异步处理后,需要适当修改业务流程进行配合。

    任何可以晚点做的事,都应该晚点再做。

    应用服务器性能优化(三)——集群


    • 使用负载均衡技术为一个应用构建一个由多台服务器组成的服务器集群

    应用服务器性能优化(四)——代码优化


    一、多线程

    由于网站应用程序一般都被web服务器容器管理,用户请求的多线程也通常被web容器管理,但不管是web容器管理的线程还是应用程序自己创建的线程,一台服务器上启动多少线程合适呢?假设服务器上执行的都是相同类型任务,针对该类任务启动的线程数有个简化的估算方式可供参考:

    启动进程数=[任务执行时间/(任务执行时间-IO等待时间)]xCPU内核数

    最佳启动线程数和cpu内核数量成正比,和io等待时间成正比。

    多线程编程需要注意线程安全问题。
    编程上解决线程安全的主要手段有以下几点:

    1. 把对象设计为无状态对象。
    2. 使用局部对象。
    3. 并发访问资源时使用锁。

    二、 资源复用

    资源复用主要有两种模式单例对象池
    单例模式的应用:目前web开发中主要使用贫血模式,从Service到Dao都是些无状态对象,无需重复构建,自然而然用单例模式。
    对象池:复用对象实例。在实践中,应用程序的数据库连接基本都使用连接池的方式。数据库连接对象创建好以后,将连接对象放入对象池容器中,应用程序要连接的时候,就从对象池中获取一个空闲的连接使用,使用完毕再将该对象归还到对象池中即可,不需要创建新的连接。

    三、 数据结构

    灵活组合使用各种数据结构。

    四、 垃圾回收

    JVM分代垃圾回收机制,将应用程序可用的堆空间分为年轻代和年老代,又将年轻代分为Eden区,From区和To区。
    如果Old Generation空间用完,就会触发Full GC,就是所谓的全量回收,全量回收会对系统性能产生较大影响,因此应根据系统业务特点和对象生命周期,合理设置Young Generation和Old Generation大小,尽量减少Full GC。

    展开全文
  • 1.拆表:大表拆小表(垂直拆,水平拆;分表,分区partition,分片sharding),可以在应用层实现,也可以在数据库层面实现一部分;提高系统性能。 2.分库:把表放到不同数据库,这也是分布式...5.缓存常用...

    1.拆表:大表拆小表(垂直拆,水平拆;分表,分区partition,分片sharding),可以在应用层实现,也可以在数据库层面实现一部分;提高系统性能。

    2.分库:把表放到不同的数据库,这也是分布式数据库的基础;提高系统性能。

    3.分布式:不同的数据库放到不同的服务器;提高系统性能。

    4.集群:使用数据库复制等技术组建集群,实现读写分离、备份等;提高系统性能、可用性。

    5.缓存:对常用的数据进行缓存。提高系统性能。

    6.备份:主从库,快照,热备,异地备份等;提高系统可用性。

    7.空间换时间(多级缓存,静态化{客户端页面缓存,反向代理缓存,内存数据库};索引{哈希、B树、倒排、bitmap})

    8.并行与分布式计算(任务切分、分而治之;多进程、多线程并行执行)

    9.多维度的可用(负载均衡、容灾、备份;读写分离;依赖关系;监控)

    10.伸缩(拆分;无状态)

    11.优化资源利用(系统容量有限;原子操作与并发控制;基于逻辑的不同,采取不一样的策略; 容错隔离;资源释放)

    转载于:https://www.cnblogs.com/cherishtodaytime/p/5887816.html

    展开全文
  • 一、商城负载均衡方案(1)我们通过部署CDN加速,可以实现用户访问加速处理(2)然后通过购买负载均衡产品,实现负载均衡主副分流(3)把静态与动态服务进行分离,实现用户静态页面快速呈现,动态页面进行动态更新...

    一、商城负载均衡方案

    (1)我们通过部署CDN加速,可以实现对用户访问的加速处理

    (2)然后通过购买负载均衡的产品,实现负载均衡的主副分流

    (3)把静态与动态服务进行分离,实现用户静态页面快速呈现,动态页面进行动态更新与储存,存储可以用OSS产品

    (4)为了访问快速可以部署redis缓存,实现访问快速呈现需要的内容

    (5)把后端读写数据分离,实现数据的有效分离,提高商城的访问速度。

    6a870682602e0a69c5846ce6cfd7cc5d.png
    21dcdfc362d5a62ea58e8b435f32fc54.png

    执⾏概要具体⽬标
    提⾼商城系统可⽤性SLA(99.9%),实现商城⾼并发,⾼负时,将任务分配到集群的节点中进⾏处理。避免单台处理出现瓶颈问题。⽬标
    架构实施后:
    1.动静态服务器、数据库服务器可横向扩容。
    2.避免单点故障
    3.使⽤redis作为数据库缓存解决⽅案
    1.使⽤动静分离技术,动态和静态资源分布到不同服务器处理。
    2.数据库使⽤读写分离技术,减轻商城读数据压⼒。
    3.使⽤redis服务器减轻⾼负载时对数据库服务器的冲击项⽬⼤纲
    • 访问流程
    1.客户通过互联⽹访问GSLB或CDN,进⼊负载均衡器(购买阿⾥云负载均衡)
    2.通过负载均衡器进⼊静态服务器组(nginx)2核4G*3台。
    3.动态服务器组(php)4核8G*3台,处理php动态资源
    4.redis服务器(标准版双副本2G主从)
    5.数据库实现读写分离(阿⾥云rds)读写实例:8核16G。只读实例:8核16G

    展开全文
  • 在分布式K-V存储系统中,某个key进行读写时,会根据该keyhash计算出一台固定server来存取该K-V,如果集群不发生服务器数量变化,那么这一映射关系就不会变化。 云数据库 memcached 就是这样一种K-V缓存系统。...

    背景

    在分布式K-V存储系统中,对某个key进行读写时,会根据该key的hash计算出一台固定的server来存取该K-V,如果集群不发生服务器数量变化,那么这一映射关系就不会变化。

    云数据库 memcached 就是这样一种K-V缓存系统。在实际应用中的某些高峰时段,有的云数据库 memcached 用户会大量请求同一个Key(可能对应应用的热卖商品、热点新闻、热点评论等),所有的请求(且这类请求读写比例非常高)都会落到同一个server上,该机器的负载就会严重加剧,此时整个系统增加新server也没有任何用处,因为根据hash算法,同一个key的请求还是会落到同一台新机器上,该机器依然会成为系统瓶颈。这个问题称为“热点key”问题。

    pic_

    现状

    用户使用云数据库 memcached 就是为了提升业务性能,难免会触发“热点key问题”。但云数据库memcached做为公有云服务,在发现有热点的情况下,如果继续放任该热点无限激增,就会带来整个系统雪崩。所以当前的做法是对每个用户在每台服务器上分配一定的QPS或带宽,当用户在某台服务器上的请求超过该用户的配额,我们就会对用户进行流控,服务端返回TEMPORARY_FAILURE,该限制会影响用户正常请求,持续时间分钟级。

    思考

    用户触发热点问题是业务需要,是理所当然;云数据库 memcached 对热点 key 进行流控是保障系统稳定性,也在情理之中。但有没有一种既能提供用户热点 key 访问的需求,又能保护云数据库memcached服务器的方法呢,这正是本文所要阐述的。

    解决热点问题有很多办法,比如用户如果提前知道某些key可能成为热点,那么客户端可以提前拆分热点key;也可以搭建一个备用集群,写的时候双写,然后随机双读。这些方案的实现前提和难度可想而知,下面给出的是对应用透明,且动态发现热点的解决方案。

    解决方案

    整体思路

    本方案解决的是用户读热点问题,不解决写热点问题。

    首先,云数据库memcached简单架构图如下:

    memcache simple architechture

    我们的proxy是无状态层,上面做了些访问控制功能,用户客户端到proxy是随机的,不受固定算法(如hash)控制。而proxy到DataServer的链路是根据key决定的,当用户访问热点key时,所有proxy上关于该key的请求都会落到同一台DataServer。

    所以解决热点问题,其核心思路是:每台DataServer对所有key进行采样、定位,实时计算出当前热点key,将其反馈给proxy层,由proxy缓存备份。即负载压力由DataServer转向proxy。理由是:Proxy可以无状态扩容,而DataServer不可以。

    DataServer如何发现热点

    每台服务器有个HotKey逻辑,让每个到达服务器的目标请求(可配置不同类型请求)经历三个流水阶段:

    1. 采样阶段(根据配置设定采样次数sample_max)
      本阶段输出:是否有热点现象,如果有热点,输出热点的桶号供下阶段使用。
    2. 定位阶段(根据配置设定采样次数reap_max)
      本阶段输出:热点key(如果满足阈值),并添加到服务端的LRU链表。
    3. 反馈阶段
      对到达服务器的目标请求,取出key,然后查询LRU链表判断该key是否为热点key。如果是热点,就会在请求结束后,向proxy发送一个feedback包,通知proxy。

    至此,服务器hot-key逻辑结束。流程图如下:

    HotKey逻辑流程

    发现热点后proxy怎么处理

    当Proxy收到DataServer的热点反馈之后,会将该key写入到自己的LRU-cache里面,该cache的过期时间和容量大小都交由用户通过控制台设置,默认分别是100ms和30。这样热点的key就已经存在于与proxy中了,下次用户请求就可以直接返回了。

    如何保证数据一致性呢?

    下面讨论都是用户client已经触发了热点key问题,假设用户client跟每个proxy都建立了链接,并且每个proxy上都有对热点key的请求,那么理论上每个proxy的LRU-cache都有一份数据。

    我们保证单条连接上的一致性。
    当用户client和proxy1建立连接,用户修改了一个key(任何写操作),proxy1上会在LRU-cache中同步删除该key,新key就会写到DataServer上,然后在读数据的时候,由于LRU-cache不命中,就会从DataServer上拿到最新数据。

    不同链接上只能提供弱一致性。
    如果这个时候用户从proxy2上读热点数据呢?理论上就会读到老数据,该数据将于100ms之后从proxy-cache中过期淘汰掉,之后就会更新会最新数据,即不同连接间可能有100ms不一致。

    怎样看待弱一致性。
    事实上,不开启热点key功能,在不同链接上也会存在弱一致。假设用户client建立了两条链接到云数据库memcached,在链接1上写入key-value1,在链接1、2上分别读该key。当链接1上用户update了key-value2,这个请求需要一定的网络延迟才能写入到服务端,如果这个时候链接2上同时发起对key的读取操作,如果读请求先到服务端,它将读到的是value1的老值。

    所以开启热点key功能,只是增加了不一致时间,且该功能为可选,控制权由用户掌握。

    适用场景

    由以上分析可以看到,开启热点key功能之后,只会对用户的读请求产生影响,该影响增加了不同链接上的弱一致性的时间。因此,该功能适合读多写少,且对强一致性要求不高的应用。

    收益

    整个方案核心是负载压力由DataServer转移到Proxy。好处如下:

    1. 因为DataServer扩容也解决不了热点问题,而Proxy可以无状态扩容,对用户来讲就极大提升了热点key访问的能力,不受单点制约;
    2. 缩短了服务端处理链路,对用户平均RT也所降低;
    3. 免除服务端热点流控的分钟级别影响。
    展开全文
  • 在分布式K-V存储系统中,某个key进行读写时,会根据该keyhash计算出一台固定server来存取该K-V,如果集群不发生服务器数量变化,那么这一映射关系就不会变化。云数据库memcached就是这样一种K-V缓存系统。因此...
  • 摘要: redis作为一种NoSql数据库,其提供了一种高效的缓存方案,本文则主要其单例,主从模式,sentinel以及集群的配置方式进行说明,对比其优缺点,阐述redis作为一种缓存框架高可用性。 redis简介redis作为一...
  • include / leveldb / options.h:控制整个数据库行为,还控制单个读写的行为。 include / leveldb / comparator.h:用户指定比较功能抽象。如果只想按字节进行键比较,则可以使用默认比较器,但是如果客户...
  • 网站架构技术

    2016-10-09 21:00:53
    数据库的读写分离 问题: 读库与写库的数据同步 解决方案: 不同的数据库都有自己的数据库的主从复制功能 使用反向代理与CDN加速网站响应 反向代理产品 ngix 使用分布式文件系统和分布式数据库系统...
  • 在大型网站架构演化历程(上)(请戳我)中已经介绍了利用服务器分离、使用缓存、应用服务器集群来提高网站性能。本文继续介绍优化服务器架构其它几种方案。 数据库读写分离 网站在使用缓存后,使大部分...
  • java多线程并发问题

    2016-09-18 14:53:48
    并发:同一时间可能有多个用户同一数据进行读和写。解决方案:读: 1.读写分离 2.配置缓存 3.配置集群 写: 1.选择合适队列 2.配置集群详细解决方案: 确认服务器硬件是否能够支持当前容量,普通P4服务器...
  • zxframe demo.rar

    2019-07-23 10:57:18
    zxframe主要用于有高访问量项目,高并发瓶颈有成套成熟解决方案,让你的服务稳健可用 *.支持读写分离,分库分表,读数据源熔断,数据源运行监控 *.支持JPA,既有hibernate便捷操作,又有mybatissql集中编写...
  • Dubbo 使用Dubbo单一应用服务化改造 Dubbo管理中心及及监控平台安装部署 Dubbo分布式服务模块划分(领域驱动) 基于Dubbo分布式系统架构实战 Dubbo负载均衡策略分析 Dubbo服务调试之服务只订阅及服务只...
  • 如果一个中小型的互联网或者企业应用,仅仅利用domain/node进行k/v的存储即可,因为domain/node都是内存操作而且读写锁分离,同时拥有复制备份,完全满足缓存的高性能与可靠性。对于大型互联网应用,高峰访问量上...
  • fourinone-3.04.25

    2013-12-11 21:35:04
    如果一个中小型的互联网或者企业应用,仅仅利用domain/node进行k/v的存储即可,因为domain/node都是内存操作而且读写锁分离,同时拥有复制备份,完全满足缓存的高性能与可靠性。对于大型互联网应用,高峰访问量上...
  • Fourinone分布式计算框架

    热门讨论 2011-08-29 15:21:33
    如果一个中小型的互联网或者企业应用,仅仅利用domain/node进行k/v的存储即可,因为domain/node都是内存操作而且读写锁分离,同时拥有复制备份,完全满足缓存的高性能与可靠性。对于大型互联网应用,高峰访问量上...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • Java资源包01

    2016-08-31 09:16:25
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • java开源包101

    2016-07-13 10:11:08
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • java开源包11

    热门讨论 2013-06-28 10:10:38
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • java开源包2

    热门讨论 2013-06-28 09:17:39
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • java开源包3

    热门讨论 2013-06-28 09:20:52
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • java开源包6

    热门讨论 2013-06-28 09:48:32
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • java开源包5

    热门讨论 2013-06-28 09:38:46
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • java开源包10

    热门讨论 2013-06-28 10:06:40
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • java开源包4

    热门讨论 2013-06-28 09:26:54
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • java开源包8

    热门讨论 2013-06-28 09:55:26
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...
  • java开源包9

    热门讨论 2013-06-28 09:58:55
    支持redis主从集群,可以做读写分离。缓存读取自redisslave节点,写入到redismaster节点。 Java对象SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集能力.利用JoSQL...

空空如也

空空如也

1 2 3
收藏数 55
精华内容 22
关键字:

服务集群对缓存的读写方案