论当前一种先进实用的IT系统架构设计(修改版)_第1页
论当前一种先进实用的IT系统架构设计(修改版)_第2页
论当前一种先进实用的IT系统架构设计(修改版)_第3页
论当前一种先进实用的IT系统架构设计(修改版)_第4页
论当前一种先进实用的IT系统架构设计(修改版)_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、论当前一种先进实用的IT系统架构设计修改版                 万鸿                             &

2、#160;                                                 &

3、#160;               0 引言对用JAVA开发的项目来说,根据“成熟稳定、先进科学、实用可靠“的原则,设计使用这样一种架构,采用多个分布式集群来保证系统的高性能、高可靠性、伸缩性、可维护性和安全的需要,服务器可以线性扩展,使用开源免费软件和廉价服务器,提供极高的性价比。这个架构对java与其他语言如PHP、c#等开发的各类具有指导意义。1系统架构图   系统应用架构采用门户、应用系统、业务逻辑和基础

4、资源4层。服务器架构通过7个集群和4个负载均衡完成项目的功能。2架构设计2.1项目开发环境1.  开发语言、工具:JAVA 、eclipse。2.  技术架构采用jquery+SPRING3+mybatis。3.  采用测试工具进行严格测试,保证代码质量,如:junit、QTP、qc、ROBERT、LOADRUNNER等。4.  软件环境:maven、SVN(git)、tomcat,JDK7。5.  硬件环境:cpu:P3 3GHZ以上Memory:5G以上。2.2运行环境要求:硬件环境:服务器

5、端: 推荐配置为16G存以上,CPU为2.8GHZ以上配置,硬盘容量为500G以上的服务器。通信网络: 网络协议为 、TCP/IP。软件环境:服务器端:Ø     数据库服务器:mysql5.6。Ø     Web服务器:tomcat7Ø     服务器采用华硕服务器。Ø     服务器操作系统: linux centos6.5.Ø &#

6、160;   浏览器:Internet Explore8.0、firefox17,360浏览器6与以上版本。Ø     san存储,32T,RAID5,用于存储数据。屏幕分辨率推荐为:1024*768或以上。2.3服务器架构平台:1) Lvs+keepalived-1.2.8,2台集群做互联网访问的入口,或用array做入口,对HAPROXY进行负载均衡,中小型不需要这一层。 2)HAPROXY1.4+keepalived-1.2.8+Squid对squid服务器进行负载均衡,haproxy通过

7、主备工作,万一主haproxy有故障,可以自动切换到备用机,提高可用性。3) squid+tomcat缓存集群进行负载均衡,Squid对tomcat服务器进行静态页面缓存,应用服务器主要提供静态资源,也可提供动态页面,但不缓存。4) Tomcat7服务器进行5台集群。5) mysql数据库用2主多从,用haproxy对从数据库进行负载均衡。大型项目可用oracle rac 集群。6) 用3台redis3集群进行数据缓存。7) 用3台mongodb2.8集群存储图片、文档、视频、音乐等文件。8) 用1台solr5做搜索服务器。9) 用4台rocketMQ3集群传递消息,提供消

8、息总线,确保消息不会丢失,可以简化为2台。10)用1台ngios3.5监控服务器,发生异常时可发和短信。11)系统采用队列异步处理峰值高的请求,可以有效地处理高并发情况。对于秒杀、摇红包等高并发情况,用有损服务、保证关键任务的思路,可以分步奏处理请求,先简单分析处理,然后把请求放入队列,异步完成队列的任务。对请求数进行判断,如果超过峰值就拒绝请求,防止服务器崩溃。应用功能加以分解并模块化,保证请求的完成,互相不影响。腾讯就是用的这个办法削峰完成摇红包的每秒千万次访问的。这个架构先进实用,实现了分布式集群,消除了数据库I/O瓶颈,大大提升了性能,而且支持服务器线性扩展,具有极强的伸缩性,适当扩展

9、可以支持7X24每天数百万至数千万的访问量。具体配置可以根据需要灵活处理。在开发程序时要考虑分布式特点。采用淘宝的dubbo可以实现服务的分布式,把具体的服务放在不同的服务器集群上,为web服务器提供服务,效率高,实用性极强。2.4.架构逻辑设计2.4.1 KEEPLIVED+HAPROXY+squid集群用LVS+KEEPLIVED双机通过一个VIP(vitual  IP)对haproxy+keeplived双机进行负载均衡,haproxy对应用服务器集群进行负载均衡调度。请求首先在squid中查询,如果有数据,则返回页面,如果没有,则交给squid从tomcat中查询,并在squ

10、id中缓存页面。可以对不同的应用系统采用多个集群,根据需要灵活处理。LVS+KEEPLIVED对中小型系统不需要,对大型系统适合,相比于硬件负载均衡,性价比更高。2.4.2 squid+tomcat集群Squid对tomcat服务器集群进行负载均衡调度,Squid缓存服务器对应用服务器的静态页面进行缓存,对动态页面没有意义,如果squid中没有缓存页面,则访问tomcat。Haproxy用url hash把应用服务器和squid缓存服务器对应起来。2.4.3 mysql集群MySQL支持双主的设置,即两个MySQL节点互为主备,逻辑上仍按照主从的方式工作。这样做之后,在出现故障后切换主备会变的

11、很简单。 双主在设置时,只需将MySQL节点的配置文件复制一份,分别写入两个主数据库,但要修改相应的server-id,auto-increment-offset和master-host。修改auto-increment-offset就是为了让双主同时在一表中进行添加操作时不会出现id冲突,所以在两个节点上auto-increment-offset设置为不同的值就好。 在两个节点上都为对方创建用户。Mysql用2主多从,提供高性能服务,主数据库提供对数据库的写操作,从数据库进行读操作,实现了读写分离和数据库备份。从数据库可线性扩展。 用haproxy+keepli

12、ved双机对slave数据库进行负载均衡,提供对数据库的读操作。程序建立读写两个datasource,通过VIPwrite进行写操作,通过VIPread进行读操作。2.4.4mongodb图片服务器集群 mongodb集群保存图片、视频、文档、音乐等文件,可动态线性扩展,速度快,安全稳定,操作方便,可以存放海量数据,能承受高并发,可以使用廉价存储,服务器稳定性可以满足要求。2.4.5 RocketMQ服务器集群 通过RocketMQ方式建立消息集群,提供消息总线,支持负载均衡,同时又保证消息的可靠性。采用消息集群可以在系统之间或系统进行消息传递,实现分布式异步通讯。采用pu

13、ll方式更高效稳定。2.4.6 redis集群Redis缓存基于存,非常高效快速,还可保持到数据库,不会丢失。在Redis集群版本中,节点有责任/义务保存数据和自身状态,这其中包括把数据(key)映射到正确的节点。所有节点都应该自动探测集群中的其他节点,并且在发现故障节点之后把故障节点的从节点更改为主节点 Redis的集群是一个全网状的,通过TCP,每一个节点都与其他每个节点连接。在N个节点的集群中,每个节点有N-1个对外TCP连接,和N-1的传入连接。这些TCP连接一直保持着,不需要的时候才创建。2.4.7solr搜索服务器在 Solr 中,用户通过向部署在se

14、rvlet 容器中的 Solr Web 应用程序发送 请求来启动索引和搜索。Solr 接受请求,确定要使用的适当SolrRequestHandler,然后处理请求。通过 以同样的方式返回响应。以上的配置要进行优化,以提供更佳的性能。3架构剖析3.1负载均衡器解析负载均衡器(调度器)是一种采用各种分配算法把网络请求分散到一个服务器集群中的可用服务器上去,通过管理进入的Web数据流量和增加有效的网络带宽,从而使网络访问者获得尽可能最佳的联网体验的硬件设备。1、负载均衡器的工作层次:1)工作于tcp/udp层实现底层协议的负载均衡,请求在核中实现转发;2)工作于应用层,

15、支持特定的应用协议实现应用层的负载均衡,请求在用户空间中。工作于tcp/udp层的性能要比工作于应用层的负载均衡器的好得多,若请求数量没超过应用层负载均衡器的容量,应使用应用层的负载均衡器,它能直接于前端更好的解决请求。2、 / s协议层的负载均衡器1)tcp/udp层:lvs,haproxy2) 应用层:apache,nginx,haproxy,lig d,varnish,squid3.2 lvs解析LVS集群采用IP负载均衡技术和基于容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服

16、务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。3.3 keeplived解析Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,与应用层。3.4 haproxy

17、解析HAProxy提供高可用性、负载均衡、动静分离以与基于TCP和 应用的代 理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以千万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。实践证明,Haproxy比nginx性能更好。3.5 mysql解析MySQL被广泛地应用在Internet上的中

18、小型中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型为了降低总体拥有成本而选择了MySQL作为数据库。MariaDB是mysql原开发团队的杰作,google公司已转为使用MariaDB。Mysql成熟实用,稳定可靠,已在业界得到广泛的使用,mysql的性能比postgre优异,通过实际测试,可以看到mysql比postgre更强。淘宝就采用mysql集群,并对mysql的源码进行了修改。Mysql提供主从复制功能,主从服务器设置的稳健性得以提升,如果主服务器发生故障,可以把本来作为备份的从服务器提升为新的主服务器。在主从服务器上分开处理用户的请求,读的话,可以直接

19、读取备机数据,可获得更短的响应时间。用从服务器做数据备份而不会占用主服务器的系统资源。采用haproxy对从数据库进行负载均衡,提供高性能的读操作。实践证明,mysql-proxy,amoeba,master-master-manage、mysql cluster的性能不稳定,不建议使用。 一些或别的项目,可以采用mongodb代替mysql,性能更高,更稳定,更方便。3.6 redis解析Redis3集群实现一个高性能、线性可扩展的1000节点的集群。Redis集群没有最重要或者说中心节点,这个版本最主要的一个目标是设计一个线性可伸缩的功能。Redis集群没有任何的数据合并动作。写,直接是与

20、主节点通信,但同步到slave也有一个时间窗口。在可用性方面,除了master以与所有slave失效,不然一直可用。Redis集群为了数据的一致性可能牺牲部分允许单点故障的功能,所以当网络故障和节点发生故障时这个系统会尽力去保证数据的一致性和有效性。(这里我们认为节点故障是网络故障的一种特殊情况)为了解决单点故障的问题,我们同时需要masters 和 slaves。 即使主节点(master)和从节点(slave)在功能上是一致的,甚至说他们部署在同一台服务器上,从节点也仅用以替代故障的主节点。 实际上应该说 如果对从节点没有read-after-write(写并立即读取数据 以免在数据同步过

21、程中无法获取数据)的需求,那么从节点仅接受只读操作。已实现的子集Redis集群实现单一key在非分布式版本的Redis中的所有功能。对于复合操作比如求并集求交集之类则只实现在单个节点的操作。增加了hash tags的概念,主要用来强制把某些multi-key分配在一个节点。但是在resharding中,这些multi-key可能找不到。Redis集群版本将不再像独立版本一样支持多数据库,在集群版本中只有database 0,并且SELECT命令是不可用的。客户端与服务端在Redis集群版中的约定在Redis集群版本中,节点有责任/义务保存数据和自身状态,这其中包括把数据(key)映射到正确的节

22、点。所有节点都应该自动探测集群中的其他节点,并且在发现故障节点之后把故障节点的从节点更改为主节点。集群节点使用TCP bus和二进制协议进行互联并对任务进行分派。各节点使用gossip 协议发送ping packets给集群其他节点以确定其他节点是否正常工作。Cluster bus也可以用来在节点间执行PUB/SUB命令。当发现集群节点无应答的时候则会使用redirections errors -MOVED and -ASK命令并且会重定向至可用节点。理论上客户端可随意向集群中任意节点发送请求并获得重定向,也就是说客户端实际上并不用关心集群的状态。然而,客户端也可以缓存数据对应的节点这样可以免

23、去服务端进行重定向的工作,这在一定程度上可以提高效率。安全写Redis cluster节点之间通过异步复制,这样总会存在丢数据的窗口。但是client在连接master多的分区和少的分区的窗口是不一样的。Redis cluster在连接master多的分区的时候,尽量保证不丢写操作。除了下面两种情况:1)当一个写到达master,master已经回复client,但是master还没来的与复制到slave就宕机了,那么这个写操作就会丢失。直到其中一个slave被提拔为master。2)另外一种理论上可能丢失写操作的情况如下,一个master因为partition不可到达其中

24、一个slave获取master失败一会儿后master可以重新到达一个client没用更新路由表,还在向旧的master写实际上,这是不太可能发生,因为节点无法到达其他大多数master故障切换,不再接收写操作需要足够的时间,并当分区固定后,一段时间写操作仍然是拒绝的,让其他节点通知有关配置更改。Redis cluster会丢失很多写操作,当一个或多个客户端连接到一个少master分区时。因为如果这些master不可以到达多master的分区,这些写操作就会丢失。如果在NODE_TIMEOUT前不可到达,不会丢消息,如果在NODE_TIMEOUT后,会有消息丢失。(暂时不理解为啥不丢

25、消息)。可用性少master分区是不开用的,假设多master分区至少有一个不开到达master的slave,那么在NODE_TIMEOUT后,slave就会被选举为相应的master。假设一个master有一个slave,那么可用性为1-(1/(2*n-1)。性能在Redis中不在通过代理命令来确定给定键的节点,而是它们将客户端重定向到服务密钥空间的给定部分的节点。最终客户保存着集群和那个节点提供密钥的时间标识符,所以在正常操作期间,client直接联系合适的节点,以便发送给定的命令。因为使用异步复制的,节点不等待写入的其他节点的确认。此外,由于限制多个键执行操作命令的子集,如果不rshar

26、ding,数据从来不在节点之间移动。所以在单个Redis的实例下,正常操作处理可以完成的,在N个主节点Redis的集群,可以期望以单一的Redis实例一样的性能乘以N作为设计的线性扩展。在同一时间,通常在单次往返执行查询,因为客户通常保持与节点持久连接,以便和单个独立的Redis节点延迟性也是一样的。非常高的性能和弱(非CAP)的可扩展性,但合理的形式一致性和可用性是主要目标。为什么避免合并操作Redis集群设计避免了版本冲突的一样键值在多个节点,因为在Redis的数据模型下,这并不总是可取的:在Redis的值通常都非常大,这是经常可以看到的,列表或数百万元素的sorted set。另外,数据

27、类型在语义上是复杂的。转移和合并这些类型的值,可能需要的应用程序端逻辑实现。3.7 squid解析Squid作为网页服务器的前置cache服务器,可以代理用户向web服务器请求数据并进行缓存,也可以用在局域网中,使局域网用户通过代理上网。Squid主要设计用于在Linux一类系统运行。Squid是一个缓存internet数据的一个软件,可缓存html页面和图片等,它接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户想要下载一个主页时,它向Squid发出一个申请,要Squid替它下载,然后Squid 连接所申请并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的

28、页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。使用spring data redis访问redis简单高效。3.8 solr解析Solr是一个基于Lucene的Java搜索引擎服务器。Solr 提供了层面搜索、命中醒目显示并且支持多种输出格式(包括 XML/XSLT 和 JSON 格式)。它易于安装和配置,而且附带了一个基于 的管理界面。Solr已经在众多大型的中使用,较为成熟和稳定。Solr 包装并扩展了 Lucene,所以Solr的基本上沿用了Lucene的相关术语。更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。通过

29、对Solr 进行适当的配置,某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此外,很多 Lucene 工具(如Nutch、 Luke)也可以使用Solr 创建的索引。Solr对外提供标准的 接口来实现对数据的索引的增加、删除、修改、查询。在 Solr 中,用户通过向部署在servlet 容器中的 Solr Web 应用程序发送 请求来启动索引和搜索。Solr 接受请求,确定要使用的适当SolrRequestHandler,然后处理请求。通过 以同样的方式返回响应。默认

30、配置返回Solr 的标准 XML 响应,也可以配置Solr 的备用响应格式。用Apache Solr 搜索引擎构建 RESTful 基础存储服务,性能更好。3.9Nagios解析Nagios是一款广泛采用开源的免费网络监视工具,能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设置,打印机等。在系统或服务状态异常时发出或短信报警第一时间通知运维人员,在状态恢复后发出正常的或短信通知。3.10 RocketMQ解析阿里巴巴的RocketMQ是一款分布式、队列模型的消息中间件,是目前最优秀的消息中间件,具有以下特点:1、支持严格的消息顺序;2、支持To

31、pic与Queue两种模式;3、亿级消息堆积能力;4、比较友好的分布式特性;5、同时支持Push与Pull方式消费消息;3.11Mongodb解析MongoDB是目前IT行业最流行的数据库之一,百度、腾讯、360、京东等大型互联网公司已经将MongoDB投入实际的生产环境。MongoDB实现用副本集完成集群,主从复制,每台机器都可以是主机,也可以是副机,都可以成为leader,自动故障转移,但负载均衡不够好。MongoDB的事务管理比较强大,用两阶段提交实现事务。使用spring data mongodb访问MongoDB,简单高效。MongoDB数据库中操作单个文档总是原子性的,然而,涉与多

32、个文档的操作,通常被作为一个“事务”,而不是原子性的。因为文档可以是相当复杂并且包含多个嵌套文档,单文档的原子性对许多实际用例提供了支持。尽管单文档操作是原子性的,在某些情况下,需要多文档事务。在这些情况下,使用两阶段提交,提供这些类型的多文档更新支持。因为文档可以表示为Pending数据和状态,可以使用一个两阶段提交确保数据是一致的,在一个错误的情况下,事务前的状态是可恢复的。MongoDB是一个非常灵活的数据库。像mysql,sqlserver,oracle这些传统数据库,它们的模式非常 固定,在开发之前设计好模式,一旦设计好模式以后修改很麻烦,这对敏捷式开发不是很方便。 而MongoDB

33、的模式非常灵活,它不要求你建模式,你的程序怎么样写都可以,所以它的灵活性是程序员很喜欢的。MongoDB的文档模型。以前是关系模型,它跟文档模型最大的不同就是,关系模型要把所有东西分开到各个地方去放;而文档模型是把相关的东西放到一块,这样的话使用起来非常方便。程序员是面向对象的思维方式,MongoDB是类似对象的结构,它是从对象到对象之间,没有思维转换,而不同于从对象到关系型转换,需要换一种思维去思考,比较复杂一点,这就是另外一点为什么程序员喜欢用MongoDB。MongoDB用起来比较容易,接口非常方便,不像其他传统数据库要学习专门的SQL语言,MongoDB兼顾编程的接口。MongoDB与

34、传统数据库的区别非常大的一点就是它的水平扩展性非常好。现在是大数据时代,大数据要求的性能非常高,因为它要求管理的数据量非 常大。Mysql或其他的关系型数据库一般是单机式的,也就是在一台机器上可以做的很好,但是一旦涉与到分布式容,基本上没有很好的方案,而 MongoDB是一种分布式的数据库,它在设计的时候是分布在不同的机器上,同时并发进行,这样的话处理这个时代的大数据比较流行。从MongoDB的功能性、扩展性、高可用性上来讲,如果你需要这样的需求的话,MongoDB会非常适合,MongoDB分布 式数据可以做的很好。MongoDB地理空间能做的很好,目前移动应用非常流行,比如快的打车,他们就是以MongoDB作为核心技术,来找到附近几公里的出租车司机,还有其他一些手机应用,它会跟踪你的位置,需要知道你的位置,都可以用到MongoDB。从应用场景的角度来说的话,MongoDB还可以做分析型数据库,特别是需要把各种各样的数据源放到一起对已有数据做二次开发的时 候,因为MongoDB的文档模型非常灵活,可以利用其支持异构数据的特性让你从各个数据源集中到一个库里,然后在已有数据上提取更多的价值,这是它非常擅长的地方。另外一个像物联网,也是比较常用,物联网

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论