文章
服务器与存储管理
2012 年 6 月发布
本文介绍了如何将内置的集成负载平衡器 (ILB) 与 Oracle Solaris 区域和 Oracle Solaris 11 中的新网络虚拟化功能相结合,在单个系统上设置虚拟服务器。本文首先简要介绍 ILB,之后给出了一个设置虚拟 Apache Tomcat 服务器实例的示例。您需要具备 Oracle Solaris 区域和网络管理方面的基本知识。
|
ILB 为安装在 SPARC 系统和 x86 系统上的 Oracle Solaris 操作系统提供了第 3 层和第 4 层负载平衡功能,也就是说,它在网络层 (IP) 和传输层 (TCP/UDP) 中工作 。ILB 截获客户端传来的请求,根据负载平衡规则判断应由哪个后端服务器处理请求,然后将该请求转发到选定的服务器。ILB 执行可选的运行状况检查,并为负载平衡算法提供数据,以验证选定服务器能否处理传入的请求。
注:使用全 NAT 模式的原因之一就是无需在 ILB 机器以外设置特殊路由。例如,如果部门 A 管理 ILB 机器,而后端服务器和网络由另外一个部门负责,那么部门 A 可以使用全 NAT 模式进行负载平衡。全部请求均首先进入 ILB 机器;ILB 将请求的目标 IP 地址更改为后端服务器拥有的 IP 地址;将请求的源 IP 地址替换为 ILB 拥有的地址,并将请求转发到后端服务器。后端服务器对请求进行处理,就像处理内部系统发出的请求那样。因此无需对后端服务器进行特殊设置,也不需要设置特殊路由。
ilbadm CLI:您可以使用该界面配置负载平衡规则,执行可选运行状况检查以及查看统计信息。libilb 配置库:ilbadm 和其他第三方应用可以利用 libilb 中实现的功能管理 ILB。ilbd 后台程序:此后台程序执行以下任务: 有关 ILB 的其他信息,请查看 Oracle Solaris 管理:IP 服务 指南。
该示例使用半 NAT 模式,即请求到达 ILB 时,ILB 将重写真实服务器的目标 IP 地址;保留源 IP 地址。这种模式通常适用于服务器日志记录(如需了解更多信息,请参阅 Oracle Solaris 管理:IP 服务 指南中的“ILB 运行模式”)。
该示例将跨两个运行 Apache Tomcat 服务器的区域,对传入虚拟服务器(IP 地址为 10.0.2.20)的流量进行负载平衡。负载平衡器本身将被配置为多主区域 (ilb-zone),如图 1 所示。ilb-zone (10.0.2.16/24) 的一个接口连接到外部网络。另一个接口 (192.168.1.21/24) 连接到同一系统中托管的虚拟网络。在 ILB 中,地址 10.0.2.20 被称为负载平衡规则的虚拟 IP 地址 (VIP)。

图 1.虚拟 Apache Tomcat 服务器示例图
第一步是为不同的区域创建一系列虚拟网络接口 (VNIC) 和虚拟交换机 (etherstub):
root@solaris:~# dladm create-vnic -l e1000g0 ilb0 root@solaris:~# dladm create-etherstub priv_net0 root@solaris:~# dladm create-vnic -l priv_net0 ilb1 root@solaris:~# dladm create-vnic -l priv_net0 server1 root@solaris:~# dladm create-vnic -l priv_net0 server2
etherstub priv_net0 用作系统内的虚拟网络,连接 ILB 区域和运行 Apache Tomcat 服务器的两个区域。这意味着 Apache Tomcat 服务器仅可通过 ilb-zone 访问。
如果您的区域还没有文件系统,请执行以下命令:
root@solaris:~# zfs create -o mountpoint=/zones rpool/zones
然后创建 ILB 区域,如清单 1 所示:
root@solaris:~# zonecfg -z ilb-zone ilb-zone: No such zone configured Use 'create' to begin configuring a new zone. zonecfg:ilb-zone> create zonecfg:ilb-zone> set zonepath=/zones/ilb-zone zonecfg:ilb-zone> add net zonecfg:ilb-zone:net> set physical=ilb0 zonecfg:ilb-zone:net> end zonecfg:ilb-zone> add net zonecfg:ilb-zone:net> set physical=ilb1 zonecfg:ilb-zone:net> end zonecfg:ilb-zone> verify zonecfg:ilb-zone> exit
清单 1.创建 ILB 区域
创建服务器区域 server1-zone 和 server2-zone,如清单 2 所示:
root@solaris:~# zonecfg -z server1-zone server1-zone: No such zone configured Use 'create' to begin configuring a new zone. zonecfg:server1-zone> create zonecfg:server1-zone> set zonepath=/zones/server1-zone zonecfg:server1-zone> add net zonecfg:server1-zone:net> set physical=server1 zonecfg:server1-zone:net> end zonecfg:server1-zone> verify zonecfg:server1-zone> exit root@solaris:~# zonecfg -z server2-zone server2-zone: No such zone configured Use 'create' to begin configuring a new zone. zonecfg:server1-zone> create zonecfg:server1-zone> set zonepath=/zones/server2-zone zonecfg:server1-zone> add net zonecfg:server1-zone:net> set physical=server2 zonecfg:server1-zone:net> end zonecfg:server1-zone> verify zonecfg:server1-zone> exit
清单 2.创建服务器区域
ilb-zone)区域的配置至此完成,接下来就需要安装区域了。我们将使用默认的区域系统配置,在初次引导时会交互地问我们一些问题。完成区域的安装之后(本例为 ilb-zone),可在几秒钟内快速克隆区域。
root@solaris:~# zoneadm -z ilb-zone install
A ZFS file system has been created for this zone.
Progress being logged to /var/log/zones/zoneadm.20111107T101755Z.ilb-zone.install
Image: Preparing at /zones/ilb-zone/root.
Install Log: /system/volatile/install.9968/install_log
AI Manifest: /tmp/manifest.xml.QBaGZe
SC Profile: /usr/share/auto_install/sc_profiles/enable_sci.xml
Zonename: ilb-zone
Installation: Starting ...
Creating IPS image
Installing packages from:
solaris
origin: http://pkg.oracle.com/solaris/release
...
...
Done: Installation completed in 605.138 seconds.
Next Steps: Boot the zone, then log into the zone console (zlogin -C) to
complete the configuration process
Log saved in non-global zone as /zones/ilb-zone/root/var/log/zones/zoneadm.20111107T101755Z.ilb-zone.install
清单 3.安装区域
引导 ilb-zone 并查看已创建区域的状态:
root@solaris:~# zoneadm -z ilb-zone boot root@solaris:~# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared 1 ilb-zone running /zones/ilb-zone solaris excl - server1-zone configured /zones/server1-zone solaris excl - server2-zone configured /zones/server2-zone solaris excl root@solaris:~# zlogin -C ilb-zone [Connected to zone 'ilb-zone' console]
登录到该区域之后,首先显示的是系统配置工具。这个交互式工具将引导您完成各种系统配置任务。在本示例中,我们对 ilb-zone 区域使用以下配置:
ilb-zone。ilb0 的 IP 地址是 10.0.2.16/24,默认路由是 10.0.2.2。ilb1 的 IP 地址是 192.168.1.21/24。系统配置工具支持仅为一个网络接口提供配置;本例中我们要配置的是 ilb0。应用初始配置后,需要登录此区域来提供 ilb1 的其他配置,如下所示:
root@ilb-zone:~# ipadm create-ip ilb1 root@ilb-zone:~# ipadm create-addr -T static -a local=192.168.1.21/24 ilb1/v4
server1-zone)我们将通过克隆 ilb-zone 创建第一个服务器区域 server1-zone。克隆区域后,配置 server1-zone,然后通过克隆 server1-zone 创建 server2-zone。需要先关闭 ilb-zone 才能克隆。然后登录新克隆的 server1-zone 完成该区域的最终配置:
root@solaris:~# zoneadm -z ilb-zone shutdown root@solaris:~# zoneadm -z server1-zone clone ilb-zone A ZFS file system has been created for this zone. Progress is being logged to /var/log/zones/zoneadm.20120428T004843Z.server1-zone Log saved in non-global zone as /zones/server1-zone/var/log/zones/zoneadm.2020428T004843Z.server1-zone root@solaris:~# zoneadm -z server1-zone boot root@solaris:~# zlogin -C server1-zone [Connected to zone 'server1-zone' console]
与前面一样,系统配置工具启动,然后执行 server1-zone 的最终配置:
server1-zone。server1 的 IP 地址是 192.168.1.50/24,默认路由是 192.168.1.21。none。ILB 用作外部网络(通过 ilb0)与专用网络(通过 ilb1)之间流量的转发代理。IP 转发服务是必要的。本例使用 IPv4 地址,因此仅需在 ilb-zone 非全局区域中启用 IPv4 转发(需要引导该区域并登录),如清单 4 所示:
root@ilb-zone:~# routeadm -u -e ipv4-forwarding
root@ilb-zone:~# routeadm
Configuration Current Current
Option Configuration System State
---------------------------------------------------------
IPv4 routing disabled disabled
IPv6 routing disabled disabled
IPv4 forwarding enabled enabled
IPv6 forwarding disabled disabled
Routing services "route:default ripng:default"
Routing daemons:
STATE FMRI
disabled svc:/network/routing/legacy-routing:ipv4
disabled svc:/network/routing/legacy-routing:ipv6
disabled svc:/network/routing/ripng:default
online svc:/network/routing/ndp:default
disabled svc:/network/routing/route:default
disabled svc:/network/routing/rdisc:default
清单 4.启用 IPv4 转发
测试能否在 ILB 区域 ilb-zone 内 ping 通外界:
root@ilb-zone:~# ping www.oracle.com www.oracle.com is alive
server1-zone)我们将对 Apache Tomcat 服务执行负载平衡,所以需要使用程序包管理器 pkg 将其安装到 server1-zone,如清单 5 所示。server1-zone 不需要具备网络连接,这是因为程序包管理器将通过全局区域代理所有连接。如果已将该软件安装到其他区域,则将在本地缓存该软件;否则也可在网络上通过全局区域从配置好的程序包信息库下载该软件。
root@server1-zone:~# pkg install runtime/java tomcat tomcat-examples Packages to install: 17 Create boot environment: No Create backup boot environment: No Services to change: 5 DOWNLOAD PKGS FILES XFER (MB) Completed 17/17 3381/3381 56.3/56.3 PHASE ACTIONS Install Phase 4269/4269 PHASE ITEMS Package State Update Phase 17/17 Image State Update Phase 2/2 Loading smf(5) service descriptions: 1/1
清单 5.安装 Apache Tomcat 服务
Apache Tomcat 成功安装后,需要使用以下命令启用 svc:/network/http SMF 服务的 tomcat6 实例。
root@server1-zone:~# svcadm enable http:tomcat6
作为我们当前状态的汇总,我们可以列出全局区域内的区域。
root@solaris:~# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared 1 ilb-zone running /zones/ilb-zone solaris excl 2 server1-zone running /zones/server1-zone solaris excl - server2-zone configured /zones/server2-zone solaris excl
server1-zone) 的路由进行测试我们需要能从全局区域到达 server1-zone,以验证其运行是否正常,因此需要添加新路由。使用 route -p 命令执行路由更改(在网络重新启动后保持有效),如下所示:
root@solaris:~# route -p add 192.168.1.0 10.0.2.16 add net 192.168.1.0: gateway 10.0.2.16 add persistent net 192.168.1.0: gateway 10.0.2.16
更改生效之后,即可通过 ilb-zone 从全局区域到达在 server1-zone 内运行的 Apache Tomcat 服务,如图 2 所示。

图 2.Apache Tomcat 欢迎屏幕
现在,我们有了一个在 server1-zone 中正常运行的 Apache Tomcat 服务器实例,接下来即可在 server2-zone 中快速创建其他实例。首先,我们要关闭 server1-zone 才能进行克隆,然后引导这两个区域,登录新创建的 server2-zone,如清单 6 所示:
root@solaris:~# zoneadm -z server1-zone shutdown root@solaris:~# zoneadm -z server2-zone clone server1-zone root@solaris:~# zoneadm -z server1-zone boot root@solaris:~# zoneadm -z server2-zone boot root@solaris:~# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared 1 ilb-zone running /zones/ilb-zone solaris excl 2 server1-zone running /zones/server1-zone solaris excl 3 server2-zone running /zones/server2-zone solaris excl root@solaris:~# zlogin -C server2-zone [Connected to zone 'server2-zone' console]
清单 6.克隆其他 Apache Tomcat 实例
再次使用系统配置工具来完成 server2-zone 的配置,具体如下:
server2-zone。server2 的 IP 地址是 192.168.1.60/24,默认路由是 192.168.1.21(ilb-zone 中的接口 ilb1)。none。我们在短短几分钟内就得到了一个新区域,而且 Apache Tomcat 也已启动并正常运行(可在 server2-zone 中使用 svcs 确认):
root@server2-zone:~# svcs http:tomcat6 STATE STIME FMRI online 9:05:44 svc:/network/http:tomcat6
也可从全局区域访问 Apache Tomcat 实例,如图 3 所示。

图 3.从全局区域访问 Apache Tomcat
可以看到,Oracle Solaris 11 可以迅速有效地完成应用实例的部署,因此是云类型环境的理想选择。
现在,我们有了两个 Apache Tomcat 实例,它们分别在自己的区域中运行,下面我们设置负载平衡来扩展其间的流量。在 ILB 区域 ilb-zone 中,使用程序包管理器 (pkg) 安装 ILB 程序包,如清单 7 所示。
root@ilb-zone:~# pkg install ilb
Packages to install: 1
Create boot environment: No
Create backup boot environment: No
Services to change: 1
DOWNLOAD PKGS FILES XFER (MB)
Completed 1/1 23/23 02/0.2
PHASE ACTIONS
Install Phase 55/55
PHASE ITEMS
Package State Update Phase 1/1
Image State Update Phase 2/2
Load smf(5) service descriptions: 1/1
清单 7.安装 ILB 程序包
现在为 server1-zone 和 server2-zone 中的两个 Apache Tomcat 实例启用 ILB 服务,并定义服务器组 tomcatgroup。
root@ilb-zone:~# svcadm enable ilb root@ilb-zone:~# ilbadm create-servergroup -s servers=192.168.1.50:8080,192.168.1.60:8080 tomcatgroup root@ilb-zone:~# ilbadm show-servergroup SGNAME SERVERID MINPORT MAXPORT IP_ADDRESS tomcatgroup _tomcatgroup.0 8080 8080 192.168.1.50 tomcatgroup _tomcatgroup.1 8080 8080 192.168.1.60
下一步是定义负载平衡。这也往往是整个过程中最复杂的一步。首先,定义一个名为 tomcatrule_rr 的简单规则。此规则启用后,它将使用“循环”负载平衡算法和以 tomcatgroup 服务器组为目标的半 NAT 网络拓扑结构,为虚拟目标 IP 地址和端口号 10.0.2.20:80 持久保留和匹配传入的数据包。
root@ilb-zone:~# ilbadm create-rule -e -p -i vip=10.0.2.20,port=80 -m lbalg=rr,type=HALF-NAT,pmask=32 -o servergroup=tomcatgroup tomcatrule_rr root@ilb-zone:~# ilbadm show-rule RULENAME STATUS LBALG TYPE PROTOCOL VIP PORT tomcatrule_rr E roundrobin HALF-NAT TCP 10.0.2.20 80
可以使用 -f 选项显示新建规则的更多详细信息,如清单 8 所示。
root@ilb-zone:~# ilbadm show-rule -f
RULENAME: tomcatrule_rr
STATUS: E
PORT: 80
PROTOCOL: tcp
LBALG: roundrobin
TYPE: HALF-NAT
PROXY-SRC: --
PMASK: /32
HC-NAME: --
HC-PORT: --
CONN-DRAIN: 0
NAT-TIMEOUT: 120
PERSIST-TIMEOUT: 0
SERVERGROUP: tomcatgroup
VIP: 10.0.2.20
SERVERS: _tomcatgroup.0,_tomcatgroup.1
清单 8.新规则的详细信息
最后,我们需要通知外界应将哪些以 VIP 地址 10.0.2.20 为目标的数据包发送到我们的网络接口 ilb0。首先,要在 ilb-zone 中找到 ilb0 的 MAC 地址,如下所示:
root@ilb-zone:~# dladm show-vnic ilb0 LINK OVER SPEED MACADDRESS MACADDRTYPE VID ilb0 ? 1000 2:8:20:4e:fa:fd random 0
找到 MAC 地址后(本例中为 2:8:20:4e:fa:fd),必须使用 arp 应用已发布的永久性“互联网到 MAC”地址转换。
root@ilb-zone:~# arp -s 10.0.2.20 2:8:20:4e:fa:fd pub permanent
我们可以检查一下两个 Apache Tomcat 实例是否已经实现了负载平衡,方法是:通过浏览器访问虚拟 IP 地址 10.0.2.20,看能否进入 Apache Tomcat 欢迎页面,如图 4 所示。

图 4.Apache Tomcat 欢迎页面
非常好!但我们怎样才能知道它源自哪个实例呢?只要在 server1-zone 和 server2-zone 上迅速更改 Apache Tomcat 文档根目录 /var/tomcat6/webapps/examples/jsp/snp/snoop.jsp 下的一个示例脚本,即可轻松查看结果。添加以下命令行,打印接受请求的 Apache Tomcat 实例的服务器主机名:
<h3>Backend server</h3>
<%@page import="java.net.InetAddress;" %>
<%String ip = "";
InetAddress ina = InetAddress.getLocalHost();
out.println("Server Host Name :: "+ina.getHostName());%>
更改后,可在虚拟 IP 地址 http://10.0.2.20/examples/jsp/snp/snoop.jsp 调用该脚本来查看结果,如图 5 所示。

图 5.查看服务器主机名
简单的 ILB 规则不包含任何服务器运行状况检查,而我们绝对不希望负载平衡器向停机的服务器发送请求,因此这种规则的用途极其有限。我们可以利用的运行状况检查选择有很多:ping 探测器、TCP 探测器、UDP 探测器和用户定义的脚本。由于我们关注的是 Apache Tomcat 实例的运行状况,因此下面来编写一个简单的运行状况检查脚本,如清单 9 所示:
root@ilb-zone:~# mkdir /opt/ilb
root@ilb-zone:~# cat > /opt/ilb/hc-tomcat #!/usr/bin/bash result=`curl -s http://$2:8080` if [ "$result" != "" ] && [ ${result:0:5} = "<meta" ]; then echo 0 else echo -1 fi
root@ilb-zone:~# chmod +x /opt/ilb/hc-tomcat
清单 9.运行状况检查脚本
此脚本直接 ping 服务器,检查是否返回了 <meta> 标头。另外还要注意,清单 9 中有一个脚本变量 $2。ILB 提供了很多可在脚本中使用的变量:
$1 — VIP 地址(IPv4 或 IPv6 字面地址)$2 — 服务器 IP 地址(IPv4 或 IPv6 字面地址)$3 — 协议(UDP 或 TCP)$4 — 负载平衡模式(DSR、NAT、半 NAT)$5 — 数字端口$6 — 在失败返回之前脚本应等待的最长时间(以秒为单位)我们可以执行快速查看一下脚本是否运行正常。在 server1-zone 上运行脚本,确保成功返回 0 即可,如下所示:
root@ilb-zone:~# /opt/ilb/hc-tomcat 10.0.2.20 192.168.1.50 0
脚本成功运行后,就可以使用 ilbadm 将脚本与运行状况检查规则相关联,如下所示:
root@ilb-zone:~# ilbadm create-healthcheck -h hc-test=/opt/ilb/hc-tomcat,hc-timeout=2,hc-count=1,hc-interval=10 hc-tomcat root@ilb-zone:~# ilbadm show-healthcheck HCNAME TIMEOUT COUNT INTERVAL DEF_PING TEST hc-tomcat 2 1 10 Y /opt/ilb/hc-tomcat
在本例中,脚本每隔 10 秒运行一次,等待响应的最长时间为 2 秒。创建此运行状况检查后,需要修改现有 ILB 规则。ILB 目前不支持修改现有规则,因此必须迅速删除现有规则并创建新规则,如清单 10 所示:
root@ilb-zone:~# ilbadm delete-rule tomcatrule_rr
root@ilb-zone:~# ilbadm create-rule -e -p -i vip=10.0.2.20,port=80 -m
lbalg=rr,type=HALF-NAT,pmask=32 -h hc-name=hc-tomcat -o servergroup=tomcatgroup tomcatrule_rr
root@ilb-zone:~# ilbadm show-rule -f
RULENAME: tomcatrule_rr
STATUS: E
PORT: 80
PROTOCOL: tcp
LBALG: roundrobin
TYPE: HALF-NAT
PROXY-SRC: --
PMASK: /32
HC-NAME: hc-tomcat
HC-PORT: ANY
CONN-DRAIN: 0
NAT-TIMEOUT: 120
PERSIST-TIMEOUT: 0
SERVERGROUP: tomcatgroup
VIP: 10.0.2.20
SERVERS: _tomcatgroup.0,_tomcatgroup.1
清单 10.创建新 ILB 规则
新规则创建后,运行状况检查将立即生效。我们可以使用 ilbadm show-hc-result,迅速得知运行状况检查的状态,如下所示:
root@ilb-zone:~# ilbadm show-hc-result RULENAME HCNAME SERVERID STATUS FAIL LAST NEXT RTT tomcatrule_rr hc-tomcat _tomcatgroup.0 alive 0 11:01:18 11:01:23 739 tomcatrule_rr hc-tomcat _tomcatgroup.1 alive 0 11:01:20 11:01:34 1111
可以看到,一切工作正常,两个服务器都能正确响应。但如果其中的某个服务器停机,又会出现怎样的状况?下面我们快速禁用 server1-zone 中的 Apache Tomcat 实例,查看会发生什么情况。
root@server1-zone:~# svcadm disable http:tomcat6
通过 ilb-zone 再次检查状态。
root@ilb-zone:~# ilbadm show-hc-result RULENAME HCNAME SERVERID STATUS FAIL LAST NEXT RTT tomcatrule_rr hc-tomcat _tomcatgroup.0 dead 63 11:22:43 11:22:50 941 tomcatrule_rr hc-tomcat _tomcatgroup.1 alive 0 11:22:30 11:22:45 952
所有请求都会被定向到 server2-zone 中的 Apache Tomcat 实例。
集成负载平衡器 (ILB) 是 Oracle Solaris 11 的内置特性,为第 3 层和第 4 层提供负载平衡功能。ILB 能截获来自客户端的请求,并根据一组负载平衡规则判断应由哪个后端服务器处理请求,随后将请求转发到选定的服务器,因此能够显著提高应用的弹性。
请参见集成负载平衡器产品文档。
以下是有关 Oracle Solaris 11 的其他一些资源:
| 修订版 1.0,2012 年 6 月 4 日 |
要了解所有 Oracle 技术中与系统管理员相关的内容,请在 Facebook 和 Twitter 上关注 OTN Systems。