﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-心有多大舞台便有多大-文章分类-架构</title><link>http://www.blogjava.net/jjwwhmm/category/33058.html</link><description>Embrace changes, pursue excellence, share niceness.     MSN:fanci521@hotmail.com
</description><language>zh-cn</language><lastBuildDate>Tue, 13 Jan 2009 03:24:43 GMT</lastBuildDate><pubDate>Tue, 13 Jan 2009 03:24:43 GMT</pubDate><ttl>60</ttl><item><title>(转载)使用LVS（Linux Virtual Server）在Linux上搭建负载均衡的集群服务</title><link>http://www.blogjava.net/jjwwhmm/articles/250996.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Mon, 12 Jan 2009 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/articles/250996.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/250996.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/articles/250996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/250996.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/250996.html</trackback:ping><description><![CDATA[使用LVS（Linux Virtual Server）在Linux上搭建负载均衡的集群服务<br />
<br />
<pre>一、基于于NAT的LVS的安装与配置。
1. 硬件需求和网络拓扑
________
|        |
| 客户端 | (互连网)
|________|
|
(router)
202.99.59.1(director GW)
|
|
(202.99.59.110)Virtual IP
____|_____
|          | (控制器有两块网卡)
| director |
|__________|
(192.168.10.254)DIP
|
-----------------+----------------
|                |               |
RIP1             RIP2            RIPx
____________     ____________     ____________
|192.168.10.1|   |192.168.10.2|   |192.168.10.x|
|realserver1 |   |realserver2 |   |realserverx |
|____________|   |____________|   |____________|
</pre>
<p>2.下载软件：
<p>(1)、内核源代码：需要下载2.4.23以后版本的内核源代码。下载地址为http://www.kerner.org。本文中下载的内核源代为：linux-2.4.30.tar.bz2。
<p>(2)、用户配置工具ipvsadm，下载地址：http://www.linuxvirtualserver.org/software/ipvs.html。本文下载的是：http://www.linuxvirtualserver.org/software/kernel-2.4/ipvsadm-1.21-11.tar.gz
<p>3.安装软件：
<p>在director(控制器，202.99.59.110)上安装支持LVS的内核和配置工具ipvsadm。
<p>(1)、在内核配置时以下选项必须选：<br />
<pre>Networking options  ---&gt;
&lt;*&gt; Packet socket
&lt;*&gt; Netlink device emulation
[*] TCP/IP networking
[*]   IP: advanced router
[*] Network packet filtering (replaces ipchains)
IP: Netfilter Configuration  ---&gt;
&lt;*&gt; Connection tracking (required for masq/NAT)
&lt;*&gt; IP tables support (required for filtering/masq/NAT)
&lt;*&gt;   Full NAT
&lt;*&gt;     MASQUERADE target support
IP: Virtual Server Configuration  ---&gt;
&lt;*&gt; virtual server support (EXPERIMENTAL)
(12)   IPVS connection table size (the Nth power of 2)
--- IPVS scheduler
&lt;M&gt;   round-robin scheduling
&lt;M&gt;   weighted round-robin scheduling
&lt;M&gt;   least-connection scheduling
&lt;M&gt;   weighted least-connection scheduling
&lt;M&gt;   locality-based least-connection scheduling
&lt;M&gt;   locality-based least-connection with replication scheduling
&lt;M&gt;   destination hashing scheduling
&lt;M&gt;   shortest expected delay scheduling
&lt;M&gt;   never queue scheduling
</pre>
<p>(2)、编译和安装内核
<p>分别执行: make bzImage;make modules;make modules_install；然后编辑启动配置文件，重新启动系统，在启动时选择新的内核。
<p>系统启动后要确认内核是否支持ipvs，只需要执行下面的命令即可：grep ip_vs_init /boot/System.map
<p>(3)、编译和安装ipvsadm <br />
ln -s /usr/src/linux-2.4.30 /usr/src/linux tar -zxvf ipvsadm-1.21-11.tar.gz<br />
cd ipvsadm-1.21-11<br />
make all<br />
make install<br />
<p>然后运行：ipvsadm --version命令，应该有下面的内容输出：<br />
ipvsadm v1.21 2004/02/23 (compiled with popt and IPVS v1.0.12)
<p>4. 配置LVS
<p>(1)、在202.99.59.110上：<br />
echo "1" &gt;/proc/sys/net/ipv4/ip_forward<br />
echo "0" &gt;/proc/sys/net/ipv4/conf/all/send_redirects<br />
echo "0" &gt;/proc/sys/net/ipv4/conf/default/send_redirects<br />
echo "0" &gt;/proc/sys/net/ipv4/conf/eth0/send_redirects<br />
echo "0" &gt;/proc/sys/net/ipv4/conf/eth1/send_redirects<br />
<p>清除ipvsadm表：<br />
/sbin/ipvsadm -C <br />
<p>使用ipvsadm安装LVS服务<br />
#add http to VIP with rr sheduling<br />
/sbin/ipvsadm -A -t 202.99.59.110:80 -s rr <br />
<p>增加第一台realserver：<br />
#forward http to realserver 192.168.10.1 using LVS-NAT (-m), with weight=1 <br />
/sbin/ipvsadm -a -t 202.99.59.110:80 -r 192.168.10.1:80 -m -w 1
<p>增加第二台realserver：<br />
#forward http to realserver 192.168.10.2 using LVS-NAT (-m), with weight=1 <br />
/sbin/ipvsadm -a -t 202.99.59.110:80 -r 192.168.10.2:80 -m -w 1
<p>&nbsp;</p>
<p>(2)、realserver配置<br />
在192.168.10.1(realserver1)和192.168.10.2(realserver2)上分别将其网关设置为192.168.10.254，并分别启动apache服务。
<p>在客户端使用浏览器多次访问：http://202.99.59.110/，然后再202.99.59.110上运行ipvsadm命令，应该有类似下面的输出：<br />
<pre>IP Virtual Server version 1.0.12 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  202.99.59.110:http rr
-&gt; 192.168.10.1:http           Masq    1      0          33
-&gt; 192.168.10.2:http           Masq    1      0          33
</pre>
<p>从上面的结果可以看出，我们的LVS服务器已经成功运行。
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>二、基于直接路由(DR)的LVS的配置
<pre>1.硬件需求和网络拓扑：
________
|        |
| 客户端 | (互连网)
|________|
|
(router)
202.99.59.1(director GW)
|
__________    |
|          |   |   (VIP=202.99.59.110, eth0:110)
| director |---|  (控制器有一块网卡，且与realserver1和realserver2在同一网段)
|__________|   |   DIP=202.99.59.109 (eth0)
|
-----------------------------------
|                                 |
RIP=202.99.59.108(eth0)             RIP=202.99.59.107(eth0)
(VIP=202.99.59.110, lo:0)          (VIP=202.99.59.110, lo:0)
____________                       ____________
|            |                     |            |
|realserver1 |                     |realserver2 |
|____________|                     |____________|
</pre>
<p>2.安装软件：<br />
<p>在director(202.99.59.109)上安装上面的方法安装内核和管理软件。
<p>&nbsp;</p>
<p>3. 配置LVS
<p>(1)、在202.99.59.109上：<br />
<pre>修改内核运行参数，即修改/etc/sysctl.conf文件的内容如下：
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.eth0.send_redirects = 1
然后执行下面的命令是对内核修改的参数立即生效：
sysctl -p
配置VIP地址：
/sbin/ifconfig eth0:0 202.99.59.110 broadcast 202.99.59.110 netmask 255.255.255.255 up
/sbin/route add -host 202.99.59.110 dev eth0:0
清除ipvsadm表:
/sbin/ipvsadm -C
使用ipvsadm安装LVS服务：
/sbin/ipvsadm -A -t 192.168.1.110:http -s rr
增加realserver：
#forward http to realserver using direct routing with weight 1
/sbin/ipvsadm -a -t 192.168.1.110:http -r 192.168.1.12 -g -w 1
/sbin/ipvsadm -a -t 192.168.1.110:http -r 192.168.1.12 -g -w 1
</pre>
<p>(2)在realserver1(202.99.59.108)和realserver2(202.99.59.107)上做下面的设置。<br />
<pre>修改内核运行参数，即修改/etc/sysctl.conf文件的内容如下：
net.ipv4.ip_forward = 0
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
然后执行下面的命令是对内核修改的参数立即生效：
sysctl -p
配置VIP地址：
/sbin/ifconfig lo:0 202.99.59.110 broadcast 202.99.59.110 netmask 255.255.255.255 up
/sbin/route add -host 202.99.59.110 dev lo:0
</pre>
p&gt;在客户端使用浏览器多次访问：http://202.99.59.110/，然后再202.99.59.110上运行ipvsadm命令，应该有类似下面的输出：<br />
<pre>IP Virtual Server version 1.0.12 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.254:http rr
-&gt; 192.168.100.3:http           Route   1      0          28
-&gt; 192.168.100.2:http           Route   1      0          29
</pre>
<p>从上面的结果可以看出，我们的LVS服务器已经成功运行。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在面的实例中ipvsadm用到的几个参数含义如下：<br />
<p>-A 增加一个虚拟服务，该服务由协议、IP地址和端口号组成，例如：<br />
-A -t 202.99.59.110:80 (增加一格虚拟服务，其协议(-t表示tcp，-u表示udp)为TCP、IP为202.99.59.110、端口号为80。
<p>-s 指定服务采用的算法，常用的算法参数如下：<br />
<ul>
    <p>
    <li>rr &nbsp;&nbsp;轮叫（Round Robin）<br />
    调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上，它均等地对待每一台服务 器，而不管服务器上实际的连接数和系统负载。
    <p>&nbsp;</p>
    <li>wrr &nbsp;&nbsp;加权轮叫（Weighted Round Robin）<br />
    调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况，并动态地调整其权值。
    <p>&nbsp;</p>
    <li>lc &nbsp;&nbsp;最少链接（Least Connections）<br />
    调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能，采用"最小连接"调度算法可以较好地均衡负载。
    <p>&nbsp;</p>
    <li>wlc &nbsp;&nbsp;加权最少链接（Weighted Least Connections）<br />
    在集群系统中的服务器性能差异较大的情况下，调度器采用"加权最少链接"调度算法优化负载均衡性能，具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况，并动态地调整其权值。
    <p>&nbsp;</p>
    <li>lblc &nbsp;&nbsp;基于局部性的最少链接（Locality-Based Least Connections）<br />
    "基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡，目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器，若该服务器是可用的且没有超载，将请求发送到该服务器；若服务器不存在，或者该服务器超载且有服务器处于一半的工作负载，则用"最少链接"的原则选出一个可用的服务器，将请求发送到该服务器。
    <p>&nbsp;</p>
    <li>lblcr &nbsp;&nbsp;带复制的基于局部性最少链接（Locality-Based Least Connections with Replication）<br />
    "带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡，目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射，而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组，按"最小连接"原则从服务器组中选出一台服务器，若服务器没有超载，将请求发送到该服务器，若服务器超载；则按"最小连接"原则从这个集群中选出一台服务器，将该服务器加入到服务器组中，将请求发送到该服务器。同时，当该服务器组有一段时间没有被修改，将最忙的服务器从服务器组中删除，以降低复制的程度。
    <p>&nbsp;</p>
    <li>dh &nbsp;&nbsp;目标地址散列（Destination Hashing）<br />
    "目标地址散列"调度算法根据请求的目标IP地址，作为散列键（Hash Key）从静态分配的散列表找出对应的服务器，若该服务器是可用的且未超载，将请求发送到该服务器，否则返回空。
    <p>&nbsp;</p>
    <li>sh &nbsp;&nbsp;源地址散列（Source Hashing）<br />
    "源地址散列"调度算法根据请求的源IP地址，作为散列键（Hash Key）从静态分配的散列表找出对应的服务器，若该服务器是可用的且未超载，将请求发送到该服务器，否则返回空。 </li>
</ul>
<p>/sbin/ipvsadm -a -t 192.168.1.110:http -r 192.168.1.12 -g -w 1
<p>-a 表示往一个服务内增加一个real server
<p>-r 指定real server的IP地址
<p>-w 表示权重
<p>-g 表示使用DR方式，-m表示NAT方式，-i表示tunneling方式。 </p>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/250996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2009-01-12 17:38 <a href="http://www.blogjava.net/jjwwhmm/articles/250996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]说说大型高并发高负载网站的系统架构（更新）[Michael]</title><link>http://www.blogjava.net/jjwwhmm/articles/218311.html</link><dc:creator>pony</dc:creator><author>pony</author><pubDate>Tue, 29 Jul 2008 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/jjwwhmm/articles/218311.html</guid><wfw:comment>http://www.blogjava.net/jjwwhmm/comments/218311.html</wfw:comment><comments>http://www.blogjava.net/jjwwhmm/articles/218311.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/jjwwhmm/comments/commentRss/218311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jjwwhmm/services/trackbacks/218311.html</trackback:ping><description><![CDATA[<h1 class="block_title"><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/wangdei/archive/2008/07/28/218135.html">说说大型高并发高负载网站的系统架构（更新）[Michael]</a></h1>
<div class="post">
<div class="postcontent">另外看Michael更新了他的那篇经典的文章，为了让更多的人能够看到，决定转载过来。<br />
<br />
我在CERNET做过拨号接入平台的搭建，而后在Yahoo&amp;3721从事过搜索引擎前端开发，又在MOP处理过大型社区猫扑大杂烩的架构升级等工作，同时自己接触和开发过不少大中型网站的模块，因此在大型网站应对高负载和并发的解决方案上有一些积累和经验，可以和大家一起探讨一下。<br />
<br />
<br />
　　一个小型的网站，比如个人网站，可以使用最简单的html静态页面就实现了，配合一些图片达到美化效果，所有的页面均存放在一个目录下，这样的网站对系统架构、性能的要求都很简单，随着互联网业务的不断丰富，网站相关的技术经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所采用的技术更是涉及面非常广，从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求，已经不是原来简单的html静态网站所能比拟的。<br />
<br />
　　大型网站，比如门户网站。在面对大量用户访问、高并发请求方面，基本的解决方案集中在这样几个环节：使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面，还没法根本解决大型网站面临的高负载和高并发问题。<br />
<br />
　　上面提供的几个解决思路在一定程度上也意味着更大的投入，并且这样的解决思路具备瓶颈，没有很好的扩展性，下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。<br />
<br />
<span style="color: #ff0000">1、HTML静态化</span><br />
　　其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统CMS，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。<br />
<br />
　　除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。目前很多博客也都实现了静态化，我使用的这个Blog程序WordPress还没有静态化，所以如果面对高负载访问，<a href="http://www.bt285.cn/">www.bt285.cn</a>一定不能承受&nbsp;&nbsp;<br />
<br />
　　同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。<br />
<br />
　　在进行html静态化的时候可以使用一种折中的方法，就是前端使用动态实现，在一定的策略下进行定时静态化和定时判断调用，这个能实现很多灵活性的操作，我开发的小说网站故人居(<a href="http://www.5a520.cn/">www.5a520.cn</a>)就是使用了这样的方法，我通过设定一些html静态化的时间间隔来对动态网站内容进行缓存，达到分担大部分的压力到静态页面上，可以应用于中小型网站的架构上。小说网站的地址：http://<a href="http://www.5a520.cn/">www.5a520.cn</a>，顺便提一下，有喜欢小说的朋友多多支持我这个免费网站:)<br />
<br />
<span style="color: #ff0000">2、图片服务器分离</span><br />
　　大家知道，对于Web服务器来说，不管是Apache、IIS还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃。<br />
<br />
　　在应用服务器和图片服务器上，可以进行不同的配置优化，比如Apache在配置ContentType的时候可以尽量少支持，尽可能少的LoadModule，保证更高的系统消耗和执行效率。<br />
<br />
　　我的台球网站故人居8zone.cn也使用了图片服务器架构上的分离，目前是仅仅是架构上分离，物理上没有分离，由于没有钱买更多的服务器:)，大家可以看到故人居上的图片连接都是类似img.9tmd.com或者img1.9tmd.com的URL。<br />
<br />
　　<span style="color: #ff0000">另外，在处理静态页面或者图片、js等访问方面，可以考虑使用lighttpd代替Apache，它提供了更轻量级和更高效的处理能力。</span><br />
<br />
<span style="color: #ff0000">3、数据库集群和库表散列</span><br />
　　大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。<br />
<br />
　　在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的MySQL提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。<br />
<br />
　　上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。<br />
<br />
<span style="color: #ff0000">4、缓存</span><br />
　　缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。<br />
<br />
　　架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的mod_proxy缓存模块，也可以使用外加的Squid进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。<br />
<br />
　　网站程序开发方面的缓存，Linux上提供的Memcached是常用的缓存方案，不少web编程语言都提供memcache访问接口，php、perl、c和java都有，可以在web开发中使用，可以实时或者Cron的把数据、对象等内容进行缓存，策略非常灵活。一些大型社区使用了这样的架构。<br />
<br />
　　另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，PHP有Pear的Cache模块和eAccelerator加速和Cache模块，还要知名的Apc、XCache（国人开发的，支持！）php缓存模块，Java就更多了，.net不是很熟悉，相信也肯定有。<br />
<br />
<span style="color: #ff0000">5、镜像</span><br />
　　镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如Linux上的rsync等工具。<br />
<br />
<span style="color: #ff0000">6、负载均衡</span><br />
　　负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。<br />
<br />
　　负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。另外有关初级的负载均衡DNS轮循和较专业的CDN架构就不多说了。<br />
<br />
<span style="color: #ff0000">6.1 硬件四层交换</span><br />
　　第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上，需要复杂的载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。<br />
<br />
　　在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。<br />
<br />
<span style="color: #ff0000">6.2 软件四层交换</span><br />
　　大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。<br />
<br />
　　软件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux Virtual Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满足多种应用需求，这对于分布式的系统来说必不可少。<br />
<br />
　　一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。<br />
<br />
<span style="color: #ff0000">6.3 七层交换</span><br />
　　大家都知道TCP/IP的七层协议，四层交换是基于传输层的，在这一层只能处理连接的管理，但是无法和业务关联起来，通常只能针对tcp、udp的连接来进行处理，而真正的业务逻辑需要后面的服务器群自己来处理，随着技术的发展，今天，我们在很多高级的应用中出现了七层交换。<br />
<br />
七层交换是基于TCP/IP的第七层应用层来实现的，在这一层上，首先我们可以区分出具体的应用，比如HTTP、TELNET、FTP、DNS等等，还能根据应用中传送的内容来进行策略的管理，比如我们有这么两个网站的路径 a.com/music/&#8230; 和a.com/photo/&#8230;&nbsp;<a href="http://www.yaonba.com.cn/">NBA</a>,<a href="http://www.5a520.cn/">小说520</a>&nbsp;,<a href="http://www.bt285.cn/">BT下载</a>,原来基于四层交换只能把这两个url的请求都分发到后面一组服务器上，但是七层交换可以判断访问的是music/还是photo/路径，然后分别分发到不通的服务器群上，从而实现更灵活的系统架构设计。<br />
<br />
当然，七层交换也分硬件和软件的实现方式，在这里我不细说了，硬件有著名的F5、Nortel等，软件有Haproxy等，当然，七层交换的软件目前还是在性能上要远远差别于硬件实现的，要知道，这些硬件都价格不菲&nbsp;&nbsp;<br />
<br />
总结：<br />
　　
<div>
<div>引用</div>
<div>对于大型网站来说，前面提到的每个方法可能都会被同时使用到，Michael这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。</div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/jjwwhmm/aggbug/218311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jjwwhmm/" target="_blank">pony</a> 2008-07-29 11:25 <a href="http://www.blogjava.net/jjwwhmm/articles/218311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>