文章
服务器与存储管理
作者:Orgad Kimchi,合著者:Nicolas Droux
2014 年 7 月发布
第 1 部分 — 使用数据链路多路径赋予网络高可用性
第 2 部分 — 数据链路多路径的更多用途
|
本文是由两部分组成的系列文章的第一部分,介绍如何使用数据链路多路径 (DLMP) 聚合。
本文将探讨如何使用 DLMP 聚合赋予网络高可用性 (HA)。为此,我们将执行以下主要任务:
注:本文信息适用于 Oracle Solaris 11.2。
一旦使用 Oracle Solaris 11 网络虚拟化技术 — 如虚拟网络接口卡 (VNIC)、虚拟交换机、负载平衡器、防火墙和路由器 — 虚拟化网络云基础架构,网络本身就成为云基础架构越来越重要的组件。
为了赋予网络基础架构层弹性,我们需要在该层实现 HA 解决方案,就像我们针对数据中心的任何其他任务关键型组件所做的那样。
本文是由两部分组成的系列文章的第一部分。第一部分将介绍如何使用 Oracle Solaris 11.1 中引入的数据链路多路径 (DLMP) 聚合技术实现网络 HA。
使用 DLMP 聚合,我们通过提供透明的故障切换和提高吞吐量,可以赋予网络基础架构弹性。此过程中涉及的对象为 VNIC,包括在 Oracle Solaris 区域中配置的 VNIC 以及在 Oracle VM Server for SPARC 下的逻辑域中配置的 VNIC。
使用此技术可赋予当前网络基础架构高可用性,不会产生此类解决方案通常具有的跨组织复杂性。
此技术的优点显而易见,并且考虑到了现有技术的局限性:
在改善网络性能方面,中继聚合和 DLMP 聚合支持的特性几乎相同。但是,确实存在差异。下表综合比较了 Oracle Solaris 中支持的这两种链路聚合。
表 1. 中继聚合与 DLMP 聚合比较| 特性 | 中继聚合 | DLMP 聚合 |
|---|---|---|
| 基于链路的故障检测 | 支持 | 支持 |
| 基于探测器的故障检测 | 支持(链路聚合控制协议 [LACP]) | Oracle Solaris 11.2 中支持 |
| LACP | 支持 | 不支持 |
| 使用备用接口 | 不支持 | 支持 |
| 能够跨多个交换机 | 用于供应商专用解决方案时支持 | 支持 |
| 交换机配置 | 必需 | 无需 |
| 负载平衡策略 | 支持 | 不适用 |
| 负载分布在所有聚合端口上 | 支持 | 有限(该聚合将其 VNIC 分布到所有端口。但各个 VNIC 不能将负载分布到多个端口。) |
| 用户定义的资源管理流 | 支持 | 支持 |
| 链路保护 | 支持 | 支持 |
| 连续的并行配置 | 支持 | 不支持(DLMP 聚合必须始终使用中介交换机将数据包发送到其他目标系统。但使用 DLMP 聚合时,不用为链路聚合配置交换机。) |
本系列文章将通过四个用例演示多租户云环境中的 DLMP 聚合功能。
第 2 部分还将介绍如何检测 DLMP 聚合故障。
在所有用例使用的架构中,所有网络构建块都是用 Oracle Solaris 11 区域、ZFS 和网络虚拟化技术安装的。图 1 显示了架构:

图 1. 本系列文章中所用架构
首先,在全局区域中配置 DLMP 聚合。
以下示例显示如何创建 DLMP 聚合。该聚合有 4 个底层数据链路(net0、net1、net2、net3),如图 1 所示。
重要事项:在本系列文章提供的示例中,命令指示符指示每条命令需要由哪个用户运行,此外,还指示命令的运行环境。例如,命令指示符 root@global_zone:~# 指示需由用户 root 从全局区域运行该命令。
| 注:如果打算创建一个聚合,其中包括当前连接所用网络接口,您需要使用 Oracle Integrated Lights Out Manager (Oracle ILOM) 从系统控制台配置聚合。使用 Oracle ILOM 将帮助您避免在安装过程中因为在用于链路聚合的网络接口上聚合而发生临时中断。 您可以使用 tty 命令验证您在系统控制台内,它会输出用户的终端名称。root@global_zone:~# tty /dev/console |
首先列出当前数据链路,如清单 1 所示:
root@global_zone:~# dladm show-link LINK CLASS MTU STATE BRIDGE OVER net0 phys 1500 up -- ---- net1 phys 1500 unknown -- ---- net2 phys 1500 unknown -- ---- net3 phys 1500 unknown -- ----
清单 1
在清单 1 中,我们可以看到 4 个数据链路:net0、net1、net2 和 net3。我们将使用这些数据链路构建链路聚合。
为了避免临时服务中断,请确保执行配置时配置到聚合中的数据链路未被任何应用使用。例如,如果已在数据链路上创建了 IP 接口,首先要删除该 IP 接口。
要确定一条链路是否由任何应用使用,请查看 ipadm show-if 命令的输出,如清单 2 所示。
root@global_zone:~# ipadm show-if IFNAME CLASS STATE ACTIVE OVER lo0 loopback ok yes -- net0 ip ok no -
清单 2
清单 2 的输出指示数据链路 net0 上存在一个 IP 接口。
下面捕获 IP 接口属性;稍后将使用此信息相应地构建其他 IP 接口。
root@global_zone:~# ipadm show-addr net0 ADDROBJ TYPE STATE ADDR net0/v4 static ok 10.0.0.100/24
(可选)接下来,捕获默认网关信息;稍后将使用此信息。
root@global_zone:~# netstat -rn
要删除 IP 接口,请键入以下命令:
root@global_zone:~# ipadm delete-ip net0
验证已经删除了该 IP 接口:
root@global_zone:~# ipadm show-if net0 ipadm: cannot get information for interface(s): No such interface
注:如果 ipadm show-if 命令的输出指示应用使用了其他 IP 接口,还要删除这些 IP 接口。
执行清单 3 所示命令,创建链路聚合:
root@global_zone:~# dladm create-aggr -m dlmp -l net0 -l net1 -l net2 -l net3 aggr0
清单 3
清单 3 所示命令使用了以下选项:
-m dlmp 指定聚合类型为 DLMP。-l 指定底层数据链路 net0 至 net3 构成聚合。aggr0 指定聚合的名称。使用清单 4 所示命令验证创建了 DLMP 聚合:
root@global_zone:~# dladm show-aggr LINK MODE POLICY ADDRPOLICY LACPACTIVITY LACPTIMER aggr0 dlmp -- -- -- --
清单 4
在清单 4 中,可以见到聚合 (aggr0),反映了其类型 (dlmp)。
为了查看构成此聚合的底层数据链路,请运行清单 5 中所示命令:
root@global_zone:~# dladm show-link aggr0 LINK CLASS MTU STATE OVER aggr0 aggr 1500 up net0 net1 net2 net3
清单 5
在清单 5 中,可以见到 net0、net1、net2 和 net3 数据链路;而且,聚合状态为 up。
您可以看到创建 DLMP 聚合是多么容易!
要显示构成聚合的所有数据链路的属性,可以使用 dladm show-linkprop 命令。清单 6 显示 dladm show-linkprop 命令的部分输出。
root@global_zone:~# dladm show-linkprop aggr0
LINK PROPERTY PERM VALUE EFFECTIVE DEFAULT POSSIBLE
aggr0 autopush rw -- -- -- --
aggr0 zone rw -- -- -- --
aggr0 state r- up up up up,down
aggr0 mtu rw 1500 1500 1500 1500-9194
aggr0 maxbw rw -- -- -- --
aggr0 cpus rw -- -- -- --
aggr0 rxfanout rw -- 0 0 --
aggr0 pool rw -- -- -- --
aggr0 priority rw medium medium medium low,medium,
high
aggr0 tagmode rw vlanonly vlanonly vlanonly normal,
vlanonly
...
清单 6
我们来重新创建以前在 net0 上的 IP 接口,但现在该接口将在 aggr0 聚合上:
root@global_zone:~# ipadm create-ip aggr0
为 IP 接口分配一个 IP 地址;我们将使用 net0 所使用的 IP 地址 (10.0.0.100)。
root@global_zone:~# ipadm create-addr -a local=10.0.0.100/24 aggr0/v4
使用 ipadm show-addr 命令验证创建了 IP 地址:
root@global_zone:~# ipadm show-addr aggr0 ADDROBJ TYPE STATE ADDR aggr0/v4 static ok 10.0.0.100/24
(可选)要重新创建默认网关,请使用以下命令:
注:指定的 IP 地址应与先前使用 netstat -rn 命令捕获的 IP 地址相同。
root@global_zone:~# route -p add default <IP address>
tty 命令验证是否在控制台设备上。dladm create-aggr -m dlmp 命令配置 DLMP 聚合。下一步是基于上一步创建的聚合 (aggr0) 创建两个 VNIC。
创建区域所用 VNIC 有两种方式:
dladm 命令从全局区域创建 VNIC,使用区域配置 net 资源将区域配置为使用该 VNIC。anet 资源指定 VNIC 配置,这将导致在区域启动和中止时分别自动创建和销毁该 VNIC。首先,使用 dladm 命令创建 VNIC。(在稍后的步骤中,将 VNIC 与 Oracle Solaris 区域关联,同样将使用 anet 资源创建 VNIC):
root@global_zone:~# dladm create-vnic -l aggr0 vnic1 root@global_zone:~# dladm create-vnic -l aggr0 vnic2
使用 dladm show-vnic 命令验证创建了 VNIC,如清单 7 所示:
root@global_zone:~# dladm show-vnic LINK OVER SPEED MACADDRESS MACADDRTYPE VIDS vnic1 aggr0 1000 2:8:20:5:c3:be random 0 vnic2 aggr0 1000 2:8:20:43:14:1a random 0
清单 7
在清单 7 中,我们可以看到创建了两个 VNIC(vnic1 和 vnic2),还可以看到它们的 MAC 地址以及与其关联的聚合 (aggr0)。
dladm create-vnic 命令基于 DLMP 聚合构建 VNIC。dladm show-vnic 命令列出 VNIC我们将在环境中创建三个区域:zone1、zone2 和 zone3。为了加快区域的创建速度,我们将 zone2 创建为 zone1 的克隆。此外,我们将使用 ZFS 快照和发送 功能创建一个区域映像,用于在另一台机器上创建 zone3,如图 2 所示。

图 2:区域创建顺序
zone1)Oracle Solaris 区域技术是 Oracle Solaris 中提供的内置虚拟化技术。在第一个用例中,我们将使用区域包含测试环境。
我们将使用 zonecfg 命令创建第一个区域:zone1。创建区域至少需要该区域的名称及其 zonepath。此外,我们还将提供上一节中创建的 VNIC 的名称 (vnic1)。
现在,运行清单 8 所示的命令创建 zone1:
root@global_zone:~# zonecfg -z zone1 Use 'create' to begin configuring a new zone. zonecfg:zone1> create create: Using system default template 'SYSdefault' zonecfg:zone1> set zonepath=/zones/zone1 zonecfg:zone1> set autoboot=true zonecfg:zone1> add net zonecfg:zone1:net> set physical=vnic1 zonecfg:zone1:net> end zonecfg:zone1> verify zonecfg:zone1> commit zonecfg:zone1> exit
清单 8
(可选)使用 Oracle Solaris 区域时,也可以不执行清单 8 所示操作,而是使用 anet zonecfg 资源基于聚合自动创建 VNIC。在这种情况下,可以将 lower-link 设置为数据链路聚合的名称。例如,清单 9 显示如何基于 aggr0 创建自动 VNIC:
root@global_zone:~# zonecfg -z zone1 Use 'create' to begin configuring a new zone. zonecfg:zone1> create create: Using system default template 'SYSdefault' zonecfg:zone1> set zonepath=/zones/zone1 zonecfg:zone1> set autoboot=true zonecfg:zone1> select anet linkname=net0 zonecfg:zone1:net> set lower-link=aggr0 zonecfg:zone1:net> end zonecfg:zone1> verify zonecfg:zone1> commit zonecfg:zone1> exit
清单 9
下一步是安装区域。要安装区域,您需要访问映像包管理系统 (IPS) 信息库。这可以与您用于安装 Oracle Solaris 的信息库相同。
root@global_zone:~# zoneadm -z zone1 install
然后,我们需要启动区域:
root@global_zone:~# zoneadm -z zone1 boot
登录到 zone1。然后,我们将使用 System Configuration Tool 指定区域的系统配置,如图 3 所示。
root@global_zone:~# zlogin -C zone1
按 ESC-2 启动 System Configuration Tool。

图 3. System Configuration Tool
在 System Configuration Tool 交互屏幕上指定以下信息:
zone1。vnic1。10.0.0.1。255.255.255.0。此外,还需指定 root 密码。
按 ESC-2 应用所有更改。
完成后,应该会看到区域启动消息。在区域控制台登录提示符下,以 root 身份登录区域:
zone1 console login: root Password:
登录区域之后,使用 ipadm show-addr 命令验证网络配置,如清单 10 所示:
root@zone1:~# ipadm show-addr ADDROBJ TYPE STATE ADDR lo0/v4 static ok 127.0.0.1/8 vnic1/v4 static ok 10.0.0.1/24 lo0/v6 static ok ::1/128 vnic1/v6 addrconf ok fe80::8:20ff:fec0:cd0/10
清单 10
由清单 10 可见,vnic1 的 IP 地址为 10.0.0.1。
下一步是使用清单 11 所示命令在 zone1 内安装 iperf 工具。iperf(1) 是执行网络吞吐量测量的工具,它可以观察 TCP 或 UDP 吞吐量并提供实时统计信息。稍后,我们将使用此工具测量两个 Oracle Solaris 区域之间的网络带宽(如图 4 所示)。
root@zone1:~# pkg install iperf Packages to install: 1 Create boot environment: No Create backup boot environment: No DOWNLOAD PKGS FILES XFER (MB) SPEED Completed 1/1 6/6 0.0/0.0 942k/s PHASE ITEMS Installing new actions 20/20 Updating package state database Done Updating image state Done Creating fast lookup database Done
清单 11
使用您喜欢的文本编辑器在 /etc/hosts 中添加区域的 IP 地址和主机名:
root@zone1:~# vi /etc/hosts ::1 localhost 127.0.0.1 localhost loghost 10.0.0.1 zone1 10.0.0.2 zone2 10.0.0.3 zone3
zone2)现在我们将以克隆 zone1 的形式创建 zone2,如图 2 所示。此过程有三个步骤:
zone2 创建区域系统配置模板zone1 配置,用此信息创建区域配置文件,我们可以将其用作主配置文件模板zone1 创建 zone2为避免每次都要手动配置克隆区域的系统属性,我们首先先为 zone2 创建一个系统配置模板。为此,可从 zone1 内运行 sysconfig 命令,这将启动 System Configuration Tool。
root@zone1:~# sysconfig create-profile
System Configuration Tool 执行全新安装的 Oracle Solaris 实例的初始配置。它还执行先前配置的 Oracle Solaris 实例的配置,包括重新配置全局区域、配置克隆区域以及配置物理到虚拟 (P2V) 迁移系统。有关详细信息,请参见“如何使用 sysconfig 命令配置 Oracle Solaris 11”。
按 ESC-2 浏览 System Configuration Tool 屏幕,输入以下 zone2 信息:
zone2vnic1。(稍后会更改此值。)10.0.0.2。255.255.255.0。此外,还需指定 root 密码。
按 ESC-2 应用设置。
将系统配置模板 (sc_profile.xml) 复制到 /root/zone2-template.xml 中(稍后,我们将此文件复制到更方便的位置):
root@zone1:~# cp /system/volatile/profile/sc_profile.xml /root/zone2-template.xml
更改文件权限,启用文件编辑:
root@zone1:~# chmod +w /root/zone2-template.xml
使用您喜欢的文本编辑器将 vnic1 通改为 vnic2。
注:如果使用 anet 属性配置 VNIC,可以省掉此步骤,因为各区域的 anet 配置相同。
root@zone1:~# vi /root/zone2-template.xml
验证文件修改:
root@zone1:~# grep vnic2 /root/zone2-template.xml <propval type="astring" name="name" value="vnic2/v6"/> <propval type="astring" name="name" value="vnic2/v4 "/>
注销 zone1,返回全局区域,使用 ~. 转义序列退出区域控制台:
root@zone1:~# ~. [Connection to zone 'zone1' console closed]
我需要从系统上的全局区域关闭要克隆的区域 zone1。(不能克隆正在运行的区域。)
首先,使用 zonename 命令验证是否在全局区域内:
root@global_zone:~# zonename global
然后验证区域状态,如清单 12 所示:
root@global_zone:~# zoneadm list -iv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared 1 zone1 running /zones/zone1 solaris excl
清单 12
在清单 12 中,我们可以看到 zone1 状态为 running。
关闭区域:
root@global_zone:~# zoneadm -z zone1 shutdown
现在再次验证区域状态,如清单 13 所示:
root@global_zone:~# zoneadm list -iv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared - zone1 installed /zones/zone1 solaris excl
清单 13
在清单 13 中,我们可以看到该区域已关闭。
现在,我们捕获 zone1 的配置并将其用作要创建的其他区域(本例中为 zone2)的主配置文件模板:
root@global_zone:~# zonecfg -z zone1 export -f /zones/zone2-profile
使用您喜欢的编辑器,按清单 14 所示进行更改。(您始终需要更新 zonepath,但我们还可以选择将物理网络名称更新为 vnic2。)
root@global_zone:~# vi /zones/zone2-profile create -b set brand=solaris set zonepath=/zones/zone2 set autoboot=true set ip-type=exclusive add net set physical=vnic2 end
清单 14
现在需要将先前创建的系统配置模板 (zone2-template.xml) 放到到一个更方便的位置:
root@global_zone:~# cp /zones/zone1/root/root/zone2-template.xml /zones
验证系统配置模板的复制操作是否成功:
root@global_zone:~# ls /zones/zone2-template.xml /zones/zone2-template.xml
zone1 创建 zone2接下来,使用 zone2-profile 文件和 zonecfg 命令创建 zone2:
root@global_zone:~# zonecfg -z zone2 -f /zones/zone2-profile
然后使用 zoneadm 命令执行 zone1 克隆,如清单 15 所示。记住使用系统配置模板 (zone2-template.xml) 的完整路径。我们还将使用 time 命令测量克隆区域所需的时间。
root@global_zone:~# time zoneadm -z zone2 clone -c /zones/zone2-template.xml zone1
The following ZFS file system(s) have been created:
rpool/zones/zone2
Progress being logged to /var/log/zones/zoneadm.20131027T090026Z.zone2.clone
Log saved in non-global zone as /zones/zone2/root/var/log/zones/zoneadm.20131027T090026Z.zone2.clone
real 0m36.843s
user 0m7.323s
sys 0m9.878s
清单 15
在清单 15 中,我们可以从 time 命令输出中看到克隆区域用时约 37 秒。这是在现有区域所在系统上新建区域的最快方式。
接下来,启动区域:
root@global_zone:~# zoneadm -z zone2 boot
下面登录区域:
root@global_zone:~# zlogin zone2
等一分钟,待区域服务启动,然后使用 svcs -xv 命令验证区域的服务是否启动并运行,此命令将检查该区域服务的状态。如果所有服务均已顺利启动并运行,该命令将返回提示符,不显示任何消息。
root@zone2:~# svcs -xv
使用 exit 命令退出区域:
root@zone2:~# exit logout [Connection to zone 'zone2' pts/1 closed]
zone3)现在我们将以克隆 zone2 的形式创建 zone3,如图 2 所示。此过程有三个步骤:
zone2 中的文件为 zone3 创建区域配置文件和系统配置文件zone1 的 ZFS 文件系统归档到单个映像文件,用于在另一个系统上创建 zone3zone3zone3 创建区域配置文件和系统配置文件首先,通过复制 zone2 的区域配置文件,创建 zone3 的区域配置文件:
root@global_zone:~# cp /zones/zone2-profile /zones/zone3-profile
然后,使用您喜欢的编辑器编辑文件,更改 zonepath 和物理网络名称:
root@global_zone:~# vi /zones/zone3-profile create -b set brand=solaris set zonepath=/zones/zone3 set autoboot=true set ip-type=exclusive add net set physical=vnic3 end
复制 zone2 的系统配置模板,为 zone3 创建一个类似的模板:
root@global_zone:~# cp /zones/zone2-template.xml /zones/zone3-template.xml
编辑文件,将区域名称更改为 zone3,将 VNIC 名称更改为 vnic3,并将 IP 地址更改为 10.0.0.3:
root@global_zone:~# vi /zones/zone3-template.xml
验证文件修改:
root@global_zone:~# egrep "10.0.0.3|zone3|vnic3" /zones/zone3-template.xml
egrep 命令的输出应如下所示:
<propval type="astring" name="nodename" value="zone3"/> <propval type="astring" name="name" value="vnic3/v6"/> <propval type="net_address_v4" name="static_address" value="10.0.0.3/24"/> <propval type="astring" name="name" value="vnic3/v4"/>
可以使用 ZFS“快照”和“发送”功能将 zone1 的 ZFS 文件系统归档到单个映像文件,用于在另一个系统上创建区域。
Oracle Solaris ZFS 快照是 Oracle Solaris ZFS 文件系统或卷的只读副本。ZFS 快照几乎可以即时创建,最初不占用 ZFS 池中的任何额外磁盘空间。对于需要执行备份的系统管理员而言,快照是一个重要工具。有关 ZFS 快照的详细信息,请参见“使用 Oracle Solaris ZFS 快照”。
首先,获取 zone1 文件系统的名称:
root@global_zone:~# zfs list | grep zone1 rpool/zones/zone1 919M 251G 33K /zones/zone1 rpool/zones/zone1/rpool
然后生成区域的 ZFS 存储池 (rpool) 的递归 ZFS 快照,如清单 16 所示:
root@global_zone:~# time zfs snapshot -r rpool/zones/zone1@archive real 0m0.406s user 0m0.007s sys 0m0.026s
清单 16
在清单 16 中,我们可以从 time 命令输出中看到创建 ZFS 快照只需约 0.4 秒!
验证 ZFS 快照创建:
root@global_zone:~# zfs list -t snapshot rpool/zones/zone1@archive NAME USED AVAIL REFER MOUNTPOINT rpool/zones/zone1@archive 0 - 33K -
现在,使用 zfs send 归档快照;此外,我们还将使用 bzip2 命令压缩映像来减小其大小:
root@global_zone:~# zfs send -rc rpool/zones/zone1@archive | bzip2 > /var/tmp/zone1.zfs.bz2
注:完成此过程需要几分钟的时间。
验证映像创建,如清单 17 所示:
root@global_zone:~# ls -lh /var/tmp/zone1.zfs.bz2 -rw-r--r-- 1 root root 326M Oct 27 02:42 /var/tmp/zone1.zfs.bz2
清单 17
在清单 17 中,我们可以看到映像大小为 326 MB。
注:如果需要,可以将区域映像放在 NFS 共享上,以便创建基于网络的 Oracle Solaris 区域映像信息库。有关 NFS 共享示例,请参见“如何使用 ZFS 存档迁移非全局区域”。
现在,使用 scp 命令将区域映像和配置文件复制到第二个系统 (global2):
root@global_zone:~# scp /zones/zone3-template.xml /zones/zone3-profile /var/tmp/zone1.zfs.bz2 root@global2:/var/tmp zone3-template.xml 100% |*****************************| 3021 00:00 zone3-profile 100% |*****************************| 126 00:00 zone1.zfs.bz2 100% |*****************************| 326 MB 00:07
使用 ssh 命令登录到第二个系统:
root@global_zone:~# ssh global2
在第二个系统上,创建 VNIC vnic3:
root@global2:~# dladm create-vnic vnic3 -l net0
验证 VNIC 创建:
root@global2:~# dladm show-vnic vnic3 LINK OVER SPEED MACADDRESS MACADDRTYPE VIDS vnic3 net0 1000 2:8:20:db:a4:54 random 0
在上一步中,我们将第一个系统的三个文件复制到第二个系统 (global2);下面列出 /var/tmp 目录的内容:
root@global2:~# ls /var/tmp
您应该看到三个文件:
zone1.zfs.bz2,区域映像zone3-profile,区域配置文件zone3-template.xml,区域系统配置文件使用 bzip2 命令解压缩区域映像:
root@global2:~# bzip2 -d /var/tmp/zone1.zfs.bz2
使用 zonecfg 命令配置 zone3:
root@global2:~# zonecfg -z zone3 -f /var/tmp/zone3-profile
注:完成解压缩过程需要几分钟的时间。
zone3接下来,我们将使用 zoneadm 命令安装区域,如清单 18 所示。安装区域过程中如果提供系统配置文件,可以自动完成区域配置。将映像和系统配置文件作为参数提供给 zoneadm 命令时,为了检查区域的创建速度,我们还将使用 time 命令。
在清单 18 中,我们将使用以下选项:
-z zone3 指定区域名称。-a /var/tmp/zone1.zfs 指定映像名称。-u 取消区域的配置(即,删除所有区域配置,如主机名和名称服务信息),因为我们使用的是新系统配置文件 (zone3-template.xml)。-c /var/tmp/zone3-template.xml 指定系统配置文件的名称。
root@global2:~# time zoneadm -z zone3 install -a /var/tmp/zone1.zfs -u -c /var/tmp/zone3-template.xml
The following ZFS file system(s) have been created:
rpool/zones
rpool/zones/zone3
Progress being logged to /var/log/zones/zoneadm.20131027T094458Z.zone3.install
Installing: This may take several minutes...
(...)
real 2m37.726s
user 1m42.381s
sys 0m27.423s
清单 18
在清单 18 中,我们可以从 time 命令输出看到使用映像和系统配置文件安装区域用时 2 分钟 37 秒。
启动新区域:
root@global2:~# zoneadm -z zone3 boot
使用 zoneadm 命令验证区域状态,如清单 19 所示:
root@global2:~# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared 2 zone3 running /zones/zone3 solaris excl
清单 19
在清单 19 中,我们可以看到现在区域正在运行。
下面登录区域:
root@global2:~# zlogin zone3
等 1 分钟,待区域服务启动。然后验证区域服务是否启动和运行:
root@zone3:~# svcs -xv
使用 ipadm 命令验证网络配置,如清单 20 所示:
root@zone3:~# ipadm show-addr ADDROBJ TYPE STATE ADDR lo0/v4 static ok 127.0.0.1/8 vnic3/v4 static ok 10.0.0.3/24 lo0/v6 static ok ::1/128 vnic3/v6 addrconf ok fe80::8:20ff:fec0:cd0/10
清单 20
由清单 20 可见,vnic3 的 IP 地址为 10.0.0.3。
现在返回第一个系统,启动 zone1:
root@global_zone:~# zoneadm -z zone1 boot
现在,检查在第一个系统上创建的区域的状态:zone1 和 zone2,如清单 21 所示:
root@global_zone:~# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared 1 zone1 running /zones/zone1 solaris excl 2 zone2 running /zones/zone2 solaris excl
清单 21
在清单 21 中,我们可以看到 zone1 和 zone2 状态为 running。
登录到 zone2:
root@global_zone:~# zlogin zone2
使用 ipadm 命令验证区域网络配置,如清单 22 所示:
root@zone2# ipadm show-addr ADDROBJ TYPE STATE ADDR lo0/v4 static ok 127.0.0.1/8 vnic2/v4 static ok 10.0.0.2/24 lo0/v6 static ok ::1/128 vnic2/v6 addrconf ok fe80::8:20ff:fe7c:9c6/10
清单 22
由清单 22 可见,vnic2 的 IP 地址为 10.0.0.2。
编辑 /etc/hosts,添加 zone1 条目:
root@zone2:~# echo "10.0.0.1 zone1" >> /etc/hosts
在 zone2 中使用 ping 命令检查到 zone1 和 zone3 的网络连接性:
root@zone2:~# ping zone1 zone1 is alive root@zone2:~# ping zone3 zone3 is alive
注:在某些环境中,Oracle Solaris 11 防火墙可能会阻挡网络流量。如果安全策略允许,可以使用 svcadm disable ipfilter 命令禁用防火墙服务,或者添加防火墙规则以启用两个环境之间的网络流量。有关更多 Oracle Solaris 防火墙示例,请参见在 Oracle Solaris 11.1 中保护网络。
使用 exit 命令退出 zone2:
root@zone2:~# exit logout [Connection to zone 'zone2' pts/1 closed]
我们可以看到,Oracle Solaris 区域可以受益于 DLMP 聚合提供的底层网络 HA,无需在非全局区域或网络交换机上做任何设置。
zoneadm、zonecfg 和 zlogin 命令用于安装和管理 Oracle Solaris 区域。zfs snapshot 和 zfs send 创建可移至其他系统的区域映像。zonename 命令验证是否在全局区域中。ipadm 命令查看 IP 地址配置。svcs 命令用于查看区域服务的状态。anet zonecfg 属性基于聚合自动创建 VNIC。下一步是通过禁用用于构建 aggr0 聚合的一个数据链路,检查网络高可用性。为此,我们将测试使用 iperf 网络性能工具生成的网络负载期间的物理 NIC 故障。
为了执行 iperf 测量,您必须同时在 zone1 上建立一个服务器,在 zone3 上建立一个客户端,这样才能产生网络流量,如图 4 所示。

图 4. 网络性能测试布局
登录到 zone1:
root@global_zone:~# zlogin zone1
在 zone1 上,使用以下选项以服务器模式运行 iperf 命令:
-s 指定服务器模式。-l 128k 设置读/写缓冲区长度 (128 K)。root@zone1:~# iperf -s -l 128k
运行 iperf 命令之后,您将在终端看到以下消息:
------------------------------------------------------------ Server listening on TCP port 5001 TCP window size: 125 KByte (default) ------------------------------------------------------------
下一步是在 zone3 上运行 iperf 客户端。
注:无需在 zone3 中安装 iperf 工具。前面使用 ZFS“快照”和“发送”功能创建区域映像时,原始区域(zone1,在此生成映像)中安装的每个软件包都放在 zone3 上。这是区域克隆流程的另一个优点。
从另一个终端窗口登录到 zone3:
root@global2:~# zlogin zone3
编辑 /etc/hosts,添加 zone1 条目:
root@zone3:~# echo "10.0.0.1 zone1" >> /etc/hosts
在 zone3 中使用 ping 命令检查到 zone1 和 zone2 的网络连接性:
root@zone3:~# ping zone1 zone1 is alive root@zone3:~# ping zone2 zone2 is alive
使用以下选项运行 iperf 命令,在 zone3 上以客户端(即加载程序)模式运行测试。
-c 指定客户端模式。-l 128k 设置读/写缓冲区长度 (128 K)。-P 4 指定要运行的并行客户端线程数(4 个)。-i 1 指定定期带宽报告之间有 1 秒的暂停。-t 360 指定以秒为单位的数据传输时间(360 秒)。root@zone3:~# iperf -c zone1 -l 128k -P 4 -i 1 -t 360
运行 iperf 命令之后,您将看到运行时统计信息:
------------------------------------------------------------ Client connecting to zone1, TCP port 5001 TCP window size: 48.0 KByte (default) ------------------------------------------------------------ [ 7] local 10.0.0.3 port 55262 connected with 10.0.0.1 port 5001 [ 5] local 10.0.0.3 port 56078 connected with 10.0.0.1 port 5001 [ 6] local 10.0.0.3 port 46789 connected with 10.0.0.1 port 5001 [ 4] local 10.0.0.3 port 36639 connected with 10.0.0.1 port 5001 [ ID] Interval Transfer Bandwidth [ 4] 0.0- 1.0 sec 27.9 MBytes 234 Mbits/sec [ ID] Interval Transfer Bandwidth [ 5] 0.0- 1.0 sec 27.8 MBytes 233 Mbits/sec [ ID] Interval Transfer Bandwidth [ 7] 0.0- 1.0 sec 28.5 MBytes 239 Mbits/sec [ ID] Interval Transfer Bandwidth [ 6] 0.0- 1.0 sec 28.0 MBytes 235 Mbits/sec ...
我们将使用 dlstat(1m) 命令显示 vnic1 网络接口的网络统计信息。dlstat 命令报告运行时有关物理或虚拟数据链路(如 VNIC)的网络使用统计信息。
在第一个系统上打开另一个终端,登录到 zone1。然后运行清单 23 中所示命令,以 1 秒的时间间隔显示 vnic1 的网络统计信息:
root@zone1:~# dlstat -i 1 vnic1 LINK IPKTS RBYTES OPKTS OBYTES vnic1 12.74M 18.06G 1.61M 105.94M vnic1 87.33K 123.83M 11.00K 726.13K vnic1 87.66K 123.89M 11.04K 728.77K vnic1 87.81K 124.05M 11.09K 731.87K vnic1 87.69K 124.26M 11.00K 726.20K ...
清单 23
如清单 23 所示,dlstat 命令显示了以下信息:
IPKTS)RBYTES)OPKTS)OBYTES)我们可以看到 vnic1 正在接收数据,网络流量为 124 Mb/秒。
不要关闭显示 dlstat 输出的终端;几步之后我们还会回到这里。
现在从 aggr0 聚合删除 net0 数据链路。
在全局区域中打开另一个终端,验证与 aggr0 关联的数据链路:
root@global_zone:~# dladm show-link aggr0 LINK CLASS MTU STATE OVER aggr0 aggr 1500 up net0 net1 net2 net3
使用以下命令从 aggr0 聚合删除 net0 接口:
root@global_zone:~# dladm remove-aggr -l net0 aggr0
验证已从 aggr0 聚合删除 net0,如清单 24 所示:
root@global_zone:~# dladm show-link aggr0 LINK CLASS MTU STATE OVER aggr0 aggr 1500 up net1 net2 net3
清单 24
在清单 24 中,我们可以看到 net0 不再与 aggr0 聚合关联。
现在回到 zone1 上正在运行 dlstat 命令的终端,如清单 25 所示:
root@zone1:~# SLINK IPKTS RBYTES OPKTS OBYTES vnic1 12.74M 18.06G 1.61M 105.94M vnic1 87.33K 123.83M 11.00K 726.13K vnic1 87.66K 123.89M 11.04K 728.77K ^C
清单 25
注:要停止 dlstat 命令,请按 Ctrl-C。
在清单 25 中,我们可以看到虽然 net0 不再包含在聚合中,但 iperf 测试仍继续运行。
一旦网络负载结束,iperf 将输出基准测试结果摘要,如清单 26 所示:
[ ID] Interval Transfer Bandwidth [ 5] 0.0-360.0 sec 9.84 GBytes 235 Mbits/sec [SUM] 0.0-360.0 sec 39.3 GBytes 938 Mbits/sec
清单 26
由清单 26 可见,删除数据链路并未影响与 zone1 的网络连接性。
(可选)将 net0 重新添加到 aggr0 聚合:
root@global_zone:~# dladm add-aggr -l net0 aggr0
验证数据链路 net0 已再次与 aggr0 关联:
root@global_zone:~# dladm show-link aggr0 LINK CLASS MTU STATE OVER aggr0 aggr 1500 up net1 net2 net3 net0
iperf 工具用于测试两个环境之间的网络吞吐量。dlstat 命令报告运行时有关物理或虚拟数据链路的网络使用统计信息。在本文中,我们已经看到如何使用 DLMP 聚合赋予网络基础架构高可用性 (HA)。具体来说,我们探讨了如何在 DLMP 聚合上创建 VNIC 并将这些 VNIC 分配到 Oracle Solaris 区域,在全局区域中设置 DLMP 聚合。然后我们从 DLMP 聚合删除物理网卡,测试网络 HA。
在本系列文章的第 2 部分,我们将介绍如何在使用 DLMP 聚合的环境中保护网络安全和执行典型的网络管理操作。
另请参见该作者发表的其他文章:
下面是其他 Oracle Solaris 11 资源:
Orgad Kimchi 是 Oracle(之前任职于 Sun Microsystems)ISV 工程小组的首席软件工程师。6 年来,他一直专注于虚拟化、大数据和云计算技术。
Nicolas Droux 是 Oracle 的 Solaris 内核网络首席架构师。他的专长来自其 20 多年从事操作系统内核、网络、虚拟化、安全、I/O、性能、HPC 和云架构工作的经验。
| 修订版 1.0,2014 年 7 月 9 日 |