`
mgoann
  • 浏览: 253139 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

PIM系统架构浅析

    博客分类:
  • Java
阅读更多

 PIM系统架构浅析

 

    我们真的需要分布式吗?

    在回答这个问题之前我简单解释下,集群和分布式的区别,现下很多人都觉得集群和分布式没有任何区别,并且他们完全等同,另一帮人是搞不清楚这俩者的区别与关系。

    我认为集群和分布式应用还是有区别的。分布式应用一般来说可由多个节点共同构成,并且每个节点完成各自独立的事情,这里的事情是不同的,并且是不固定的,这个任务的分配以及结果的综合统计有Master来完成。

    而集群是指由多个节点共同构成,并且每个节点完成一个的业务逻辑,无需Master来分配任务,或是综合统计各个节点的作业结果。

 

    在提出这个问题之前我解释下分布式是什么概念。分布式是众多计算界名词中的一个比较流行的名词。其利用多个Martin Fowler 在《企业应用架构模式》一书中,曾经说过:“能不用分布式的情况下就不要用分布式”,可见当应用变为分布式Java 应用后,会很大程度的增加应用实现的技术复杂度。我个人也是反对分布式应用的,毕竟我们架构的目的是在于解决更常见的问题,提供更简单有效的方法,而不是为罕见的问题寻求解决方案,或是将简单的问题搞的很复杂。

    在当今大多数的Java应用中都或多或少的存在着被过度工程的现象,我自己是很反对过度工程的,过度工程知会让项目增加复杂度,本来一个人可以搞定的事情,现在俩个人都搞不定了,增加后期的维护人员的学习成本。容易给项目组带来风险,由于复杂的技术引入必然会引入很多未知的错误,不管是来自自身的还是来自外部的。

    首先看下传统集群的实现方法,传统集群的实现方法往往是在众多节点的前端加入负载均衡来达到分发、故障检测,但是传统的负载均衡有一个弊端,无法实现根据内容交换,也就是第四层交互。但是在现实的应用中往往需要有会话的支持,也就是一个业务请求由多次交互完成,这就造成了传统的集群架构影响到应用的开发,需要开发人员能够在编写代码之前做到对架构的了解,并且采用一个解决方案来迎合这种架构。比如说MemoryCache、或是Apache自身提供的Session复制。但是这种解决方案增加开发成本和维护成本,并且对硬件的要求也上了一个层次。

    故障检测:一般集群的实现的一个基本要点就是实现故障检测,没有故障检测就不能很好的保证整个集群的正常工作。当然,现有的集群方案中一般都有故障检测而且实现也较为简单,一般都是采用发送心跳消息来探测节点的可用性,该方法,既简单又实用。

    扩展性支持:当业务量随着时间的推移,业务量大幅度的增长,使用简单的性能调优已经不能满足整个系统的正常运行,这个时间可以通过动态的添加节点来完成系统扩容。但是需要做到对其他节点来说该过程完全是透明的,对整个业务的运行也没有任何干扰。该功能也是集群方案中一个比较重要的功能点,而该功能的实现可说也是比较容易的。往往是架构的透明性越高,可扩展性也是越好。

    负载均衡:通常负载均衡的一个很重要的前提就是实现负载的分发,并且能够进行故障检测,系统告警。其中负载的分发的实现非常重要,可以说对整个集群架构的好坏取决于该功能点的实现已经完成程度。负载的分发最好能够根据实际环境来动态调整。常见的分发策略包括:轮询分发、随即分发、根据各个节点的负载分发。还有一些重要的工作负载均衡要参与进来,例如使用“会话粘滞”技术以确保来至同一个用户的请求会被转发到同一个节点上。使用健康检查或者是心跳监测技术来防止将请求发送到一个故障的节点上。有时负载均衡还参数“失败转移”的工作。

    容错:高可用的数据不必是严格正确的数据。当其中一个节点出现故障,在集群中冗余的其他节点可以处理新到的请求。这样就保证了服务器依然可用。但是在节点出现故障的那一刻,正在被处理的请求就可能无法得到正确的处理。那么带有容错功能的集群就可以确保请求能够被正确处理以及响应,哪怕是服务器出现了错误。

 

    下面来看下DSS的集群架构。

    可扩展性:可以动态添加节点,节点之间相互透明,没有任何联系。也可以动态删除节点。

    故障检测:由负载均衡来完成,主要使用端口探测来完成。负载均衡会定时的探测节点的监听端口是否在正常状态,并且可以有数据交互。

    负载均衡:DSS集群架构采用轮询分发机制,但是具有第四层交换功能,可以将带有会话信息的请求发送到同一节点上。当然这是由硬件来实现,性能也比较高,也正是因为该功能使得DSS各个节点之间可以完全隔绝。DSS集群在新到请求的分发策略是轮询。当产生会话以后DSS发返回给客户端一个下次请求的URL,此URLhttp://IP:port/syncer?sid=1400xxxxxx,轻重sid后面的部分为URL重写后的会话idDSS通过此URL来实现会话,并且负载均衡根据sid后面的4位数字完成分发,实现了会话粘滞功能。而新产生的请求都是http://IP:port/syncer,所以这种新的请求都会被分发到新一台节点上。

    DSS集群在压力的分担上基本可以完成均衡分发,但这种情况也不是绝对的,因为每个节点上的压力和诸多因素构成,比如该节点正在受理的会话数,每个会话的最大存活时间,节点的能力等等因素。DSS集群只能保证分发到每个DSS节点的会话数量基本相等,但是对每个会话的处理时间每个节点上正在受理的会话数量以及每个节点的能力差异,都是毫无感知的。

    我们真的需要完全负载均衡吗?

    负载均衡只是一个相对的概念,越是想实现的完美,相应的成本也会高,包括实现成本,后后续的维护成本,我觉得一个复杂集群会给后续的维护成本大幅提高。

    事实证明,DSS集群能够在大多数情况,实现良好的压力分担。

节点之间相互独立,没有任何干扰,无需使用共享内存来交互sessesion或是session复制,session复制不稳定,而且需要消耗一定的内存来存储session信息,并且为了达到安全的目的,往往需要的集群中至少可以找个俩分session的拷贝,防止单台节点故障后,该节点上缓存的session信息丢失,所以session缓存往往需要更多内存来支持。

    缓存复制需要消耗带宽,在带宽有限的情况下,极有可能造成网络拥塞。

    PIM系统中,非常巧妙的利用URL重写避免了分布式应用,达到了大大简化编程,提高开发效率,降低维护难度的要求。以DSS为例,现网中DSS架构使用单机集群方式部署。在此文中将会列举3DSS节点作为讲解使用,实际运营环境是有30DSS节点。

每个节点相互独立,其他节点对于它本身是透明的,有效的消除了单个节点故障不会影响整个业务的运行。这里的故障检测由负载均衡来完成。如果其中DSS2发生故障,负载均衡会将新的请求发送到DSS1DSS3。从而达到故障检测、一个节点出现故障不会影响整个业务。

PIM系统在该点的实现上还不是很成熟。PIM的负载分发策略是轮询分发。轮询分发实现青睐也比较简单,而且在大多数情况下能够使压力分担均匀。DSS集群前端采用RedWare硬件来实现负载均衡,有较高的性能,并且有一定的灵活性,可以根据TCP体中固定的标示来进行分发,也就是实现会话粘滞。也是这种特性使得DSS集群架构使得DSS各个节点之间完全透明,使得应用开发简化。

    容错:DSS集群在容错性上面也有极好的表现。当其中某个节点宕机,负载均衡会进行故障探测,并将该节点上的请求转发到其他节点。这里要说明的是,如果是带有会话信息的请求,该请求不会被转发到其他节点。这里只限于新产生的会话。

    让我们来看看DSS集群这种简单的方式有没有意义?

    先让我们看一个完美的容错集群解决方案。如下图所示,当任何一个节点上产生新的会话时,该会话信息会被复制到第三方容器中,进行保存。当节点1出现故障,该会话的后续请求会被分发其他节点,其他节点会首先判断是否存在该用户的会话信息,如果不存在就到第三方容器中获取该会话的拷贝,这样就实现了完美的容错集群。

 

    实现会话转移有几种主流的方案:

1 数据库持久化方案

       这种方案无疑会对性能产生问题。数据库的事务成本是很高的,特别是在会话数量激增或是数量巨大的时候,对数据库的压力也是不小的。大部分的应用都提倡减少会话中对象的数量,这样就使应用的设计和框架受到了限制,尤其是当需要在会话中缓存用户数据的情况下。

       特点:

       易于实现。将请求处理和会话备份分离,使得集群更健壮、更易于管理。

       失败可以转移到其他的主机,因为数据库是可以共享使用的。

       即使整个集群都发生故障,会话数据都可以保留下来。

       对于DSS这种解决方案并不可行,DSS的业务需求要求其在会话中缓存大量大对象,这使用和数据库交互的成本大增。

2 内存复制方案

       由于在数据库持久化有性能方面的限制,所以许多应用服务器厂商提供了,内存复制解决方案。

【问题总结】

    应该在项目的初期或是一开始就做好集群的准备,以建立大规模的应用。选择能够满足需求的合适的服务器,同时也要选择适用于集群环境的第三方软件或者是架构。然后设计一个适当的框架,让你真正从集群中受益,而不是折磨。

  • 大小: 12.3 KB
  • 大小: 15.8 KB
  • 大小: 13 KB
  • 大小: 16 KB
  • 大小: 14 KB
  • 大小: 13 KB
  • 大小: 21.5 KB
  • 大小: 16.9 KB
  • 大小: 17.4 KB
  • 大小: 9.4 KB
  • 大小: 9.3 KB
  • 大小: 15.5 KB
  • 大小: 12.9 KB
分享到:
评论

相关推荐

    模型驱动体系结构浅析

    ### 模型驱动体系结构(MDA)浅析 #### 一、引言与背景 在软件工程领域,随着企业应用复杂度的不断提高以及技术标准的多样化,如何有效地管理和集成这些复杂的系统成为了一项重大挑战。为了应对这一挑战,国际对象...

    中国移动PIM业务接口规范.doc

    PIM业务接口规范的网络结构主要包括网元功能描述、PIM服务器与各网元之间的接口、业务中涉及的网元在PIM系统中的功能等方面的内容。 知识点10:PIM业务接口规范的协议规范 PIM业务接口规范的协议规范规定了PIM...

    PIM产生机理及根源答问---认识PIM

    - **服务质量降低:**PIM的存在会直接影响到通信系统的整体性能,导致通话质量下降、数据传输速率降低等问题。 - **维护成本增加:**为了减少PIM带来的负面影响,运营商需要定期检查和维护射频系统,这无疑增加了...

    PIM技术介绍

    **PIM技术详解** PIM,全称Protocol Independent Multicast,中文名为协议无关多播,是一种在IP网络中实现多...理解并掌握PIM的工作原理和应用,对于设计和维护大型网络系统,特别是多媒体服务的提供,具有重要意义。

    PIM.rar_PIMEntity_java PIM_java:PIM_pim java_个人信息管理系统源码

    通过分析"PIM"模块,我们可以学习如何在Java中实现MVC架构,以及如何使用Spring框架进行依赖注入和事务管理。 此外,源码还可能涉及到数据库操作,Java提供了JDBC(Java Database Connectivity)API来连接和操作...

    PIM.rar_PIM_java PIM_pim java_日程

    本项目名为"PIM.rar",是以Java编程语言实现的PIM系统,适用于学习和参考。 首先,我们要理解Java语言在开发此类系统中的关键作用。Java是一种跨平台的、面向对象的编程语言,具有丰富的类库和强大的性能,特别适合...

    PIM-SM协议原理最新的

    基于给定文件的信息,我们可以详细地探讨PIM-SM(Protocol Independent Multicast Sparse Mode)的相关知识点,特别是关于其原理及工作机制。 ### PIM-SM基础知识 #### 什么是PIM? PIM,全称Protocol Independent...

    PIM_java管理系统_java毕业设计_java_java编程_

    Java作为一种广泛使用的编程语言,因其强大的跨平台能力和丰富的类库,成为了开发个人信息管理系统(PIM)的理想选择。本系统是针对Java编程学生的一份毕业设计,旨在通过实践加深对Java GUI和数据管理的理解。 一...

    PIM_API.rar_PIM_j2me PIM_j2me pim a

    **PIM API在J2ME中的应用** Java 2 Micro Edition (J2ME) 是Java平台的一个子集,主要用于移动设备、嵌入式系统和其他有限资源的设备上。PIM (Personal Information Management) API是J2ME中的一部分,用于帮助...

    一种新的基于PIM技术的MPP协处理器体系结构设计.pdf

    综上所述,基于PIM技术的MPP协处理器体系结构设计为解决现代计算面临的挑战提供了一种创新解决方案,通过优化数据处理和存储的方式,提高了系统效率,降低了能耗,具有重要的理论价值和实际应用前景。

    PIM API Developer's Guide

    该文档版本为 2.0,发布于 2006 年 10 月 31 日,基于之前的版本进行了结构上的统一与内容上的补充,增加了代码注释,以便于读者更好地理解和运用。 #### 二、Java ME 中的数据处理 在 Java ME(Mobile Edition)...

    PIM协议图示

    由于PIM协议的复杂性,网络工程师通常需要通过系统学习和实践操作,才能熟练掌握PIM协议的设计和配置。在实际的网络部署中,PIM-DM和PIM-SM可能根据网络环境和应用场景的不同而被选择使用。例如,对于网络较为稠密的...

    PIM.zip_PIM_PIM-DM

    **PIM-SM:协议详解与PIM-DM的区别** PIM(Protocol Independent Multicast)是一种在IP网络中实现多播路由的协议,主要用于高效地将数据流从一个源节点分发到多个接收者。PIM-SM(Protocol Independent Multicast ...

    基于忆阻器的PIM结构实现深度卷积神经网络近似计算.pdf

    忆阻器作为一种极具潜力的硬件组件,可以用于构建PIM结构,以提高神经形态计算的效率。 传统的基于数字或多级忆阻器的PIM架构在执行神经网络计算时,需要频繁的模拟/数字(A/D)转换和中间存储,这导致了显著的能量...

    基于IPv6 Linux内核PIM-SMv2协议的研究与实现.pdf

    为了验证PIM-SMv2协议的正确性和可行性,本文还设计了一个模拟的广域网络环境,包括三个节点的三角形网络拓扑结构。通过在该环境中的实验,证明了PIM-SMv2协议的正确性和可行性。 本文对基于IPv6 Linux内核的PIM-...

    pim.rar_PIM

    1. **初始化PIM系统**: 首先,通过调用PIM.getdefault()获取PIM实例,这允许访问设备上的PIM服务。 2. **选择PIMList**: 使用PIMList的enumerateLists()方法列出可用的PIMList,然后选择或创建所需的列表。 3. **...

    pim.rar_PIM_PIM MATLAB_meshless_meshless matlab_pim method

    PIM是一种在数值计算中广泛使用的无网格方法,它无需构建复杂的网格结构,简化了数值求解过程。 无网格方法是数值分析的一个分支,主要用来解决偏微分方程的问题。相比于传统的有限差分、有限元等方法,无网格方法...

    Essential PIM Port 4.24 Pro

    《Essential PIM Port 4.24 Pro:个人信息管理的得力助手》 在当今信息化社会,个人信息管理显得尤为重要。Essential PIM Port 4.24 Pro 是一款备受推崇的个人信息管理软件,它以其高效、易用和功能全面的特点,...

Global site tag (gtag.js) - Google Analytics