Introduction
In my previous article, we ended up with a working cluster, with all appropriate cluster software installed. In this article, I’ll start to configure cluster resources. I want to configure two resource groups, ha-zone-1-rg and ha-zone-2-rg. Each resource group will contain a highly-available failover filesystem, a highly-available failover IP address and a highly-available Solaris Zone. I’ll illustrate the process for cloning a zone to save on installation time, as zones in Solaris 11 now use IPS and unless you have a local IPS repository, will connect to http://pkg.oracle.com to download all appropriate packages during zone installation - not something you want to repeat too many times.
A summary of the resources/resource groups I’m looking to create is as follows:
ha-zone-1-rg- Resource group for the first set of failover resourcesha-zone-1-hasp- aSUNW.HAStoragePlusresource for the first failover zpool used for the zonepath for the first failover zone, ha-zone-1ha-zone-1-lh-res- aSUNW.LogicalHostnameresource for the first failover zoneha-zone-1-res- aSUNW.gdsresource, coupled withSUNWsczone/sczbtzone boot registration to create a highly-available zone, ha-zone-1ha-zone-1-http-admin-smf-res- aSUNW.gdsresource, coupled withSUNWsczone/sczsmfzone SMF service registration to create a highly-available iPlanet admin server instanceha-zone-1-http-instance-smf-res- aSUNW.gdsresource, coupled withSUNWsczone/sczsmfzone SMF service registration to create a highly-available iPlanet instanceha-zone-2-rg- Resource group for the second set of failover resourcesha-zone-2-hasp- aSUNW.HAStoragePlusresource for the second failover zpool used for the zonepath for the second failover zone, ha-zone-2ha-zone-2-lh-res- aSUNW.LogicalHostnameresource for the second failover zoneha-zone-2-res- aSUNW.gdsresource, coupled withSUNWsczone/sczbtboot registration to create a highly-available zone, ha-zone-2
This article will cover a lot of ground, much more so than the previous two parts. By the end of the article, you will see two HA resource groups in action, each with a failover zpool and logical hostname resource. I’ll also install the two zones, but won’t make them HA as yet - that’ll be in the next part of the series, as will the configuration of the HA SMF iPlanet resources.
As always, ensure that you read the Oracle Solaris Cluster 4.1 documentation library for full details.
Let’s make a start …
Preparation
Before we start configuring resource groups and their resources, it’s worth verifying the cluster and ensuring that the core components are healthy, and unmonitoring any local disks. We don’t need the cluster monitoring disk paths to local disk devices (which only have a single path) - only the shared devices upon which we’ll be deploying clustered services (which have a path from each cluster node).
Start by verifying that both nodes have correctly jointed the cluster, with the clnode status command:
|
1 2 3 4 5 6 7 8 9 10 |
# clnode status === Cluster Nodes === --- Node Status --- Node Name Status --------- ------ clusternode2 Online clusternode1 Online |
Next, verify that both interconnects are healthy:
|
1 2 3 4 5 6 7 8 |
# clinterconnect status === Cluster Transport Paths === Endpoint1 Endpoint2 Status --------- --------- ------ clusternode2:net3 clusternode1:net3 Path online clusternode2:net2 clusternode1:net2 Path online |
Finally, check that the quorum is healthy:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# clquorum status === Cluster Quorum === --- Quorum Votes Summary from (latest node reconfiguration) --- Needed Present Possible ------ ------- -------- 2 3 3 --- Quorum Votes by Node (current status) --- Node Name Present Possible Status --------- ------- -------- ------ clusternode2 1 1 Online clusternode1 1 1 Online --- Quorum Votes by Device (current status) --- Device Name Present Possible Status ----------- ------- -------- ------ storagenode 1 1 Online |
If those three basic checks look good, you can proceed with unmonitoring the local disk devices. First, obtain a list of the current cluster DID devices with the cldevice status command:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# cldevice status === Cluster DID Devices === Device Instance Node Status --------------- ---- ------ /dev/did/rdsk/d1 clusternode1 Ok clusternode2 Ok /dev/did/rdsk/d2 clusternode1 Ok clusternode2 Ok /dev/did/rdsk/d4 clusternode2 Ok /dev/did/rdsk/d5 clusternode2 Ok /dev/did/rdsk/d7 clusternode1 Ok /dev/did/rdsk/d8 clusternode1 Ok |
Here, we can see that d1 and d2 are our shared disk devices, and d4, d5, d7 and d8 are our node-specific local devices. This can be verified with cldevice list -v:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# cldevice list -v DID Device Full Device Path ---------- ---------------- d1 clusternode1:/dev/rdsk/c0t600144F06F9201000000519DE7880004d0 d1 clusternode2:/dev/rdsk/c0t600144F06F9201000000519DE7880004d0 d2 clusternode1:/dev/rdsk/c0t600144F06F9201000000519DE78A0005d0 d2 clusternode2:/dev/rdsk/c0t600144F06F9201000000519DE78A0005d0 d3 clusternode2:/dev/rdsk/c7t0d0 d4 clusternode2:/dev/rdsk/c8t0d0 d5 clusternode2:/dev/rdsk/c8t1d0 d6 clusternode1:/dev/rdsk/c7t0d0 d7 clusternode1:/dev/rdsk/c8t0d0 d8 clusternode1:/dev/rdsk/c8t1d0 |
You can see two additional DID devices here, d3 and d6 (c7t0d0 on each node) which are the CD-ROM drives. These devices are automatically not eligible for monitoring, hence not appearing in the output of cldevice status.
Next, for each local device, use the cldevice unmonitor command to disable path monitoring:
|
1 2 3 4 |
# cldevice unmonitor d4 # cldevice unmonitor d5 # cldevice unmonitor d7 # cldevice unmonitor d8 |
If you do try to unmonitor one of the CD-ROM paths, you’ll receive an error:
|
1 2 |
# cldevice unmonitor d3 cldevice: (C832694) Cannot monitor CD-ROM "d3". |
With the local disk paths unmonitored, verify once again with cldevice status:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# cldevice status === Cluster DID Devices === Device Instance Node Status --------------- ---- ------ /dev/did/rdsk/d1 clusternode1 Ok clusternode2 Ok /dev/did/rdsk/d2 clusternode1 Ok clusternode2 Ok /dev/did/rdsk/d4 clusternode2 Unmonitored /dev/did/rdsk/d5 clusternode2 Unmonitored /dev/did/rdsk/d7 clusternode1 Unmonitored /dev/did/rdsk/d8 clusternode1 Unmonitored |
Next, we enable automatic rebooting of a node when all monitored disk paths fail - as this would indicate that the node has lost access to the shared storage (now that we are not monitoring the local disk paths). Using “+” for the final argument means to apply the configuration to “all nodes”. I could have just issued the command twice, specifying each node as the final argument, or even a list of nodes. The Solaris Cluster command syntax is very rich - read the documentation and manual pages for full details. Many other Solaris Cluster commands accept the “+” syntax to represent “all” of a type of object.
|
1 |
# clnode set -p reboot_on_path_failure=enabled + |
And verify:
|
1 2 3 4 5 6 7 8 9 |
# clnode show -p reboot_on_path_failure + === Cluster Nodes === Node Name: clusternode2 reboot_on_path_failure: enabled Node Name: clusternode1 reboot_on_path_failure: enabled |
At this point, verify what type of fencing is in use too - we want prefer3 (to specify the SCSI-3 protocol for device fencing for all devices) - which is the default in Solaris Cluster 4.1:
|
1 2 |
# cluster show | grep global_fencing global_fencing: prefer3 |
Each device then uses default_fencing type global (by default), to inherit the fencing type from the cluster-wide global_fencing attribute:
|
1 2 3 |
# cldevice show d1 d2 | grep default_fencing default_fencing: global default_fencing: global |
Excellent - we are now ready to begin provisioning our clustered resources. Our devices are correctly monitored, fencing defaults look sane, and the node is protected by rebooting if all paths to the shared storage fail.
Clustered Resources
In the previous article, I already created an fdisk partition on each of our iSCSI-backed shared disk devices, and applied an EFI label to each. They are now ready for the creation of our failover zpools. But first, let’s create the resource groups outlined in the introduction - each resource group will hold all of the resources appropriate for the operation of each highly-available zone: ha-zone-1-rg for ha-zone-1 and ha-zone-2-rg for ha-zone-2.
Resource groups are created with the clresourcegroup create command. It’s worth noting here that there are also abbreviated forms of each command. For example, I could also use the clrg command - these are simply hard links:
|
1 2 3 |
# ls -li /usr/cluster/bin/cl{rg,resourcegroup} 83317 -r-sr-xr-x 2 root bin 112676 May 22 22:37 /usr/cluster/bin/clresourcegroup 83317 -r-sr-xr-x 2 root bin 112676 May 22 22:37 /usr/cluster/bin/clrg |
You will find that you’ll end up using the abbreviated forms more as you work with Solaris Cluster, to save yourself some typing. However, for documentation, you should always use the full command name.
Create the two resource groups:
|
1 2 |
# clresourcegroup create ha-zone-1-rg # clresourcegroup create ha-zone-2-rg |
Verify that they have been created with clresourcegroup status:
|
1 2 3 4 5 6 7 8 9 10 11 |
# clresourcegroup status === Cluster Resource Groups === Group Name Node Name Suspended Status ---------- --------- --------- ------ ha-zone-1-rg clusternode2 No Unmanaged clusternode1 No Unmanaged ha-zone-2-rg clusternode2 No Unmanaged clusternode1 No Unmanaged |
Both resource groups will be in an Unmanaged state at this time. An interesting point to note here is that clusternode2 appears before clusternode1 in the listing. This is because the second node of a two-node cluster is configured and rebooted first (via scinstall), thus obtaining a nodeid of 1:
|
1 2 |
clusternode2# cat /etc/cluster/nodeid 1 |
clusternode1 is configured and rebooted into the cluster second, and obtains a nodeid of 2. Some admins choose to run scinstall from the second node of a cluster during build for this reason. I don’t bother with this, as the nodeids are only used internally.
We are now ready to create the failover zpool resources. Before doing anything on a cluster - verify, verify, verify! Double checking the output of cldevice status, we can see that d1 and d2 are the DID devices for the shared disks:
|
1 2 3 4 5 |
# cldevice status | grep Ok /dev/did/rdsk/d1 clusternode1 Ok clusternode2 Ok /dev/did/rdsk/d2 clusternode1 Ok clusternode2 Ok |
Verifying the full device paths:
|
1 2 3 4 5 |
# cldevice list -v | egrep '^(d1|d2)' d1 clusternode1:/dev/rdsk/c0t600144F06F9201000000519DE7880004d0 d1 clusternode2:/dev/rdsk/c0t600144F06F9201000000519DE7880004d0 d2 clusternode1:/dev/rdsk/c0t600144F06F9201000000519DE78A0005d0 d2 clusternode2:/dev/rdsk/c0t600144F06F9201000000519DE78A0005d0 |
And checking them against the LUN mapping on the storage server:
|
1 2 3 4 5 |
# stmfadm list-lu -v | egrep 'LU|Alias' LU Name: 600144F06F9201000000519DE7880004 Alias : /dev/zvol/rdsk/datapool/ha-zone-1 LU Name: 600144F06F9201000000519DE78A0005 Alias : /dev/zvol/rdsk/datapool/ha-zone-2 |
So - d1 is definitely for use by ha-zone-1 and d2 is definitely for use by ha-zone-2 - perfect.
Looking at the VTOC, we see that slice 0 is the slice for use on our EFI labelled disks:
|
1 2 3 4 5 6 |
# prtvtoc /dev/did/dsk/d1 | grep -v '^\*' 0 4 00 34 16760765 16760798 8 11 00 16760799 16384 16777182 # prtvtoc /dev/did/dsk/d2 | grep -v '^\*' 0 4 00 34 16760765 16760798 8 11 00 16760799 16384 16777182 |
From ONE NODE in the cluster, create the zpools on these slices:
|
1 2 |
# zpool create ha-zone-1-pool /dev/did/dsk/d1s0 # zpool create ha-zone-2-pool /dev/did/dsk/d2s0 |
Next, register the SUNW.HAStoragePlus resource type - which is the resource type we’ll be using to manage our failover zpools. From this point forward, unless otherwise noted, you only need to execute the commands on one node of the cluster:
|
1 |
# clresourcetype register SUNW.HAStoragePlus |
Create the SUNW.HAStoragePlus resources to manage the storage:
|
1 2 |
# clresource create -g ha-zone-1-rg -t SUNW.HAStoragePlus -p Zpools=ha-zone-1-pool ha-zone-1-hasp # clresource create -g ha-zone-2-rg -t SUNW.HAStoragePlus -p Zpools=ha-zone-2-pool ha-zone-2-hasp |
We can now bring the two resource groups online (here, on clusternode1), and use the -M flag to set the resources to a managed state:
|
1 2 |
# clresourcegroup online -M -n clusternode1 ha-zone-1-rg # clresourcegroup online -M -n clusternode1 ha-zone-2-rg |
And verify:
|
1 2 3 4 5 6 7 8 9 10 11 |
# clresourcegroup status === Cluster Resource Groups === Group Name Node Name Suspended Status ---------- --------- --------- ------ ha-zone-1-rg clusternode2 No Online clusternode1 No Offline ha-zone-2-rg clusternode2 No Online clusternode1 No Offline |
On clusternode1, a zpool list will show the clustered zpools imported and available:
|
1 2 3 4 5 |
# zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT ha-zone-1-pool 7.94G 85K 7.94G 0% 1.00x ONLINE / ha-zone-2-pool 7.94G 131K 7.94G 0% 1.00x ONLINE / rpool 15.6G 5.39G 10.2G 34% 1.00x ONLINE - |
On clusternode2, the zpools will not be available:
|
1 2 |
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT rpool 15.6G 5.61G 10.0G 35% 1.00x ONLINE - |
We can now switch both resource groups over (i.e. fail them over) to clusternode2:
|
1 |
# clresourcegroup switch -n clusternode2 + |
Note the use of the “+” argument again, to fail all resource groups over, rather than specifying each one.
Verify that the zpools are now available on clusternode2:
|
1 2 3 4 5 |
# zpool list NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT ha-zone-1-pool 7.94G 132K 7.94G 0% 1.00x ONLINE / ha-zone-2-pool 7.94G 132K 7.94G 0% 1.00x ONLINE / rpool 15.6G 5.61G 10.0G 35% 1.00x ONLINE - |
Excellent. So we know where we are, let’s fail them back to clusternode1 before we continue:
|
1 |
# clresourcegroup switch -n clusternode1 + |
Next, add entries to /etc/hosts on BOTH NODES for the IP addresses of the highly available zones we are about to configure:
|
1 2 3 4 |
# vi /etc/hosts ... 10.1.1.71 ha-zone-1 10.1.1.72 ha-zone-2 |
Whilst you can do things the “normal” way via zonecfg and specify IP addresses during zone configuration, these will only be protected via IPMP. If both interfaces fail, a failover will not be triggered. For this failover to occur, we need to use a LogicalHostname resource, and have that provide the zone’s IP (all will become clear during zone boot registration later in the process).
Add the LogicalHostname resources, referencing the hostnames (-h <hostname>) for the zones that were just added to /etc/hosts:
|
1 2 |
# clreslogicalhostname create -g ha-zone-1-rg -h ha-zone-1 ha-zone-1-lh-res # clreslogicalhostname create -g ha-zone-2-rg -h ha-zone-2 ha-zone-2-lh-res |
Check the status of all resources added so far:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# clresource status === Cluster Resources === Resource Name Node Name State Status Message ------------- --------- ----- -------------- ha-zone-1-lh-res clusternode2 Offline Offline clusternode1 Online Online - LogicalHostname online. ha-zone-1-hasp clusternode2 Offline Offline clusternode1 Online Online ha-zone-2-lh-res clusternode2 Offline Offline clusternode1 Online Online - LogicalHostname online. ha-zone-2-hasp clusternode2 Offline Offline clusternode1 Online Online |
At this point, make sure you can ping the logical hostnames:
|
1 2 3 4 |
# ping ha-zone-1 ha-zone-1 is alive # ping ha-zone-2 ha-zone-2 is alive |
Perform a failover or two (clrg switch -n <node> +) and ensure that you can still ping the logical hostnames. Once you’re happy, make sure everything is failed back to clusternode1.
Zone Creation, Installation and Boot Verification
Run through zonecfg on BOTH nodes for the first zone - ha-zone-1. Make sure you specify the zonepath on the shared storage. By default, the zpools are mounted at /<zpool-name>, so our zonepaths will be /<zpool-name>/<zone-name> - for example /ha-zone-1-pool/ha-zone-1 for the first zone. The ZFS filesystem will be created in the zpool during zone installation. So, on both nodes, run through zonecfg as follows:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# zonecfg -z ha-zone-1 Use 'create' to begin configuring a new zone. zonecfg:ha-zone-1> create -b zonecfg:ha-zone-1> set zonepath=/ha-zone-1-pool/ha-zone-1 zonecfg:ha-zone-1> set autoboot=false zonecfg:ha-zone-1> set ip-type=shared zonecfg:ha-zone-1> add attr zonecfg:ha-zone-1:attr> set name=osc-ha-zone zonecfg:ha-zone-1:attr> set type=boolean zonecfg:ha-zone-1:attr> set value=true zonecfg:ha-zone-1:attr> end zonecfg:ha-zone-1> verify zonecfg:ha-zone-1> commit zonecfg:ha-zone-1> exit |
A few things to note. Make sure you set autoboot to false as the zone boot will be managed by the cluster. Ensure you set ip-type to shared, otherwise it will not work with the LogicalHostname resource type created early. Finally, the osc-ha-zone boolean attribute must be created, and set to true.
On both nodes, verify that the zone has been configured:
|
1 2 3 4 |
# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared - ha-zone-1 configured /ha-zone-1-pool/ha-zone-1 solaris shared |
Time to install the zone. Only do this on clusternode1 (or wherever the ha-zone-1-rg resource group is active) - verify that the resource group is active first:
|
1 2 3 4 5 6 7 8 |
# clresourcegroup status ha-zone-1-rg === Cluster Resource Groups === Group Name Node Name Suspended Status ---------- --------- --------- ------ ha-zone-1-rg clusternode2 No Offline clusternode1 No Online |
Install the zone:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# zoneadm -z ha-zone-1 install The following ZFS file system(s) have been created: ha-zone-1-pool/ha-zone-1 Progress being logged to /var/log/zones/zoneadm.20130523T101655Z.ha-zone-1.install Image: Preparing at /ha-zone-1-pool/ha-zone-1/root. AI Manifest: /tmp/manifest.xml.PraOQv SC Profile: /usr/share/auto_install/sc_profiles/enable_sci.xml Zonename: ha-zone-1 Installation: Starting ... Creating IPS image Startup linked: 1/1 done Installing packages from: solaris origin: http://pkg.oracle.com/solaris/release/ ha-cluster origin: http://localhost:1008/ha-cluster/4b3e5668933b4fb3f81bd9f7369b2c2dcb6b42be/ DOWNLOAD PKGS FILES XFER (MB) SPEED Completed 183/183 33556/33556 222.2/222.2 1.2M/s PHASE ITEMS Installing new actions 46825/46825 Updating package state database Done Updating image state Done Creating fast lookup database Done Installation: Succeeded Note: Man pages can be obtained by installing pkg:/system/manual done. Done: Installation completed in 556.655 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 /ha-zone-1-pool/ha-zone-1/root/var/log/zones/zoneadm.20130523T101655Z.ha-zone-1.install |
On clusternode1, verify that the zone is now installed:
|
1 2 3 4 |
# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared - ha-zone-1 installed /ha-zone-1-pool/ha-zone-1 solaris shared |
Next, on BOTH NODES, configure the second zone - ha-zone-2:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# zonecfg -z ha-zone-2 Use 'create' to begin configuring a new zone. zonecfg:ha-zone-2> create -b zonecfg:ha-zone-2> set zonepath=/ha-zone-2-pool/ha-zone-2 zonecfg:ha-zone-2> set autoboot=false zonecfg:ha-zone-2> set ip-type=shared zonecfg:ha-zone-2> add attr zonecfg:ha-zone-2:attr> set name=osc-ha-zone zonecfg:ha-zone-2:attr> set type=boolean zonecfg:ha-zone-2:attr> set value=true zonecfg:ha-zone-2:attr> end zonecfg:ha-zone-2> verify zonecfg:ha-zone-2> commit zonecfg:ha-zone-2> exit |
Once the configuration is complete, clone the zone. Only do this on clusternode1:
|
1 2 3 4 5 |
# zoneadm -z ha-zone-2 clone ha-zone-1 The following ZFS file system(s) have been created: ha-zone-2-pool/ha-zone-2 Progress being logged to /var/log/zones/zoneadm.20130523T102809Z.ha-zone-2.clone Log saved in non-global zone as /ha-zone-2-pool/ha-zone-2/root/var/log/zones/zoneadm.20130523T102809Z.ha-zone-2.clone |
And verify. At this point you should have two zones in an installed state:
|
1 2 3 4 5 |
# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared - ha-zone-1 installed /ha-zone-1-pool/ha-zone-1 solaris shared - ha-zone-2 installed /ha-zone-2-pool/ha-zone-2 solaris shared |
Boot the first zone, connect to the zone console, and run through the system configuration screens (see my article on Solaris 11 Zones for a way to avoid this by using System Profiles):
|
1 2 |
# zoneadm -z ha-zone-1 boot # zlogin -C -e '#.' ha-zone-1 |
Once done, shutdown and detach the zone:
|
1 2 |
# zoneadm -z ha-zone-1 shutdown # zoneadm -z ha-zone-1 detach -F |
Repeat for the second zone:
|
1 2 3 4 |
# zoneadm -z ha-zone-2 # zlogin -C -e '#.' ha-zone-2 # zoneadm -z ha-zone-2 shutdown # zoneadm -z ha-zone-2 detach -F |
Once both zones are detached, they should appear in a configured state on clusternode1:
|
1 2 3 4 5 |
# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared - ha-zone-1 configured /ha-zone-1-pool/ha-zone-1 solaris shared - ha-zone-2 configured /ha-zone-2-pool/ha-zone-2 solaris shared |
Next, as we are building failover zones (this step is not needed for multi-master zones), we need to set the current boot environment UUID on clusternode2 to the same UUID as the current boot environment on clusternode1. Grab the UUID for both boot environments with beadm:
|
1 2 3 4 5 6 7 |
clusternode1# beadm list -H solaris;13d611ab-8acf-4e69-a71c-eaccba35b384;NR;/;4904764928;static;1369152367 solaris-backup-1;7aae584a-4fd9-4929-cea7-8a95d58b46e4;;;199680;static;1369226249 clusternode2# beadm list -H solaris;bda542b2-05f0-e60f-96de-97b08ee9ac2c;NR;/;4290835456;static;1369144445 solaris-backup-1;2f71a4c3-e51f-6909-dddf-e0e777385808;;;207872;static;1369226246 |
You can see here that the current active environment (denoted by a “N” in the third field for “active now”) on clusternode1 has a UUID ending in eaccba35b384. We’ll replace the UUID on the second node (the one ending in 97b08ee9ac2c) with this value. On clusternode2, ascertain the correct ZFS filesystem to apply the UUID to:
|
1 2 3 |
# df -b / Filesystem avail rpool/ROOT/solaris 10435090 |
Then, set the org.opensolaris.libbe property to the same UUID value present on clusternode1:
|
1 2 3 |
# zfs set \ > org.opensolaris.libbe:uuid=13d611ab-8acf-4e69-a71c-eaccba35b384 \ > rpool/ROOT/solaris |
Verify that it’s been updated correctly:
|
1 2 3 |
# beadm list -H solaris;13d611ab-8acf-4e69-a71c-eaccba35b384;NR;/;4290835456;static;1369144445 solaris-backup-1;2f71a4c3-e51f-6909-dddf-e0e777385808;;;207872;static;1369226246 |
OK - now fail the resource groups over to clusternode2:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# clresourcegroup switch -n clusternode2 + # clresourcegroup status + === Cluster Resource Groups === Group Name Node Name Suspended Status ---------- --------- --------- ------ ha-zone-1-rg clusternode2 No Online clusternode1 No Offline ha-zone-2-rg clusternode2 No Online clusternode1 No Offline |
Attach and boot both zones on clusternode2, and make sure they work. They should boot into the same fully configured state as you left them on clusternode1:
|
1 2 3 4 5 6 |
# zoneadm -z ha-zone-1 attach -F # zoneadm -z ha-zone-2 attach -F # zoneadm -z ha-zone-1 boot # zoneadm -z ha-zone-2 boot # zlogin -C -e '#.' ha-zone-1 # zlogin -C -e '#.' ha-zone-2 |
If all is well, shut the zones back down and detach them. I’ll leave the resource groups online on clusternode2 for now.
|
1 2 3 4 |
# zoneadm -z ha-zone-1 shutdown # zoneadm -z ha-zone-2 shutdown # zoneadm -z ha-zone-1 detach -F # zoneadm -z ha-zone-2 detach -F |
Conclusion
We now have a cluster containing two resource groups, and each resource group contains a failover filesystem resource and a failover logical hostname resource. I’ve also created the two zones that will be made highly-available in the next article, and verified that they can be booted on both nodes of the cluster (provided the resource group is available on the node the zone is booted on).
The next article will focus on making the two zones highly-available, configuring a couple of HA iPlanet SMF resources, and tying up any loose ends.