PIM系统架构浅析
我们真的需要分布式吗?
在回答这个问题之前我简单解释下,集群和分布式的区别,现下很多人都觉得集群和分布式没有任何区别,并且他们完全等同,另一帮人是搞不清楚这俩者的区别与关系。
我认为集群和分布式应用还是有区别的。分布式应用一般来说可由多个节点共同构成,并且每个节点完成各自独立的事情,这里的事情是不同的,并且是不固定的,这个任务的分配以及结果的综合统计有Master来完成。
而集群是指由多个节点共同构成,并且每个节点完成一个的业务逻辑,无需Master来分配任务,或是综合统计各个节点的作业结果。
在提出这个问题之前我解释下分布式是什么概念。分布式是众多计算界名词中的一个比较流行的名词。其利用多个Martin Fowler 在《企业应用架构模式》一书中,曾经说过:“能不用分布式的情况下就不要用分布式”,可见当应用变为分布式Java 应用后,会很大程度的增加应用实现的技术复杂度。我个人也是反对分布式应用的,毕竟我们架构的目的是在于解决更常见的问题,提供更简单有效的方法,而不是为罕见的问题寻求解决方案,或是将简单的问题搞的很复杂。
在当今大多数的Java应用中都或多或少的存在着被过度工程的现象,我自己是很反对过度工程的,过度工程知会让项目增加复杂度,本来一个人可以搞定的事情,现在俩个人都搞不定了,增加后期的维护人员的学习成本。容易给项目组带来风险,由于复杂的技术引入必然会引入很多未知的错误,不管是来自自身的还是来自外部的。
首先看下传统集群的实现方法,传统集群的实现方法往往是在众多节点的前端加入负载均衡来达到分发、故障检测,但是传统的负载均衡有一个弊端,无法实现根据内容交换,也就是第四层交互。但是在现实的应用中往往需要有会话的支持,也就是一个业务请求由多次交互完成,这就造成了传统的集群架构影响到应用的开发,需要开发人员能够在编写代码之前做到对架构的了解,并且采用一个解决方案来迎合这种架构。比如说MemoryCache、或是Apache自身提供的Session复制。但是这种解决方案增加开发成本和维护成本,并且对硬件的要求也上了一个层次。
故障检测:一般集群的实现的一个基本要点就是实现故障检测,没有故障检测就不能很好的保证整个集群的正常工作。当然,现有的集群方案中一般都有故障检测而且实现也较为简单,一般都是采用发送心跳消息来探测节点的可用性,该方法,既简单又实用。
扩展性支持:当业务量随着时间的推移,业务量大幅度的增长,使用简单的性能调优已经不能满足整个系统的正常运行,这个时间可以通过动态的添加节点来完成系统扩容。但是需要做到对其他节点来说该过程完全是透明的,对整个业务的运行也没有任何干扰。该功能也是集群方案中一个比较重要的功能点,而该功能的实现可说也是比较容易的。往往是架构的透明性越高,可扩展性也是越好。
负载均衡:通常负载均衡的一个很重要的前提就是实现负载的分发,并且能够进行故障检测,系统告警。其中负载的分发的实现非常重要,可以说对整个集群架构的好坏取决于该功能点的实现已经完成程度。负载的分发最好能够根据实际环境来动态调整。常见的分发策略包括:轮询分发、随即分发、根据各个节点的负载分发。还有一些重要的工作负载均衡要参与进来,例如使用“会话粘滞”技术以确保来至同一个用户的请求会被转发到同一个节点上。使用健康检查或者是心跳监测技术来防止将请求发送到一个故障的节点上。有时负载均衡还参数“失败转移”的工作。
容错:高可用的数据不必是严格正确的数据。当其中一个节点出现故障,在集群中冗余的其他节点可以处理新到的请求。这样就保证了服务器依然可用。但是在节点出现故障的那一刻,正在被处理的请求就可能无法得到正确的处理。那么带有容错功能的集群就可以确保请求能够被正确处理以及响应,哪怕是服务器出现了错误。
下面来看下DSS的集群架构。
可扩展性:可以动态添加节点,节点之间相互透明,没有任何联系。也可以动态删除节点。
故障检测:由负载均衡来完成,主要使用端口探测来完成。负载均衡会定时的探测节点的监听端口是否在正常状态,并且可以有数据交互。
负载均衡:DSS集群架构采用轮询分发机制,但是具有第四层交换功能,可以将带有会话信息的请求发送到同一节点上。当然这是由硬件来实现,性能也比较高,也正是因为该功能使得DSS各个节点之间可以完全隔绝。DSS集群在新到请求的分发策略是轮询。当产生会话以后DSS发返回给客户端一个下次请求的URL,此URL为http://IP:port/syncer?sid=1400xxxxxx,轻重sid后面的部分为URL重写后的会话id,DSS通过此URL来实现会话,并且负载均衡根据sid后面的4位数字完成分发,实现了会话粘滞功能。而新产生的请求都是http://IP:port/syncer,所以这种新的请求都会被分发到新一台节点上。
DSS集群在压力的分担上基本可以完成均衡分发,但这种情况也不是绝对的,因为每个节点上的压力和诸多因素构成,比如该节点正在受理的会话数,每个会话的最大存活时间,节点的能力等等因素。DSS集群只能保证分发到每个DSS节点的会话数量基本相等,但是对每个会话的处理时间每个节点上正在受理的会话数量以及每个节点的能力差异,都是毫无感知的。
我们真的需要完全负载均衡吗?
负载均衡只是一个相对的概念,越是想实现的完美,相应的成本也会高,包括实现成本,后后续的维护成本,我觉得一个复杂集群会给后续的维护成本大幅提高。
事实证明,DSS集群能够在大多数情况,实现良好的压力分担。
节点之间相互独立,没有任何干扰,无需使用共享内存来交互sessesion或是session复制,session复制不稳定,而且需要消耗一定的内存来存储session信息,并且为了达到安全的目的,往往需要的集群中至少可以找个俩分session的拷贝,防止单台节点故障后,该节点上缓存的session信息丢失,所以session缓存往往需要更多内存来支持。
缓存复制需要消耗带宽,在带宽有限的情况下,极有可能造成网络拥塞。
在PIM系统中,非常巧妙的利用URL重写避免了分布式应用,达到了大大简化编程,提高开发效率,降低维护难度的要求。以DSS为例,现网中DSS架构使用单机集群方式部署。在此文中将会列举3个DSS节点作为讲解使用,实际运营环境是有30台DSS节点。
每个节点相互独立,其他节点对于它本身是透明的,有效的消除了单个节点故障不会影响整个业务的运行。这里的故障检测由负载均衡来完成。如果其中DSS2发生故障,负载均衡会将新的请求发送到DSS1和DSS3。从而达到故障检测、一个节点出现故障不会影响整个业务。
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
分享到:
相关推荐
PPT模板 -龙湖新员工转正答辩模板.pptx
PPT模板 -生产计划管理.pptx
生产单元数字化改造23年国赛
图表效果及代码实现讲解链接:https://blog.csdn.net/zhangjiujiu/article/details/143997013
Pythonbot高斯网格图射线投射网格图激光雷达至网格地图k-均值对象聚类矩形接头大满贯迭代最近点 (ICP) 匹配FastSLAM 1.0路径规划动态窗口方法基于网格的搜索Dijkstra 算法A* 算法D*算法D* Lite 算法位场算法基于网格的覆盖路径规划国家网格规划偏极采样车道采样概率路线图(PRM)规划快速探索随机树(RRT)回程时间*RRT* 和 reeds-shepp 路径LQR-RRT*五次多项式规划Reeds Shepp 规划基于LQR的路径规划Frenet 框架中的最佳轨迹路径追踪移动到姿势控制斯坦利控制后轮反馈控制线性二次调节器 (LQR) 速度和转向控制模型预测速度和转向控制采用 C-GMRES 的非线性模型预测控制手臂导航N关节臂对点控制带避障功能的手臂导航航空导航无人机三维轨迹跟踪火箭动力着陆双足动物倒立摆双
SQL,全称为结构化查询语言(Structured Query Language),是用于管理和操作关系型数据库的标准化语言。它广泛应用于数据插入、查询、更新和删除等操作,并且拥有超过40年的历史,证明了其在数据处理领域的核心地位。以下是对SQL综合学习基础知识及练习题考试题实测题的介绍
java面向对象 - 类与对象 在Java编程语言中,面向对象编程(OOP)是一个核心概念。它强调以对象作为程序的基本单位,并将相关的数据和功能封装在对象中。类和对象是Java OOP的两个关键组成部分。 ### 类(Class) 类是一个模板或蓝图,它定义了对象的属性和行为。我们可以将类视为对象的类型或种类。通过类,我们可以创建(实例化)具有特定属性和行为的对象。 类的组成部分通常包括: 1. **成员变量**(属性):用于存储对象的状态或数据。 2. **方法**(行为):定义了对象可以执行的操作或功能。 3. **构造方法**:一种特殊类型的方法,用于在创建对象时初始化其状态。 4. **块**(如静态块、实例初始化块):用于执行类级别的初始化代码。 5. **嵌套类**:一个类可以包含其他类,这被称为嵌套或内部类。 ### 对象(Object) 对象是类的实例。它是根据类模板创建的具体实体,具有自己的状态和行为。每个对象都是其类的一个唯一实例,可以访问其类中定义的属性和方法。 创建对象的过程通常涉及以下几个步骤: 1. **声明**:指定对象的类型(即其所属的类
原生JS实现鼠标感应图片左右滚动代码.zip
随机密码生成器,支持字符、数字、字母大小写组合
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
内容概要:本文档为一份高级数学复习试题,内容涵盖线性代数、数值分析及最优化理论等领域,主要包括矩阵范数的计算、遗传算法中的变异操作、内点法解非线性优化问题、证明矩阵有互异特征值、求解矩阵的标准形以及应用单纯形法和FR共轭梯度法解决具体的数学问题等方面。 适合人群:正在备考研究生入学考试或者准备参加各类数学竞赛的学生、对高等数学感兴趣的学习者及从事相关领域科研工作的专业人士。 使用场景及目标:用于巩固和检验个人关于矩阵论、优化方法及概率统计的知识掌握情况,帮助应试者系统地复习相关考点,提高解题技巧。 阅读建议:建议结合具体题目深入理解每一个概念及其应用方式,遇到复杂的计算或证明步骤不妨动手尝试推导一次,这样有助于加深记忆并培养灵活运用知识的能力。同时,在理解算法原理的基础上,还可以参考一些实际案例来进行练习。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
Google Spreadsheet Python API v4Google Sheets 配合使用的简单界面。特征通过标题、关键字或URL打开电子表格。读取、写入和格式化单元格区域。共享和访问控制。批量更新。安装pip install gspread要求Python 3.8+。基本用法在 Google API 控制台中创建凭据开始使用 gspreadimport gspreadgc = gspread.service_account()# Open a sheet from a spreadsheet in one gowks = gc.open("Where is the money Lebowski?").sheet1# Update a range of cells using the top left corner addresswks.update([[1, 2], [3, 4]], "A1")# Or update a single cellwks.update_acell("B42", "it's
AICon 2024全球人工智能开发与应用大会(脱敏)PPT合集,共30份。 AI辅助编程测评与企业实践 SmartEV和AI 蔚来的思考与实践 下一代 RAG 引擎的技术挑战与实现 书生万象大模型的技术演进与应用探索 人工智能行业数据集构建及模型训练方法实践周华 全方位评测神经网络模型的基础能力 千亿参数 LLM 的训练效率优化 向量化与文档解析技术加速大模型RAG应用落地 基于大模型的缺陷静态检查 多环境下的 LLM Agent 应用与增强 大模型在华为推荐场景中的探索和应用 大模型在推荐系统中的落地实践 大模型的异构计算和加速 大模型辅助需求代码开发 大语言模型在法律领域的应用探索 大语言模型在计算机视觉领域的应用 大语言模型的幻觉检测 小米大模型端侧部署落地探索 快手可图大模型的技术演进与应用探索 提升大模型知识密度,做高效的终端智能 电商大模型及搜索应用实践 百度大模型 原生安全构建之路 硅基流动高性能低成本的大模型推理云实践 语言模型驱动的软件工具思考:可解释与可溯源 长文本大模型推理实践:以 KVCache 为中心的分离式推理架构 阿里云 AI 搜索 RAG 大模型优
子弹打穿金属后留下弹痕flash动画.zip
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
原生js竖直动画手风琴下拉菜单代码.zip
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
Centos6.x通过RPM包升级OpenSSH9.7最新版 升级有风险,前务必做好快照,以免升级后出现异常影响业务
营销策划 -阿道夫洗护品牌新品小红书新品营销方案.pptx