delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

14 Sep 2009

使用DSR模式实现单IP服务冗余

FreeBSD支持以DSR(Direct Server Return,即服务器直接将流量通过路由器返回,而不经过负载平衡设备;俗称"单臂模式")模式提供服务。为了改善服务的可用性,可以使用这种方法来配置服务器。这种方法非常适合于大并发、大流量的环境。

网络及服务器的规划

首先,需要对服务可能产生的负载、流量进行估计,并据此设计网络的结构。DSR结构极大地降低了负载平衡设备成为瓶颈的可能,但仍对它们有一些要求,因此,设计者需要考虑下面一些问题:

  • 如何在服务器之间分摊负载。简单地说,就是应平均地分配流量,还是根据一些特征,例如会话等等去分配流量?原则上,网络设备对于协议本身所做的计算越少,它们所需要消耗的性能就越少,合理的设计应尽可能减少对网络设备在这方面的依赖,以改善整个系统的可扩充性。靠近应用层的规则往往会比靠近物理层的规则消耗更多的计算资源,因此应用的设计者应当尽可能将这部分开销考虑在内。
  • 网络设备的背板带宽。接入层交换机的容量是有限的,在考虑成本的前提下,有时出于性能考虑,很可能会希望使用不同的网络设备,而不是仅仅采用VLAN来划分不同的网络。
  • 了解可能出现瓶颈的点,并予以因应。

服务器配置

DSR结构对服务器有这样一些要求:

  • 接入Internet的网络端口不应发出或响应ARP请求。具备三层能力的交换机在看到ARP请求时,会将二层地址(MAC地址)和三层地址(IP地址)予以绑定。因此,在这些交换机看来,拥有公网IP地址的端口应该是负载平衡设备,而不是最终提供服务的服务器。
  • 服务器上应绑定提供服务的公网IP地址。操作系统通常只处理发到本机的IP包。
  • 服务器上应绑定公网路由器的MAC地址。操作系统的TCP/IP协议栈会发二层包到公网路由器。
  • (可选)服务器应配置两组,而不是一组默认路由。严格地说这并不是必需的,因为提供服务的服务器并不一定需要直接主动发起访问 Internet 的请求,例如,它们可以使用有内网IP地址的代理服务器。
  • 每一台实际提供服务的服务器应拥有一个唯一的内网IP地址。

在FreeBSD上,这可以通过在 rc.conf 中的网卡配置中增加"-arp"参数,并配置 static_arp (9.0和更高版本,我会在稍后将其MFC)来实现。

负载平衡设备配置

在负载平衡设备上,在实现DSR结构时,这些设备扮演的角色是 路由器,而不是 NAT 网关。也就是说,它们的作用是将来自客户端的访问 IP 包直接 路由 到服务器的内网地址(说明:此时,这些内网 IP 地址会被当作"下一跳";负载平衡设备查找本地 ARP 表并将数据包在2层上直接传递给对应的服务器;而服务器看到的数据包的目的地址仍是提供服务的那个公网IP)。

FreeBSD pf规则举例:pass in on em0 route-to { em1 内网IP1, em1 内网IP2, em1 内网IP3 } round-robin proto tcp from any to 公网IP port http keep state (sloppy)

其中,(sloppy)需要比较新版本的pf。目前的 FreeBSD 版本并不支持这一用法。可以使用 这个 补丁。这个选项表示pf应使用较为宽松的状态机;如果不需要状态(DNS协议通常不需要保持完整的会话,因为通常不会有很大的请求包)则不需要keep state和(sloppy)配置。