付録C. サンプル構成ファイル

この付録には、Load Balancer の Dispatcher コンポーネントに関するサンプル構成ファイルを記載しています。

サンプルの Load Balancer 構成ファイル

サンプル・ファイルは次のディレクトリーにあります。

Dispatcher 構成ファイル — AIX、Linux、および Solaris システム

#!/bin/bash
#
# configuration.sample - Sample configuration file for the
Dispatcher component
#
#
# Ensure the root user is the one executing this script.
#
# iam=`whoami`
 
# if [ "$iam" != "root" ]if [ "$iam" != "root" ]
#  then 
#  echo "You must login as root to run this script"
#   exit 2
# fi 

#
# First start the server
#
# dsserver start
# sleep 5

#
# Then start the executor
#
# dscontrol executor start

#
#  The Dispatcher can be removed at any time using the 
# "dscontrol executor stop" and "dsserver stop" commands to 
# stop the executor and server respectively prior to removing 
# the Dispatcher software.
#
# The next step in configuring the Dispatcher is to set the 
# NFA (non-forwarding address) and the cluster address(es).
#
# The NFA is used to remotely access the Dispatcher machine 
# for administration or  configuration purposes.  This 
# address is required since the Dispatcher will forward  packets 
# to the cluster address(es).
# 
# The CLUSTER address is the hostname (or IP address) to 
# which remote clients will connect.
#
# Anywhere in this file, you may use hostnames and IP 
# addresses interchangeably.
#

# NFA=hostname.domain.name
# CLUSTER=www.yourcompany.com

# echo "Loading the non-forwarding address"
# dscontrol executor set nfa $NFA

#
#  The next step in configuring the Dispatcher is to create 
# a cluster.  The Dispatcher will route requests sent to 
# the cluster address to the corresponding server machines
# defined to that cluster.  You may configure and server 
# multiple cluster address using Dispatcher. 

# Use a similar configuration for CLUSTER2, CLUSTER3, etc.
#

# echo "Loading first CLUSTER address "
# dscontrol cluster add $CLUSTER

#
# Now we must define the ports this cluster will use.  Any 
# requests received by the Dispatcher on a defined port will 
# be forwared to the corresponding port of one of the server 
# machines.
#

# echo "Creating ports for CLUSTER: $CLUSTER"

# dscontrol port add $CLUSTER:20+21+80

#
# The last step is to add each of the server machines to the 
# ports in this cluster.
# Again, you can use either the hostname or the IP address 
# of the server machines.
#

# SERVER1=server1name.domain.name
# SERVER2=server2name.domain.name 
# SERVER3=server3name.domain.name

# echo "Adding server machines"
# dscontrol server add $CLUSTER:20+21+80:
# $SERVER1+$SERVER2+$SERVER3

#
#  We will now start the load balancing components of the 
# Dispatcher.  The main load  balancing component is called 
# the manager and the second load balancing components are the 
# advisors.  If the manager and advisors are not running the 
# Dispatcher sends requests in a round-robin format.  Once the 
# manager is started, weighting decisions based on the number 
# of new and active connections is employed and incoming 
# requests are sent to the best server.  The advisors give the 
# manager further insight into a servers ability to service 
# requests as well as detecting whether a server is up.  If
# an advisor detects that a server is down it will be 
# marked down (providing the manager proportions have been 
# set to include advisor input) and no further requests will be
# routed to the server.

#  The last step in setting up the load balancing components 
# is to set the manager proportions.  The manager updates the 
# weight of each of the servers based on four policies:
#   1. The number of active connections on each server.
#   2. The number of new connections to each server.
#   3. Input from the advisors.
#   4. Input from the system level advisor.
# These proportions must add up to 100.  As an example, setting 
# the manager proportions to
#    dscontrol manager proportions 48 48 0 0
# will give active and new connections 48% input into the 
# weighting decision, the advisors will contribute 4% and 
# the system input will not be considered.
#
# NOTE: By default the manager proportions are set to 50 50 0 0
#

# echo "Starting the manager..."
# dscontrol manager start

# echo "Starting the FTP advisor on port 21 ..."
# dscontrol advisor start ftp 21
# echo "Starting the HTTP advisor on port 80 ..."
# dscontrol advisor start http 80
# echo "Starting the Telnet advisor on port 23 ..."
# dscontrol advisor start telnet 23
# echo "Starting the SMTP advisor on port 25 ..."
# dscontrol advisor start smtp 25
# echo "Starting the POP3 advisor on port 110 ..."
# dscontrol advisor start pop3 110
# echo "Starting the NNTP advisor on port 119 ..."
# dscontrol advisor start nntp 119
# echo "Starting the SSL advisor on port 443 ..."
# dscontrol advisor start ssl 443
#

# echo "Setting the manager proportions..."
# dscontrol manager proportions 58 40 2 0

#
# The final step in setting up the Dispatcher machine is to 
# alias the Network Interface Card (NIC).
#
# NOTE: Do NOT use this command in a high availability 
# environment.  The go* scripts will configure the NIC and 
# loopback as necessary.
# dscontrol executor configure $CLUSTER

#  If your cluster address is on a different NIC or subnet 
from the NFA use the following format for the cluster configure 
command.
#  dscontrol executor configure $CLUSTER tr0 0xfffff800
# where tr0 is your NIC (tr1 for the second token ring card, en0 
# for the first ethernet card) and 0xfffff800 is a valid 
# subnet mask for your site.
#

#
# The following commands are set to the default values.  
# Use these commands as a guide to change from the defaults.
#  dscontrol manager loglevel    1
#  dscontrol manager logsize     1048576
#  dscontrol manager sensitivity 5
#  dscontrol manager interval    2
#  dscontrol manager refresh     2
#
#  dscontrol advisor interval ftp  21  5
#  dscontrol advisor loglevel ftp  21  1
#  dscontrol advisor logsize  ftp  21  1048576
#  dscontrol advisor timeout  ftp  21  unlimited
#  dscontrol advisor interval telnet 23 5
#  dscontrol advisor loglevel telnet 23 1
#  dscontrol advisor logsize  telnet 23 1048576
#  dscontrol advisor timeout  telnet 23 unlimited
#  dscontrol advisor interval smtp 25  5
#  dscontrol advisor loglevel smtp 25  1
#  dscontrol advisor logsize  smtp 25  1048576
#  dscontrol advisor timeout  smtp 25  unlimited
#  dscontrol advisor interval http 80  5
#  dscontrol advisor loglevel http 80  1
#  dscontrol advisor logsize  http 80  1048576
#  dscontrol advisor timeout  http 80  unlimited
#  dscontrol advisor interval pop3 110 5    
#  dscontrol advisor loglevel pop3 110 1
#  dscontrol advisor logsize  pop3 110 1048576
#  dscontrol advisor timeout  pop3 110 unlimited
#  dscontrol advisor interval nntp 119 5
#  dscontrol advisor loglevel nntp 119 1
#  dscontrol advisor logsize  nntp 119 1048576
#  dscontrol advisor timeout  nntp 119 unlimited
#  dscontrol advisor interval ssl  443 5
#  dscontrol advisor loglevel ssl  443 1
#  dscontrol advisor logsize  ssl  443 1048576
#  dscontrol advisor timeout  ssl  443 unlimited
#

Dispatcher 構成ファイル — Windows システム

以下は、configuration.cmd.sample というサンプル Load Balancer 構成ファイルであり、Windows で使用するものです。

@echo off
rem configuration.cmd.sample - Sample configuration file for the
rem Dispatcher component.
rem

rem dsserver must be started by Services

rem

rem
rem Then start the executor
rem
rem call dscontrol executor start

rem

rem The next step in configuring the Dispatcher is to set the
rem NFA (non-forwarding address) and to set the cluster 
rem address(es).
rem

rem The NFA is used to remotely access the Dispatcher 
rem machine for administration configuration purposes.  This 
rem address is required since the Dispatcher will forward 
rem packets to the cluster address(es).

rem
rem The CLUSTER address is the hostname (or IP address) to which 
rem remote clients will connect.
rem

rem Anywhere in this file, you may use hostnames and IP 
rem addresses interchangeably. 
rem  NFA=[non-forwarding address]
rem CLUSTER=[your clustername]
rem

rem set NFA=hostname.domain.name
rem set CLUSTER=www.yourcompany.com

rem echo "Loading the non-forwarding address"
rem call dscontrol executor set nfa %NFA%

rem
rem The following commands are set to the default values. 
rem Use these commands to change the defaults

rem  call dscontrol executor set fintimeout 30
rem
rem The next step in configuring the Dispatcher is to create 
rem a cluster.  The Dispatcher will route requests sent to 
rem the cluster address to the corresponding server machines 
rem defined to that cluster.  You may configure and server
rem multiple cluster addresses using Dispatcher.
rem Use a similar configuration for CLUSTER2, CLUSTER3, etc.
rem

rem echo "Loading first CLUSTER address "
rem call dscontrol cluster add %CLUSTER%

rem
rem Now we must define the ports this cluster will use. Any 
rem requests received by the Dispatcher on a defined port 
rem will be forwarded to the corresponding
rem port of one of the server machines.
rem

rem echo "Creating ports for CLUSTER: %CLUSTER%"
rem call dscontrol port add %CLUSTER%:20+21+80

rem
rem The last step is to add each of the server machines to 
rem the ports in this cluster.  Again, you can use either the 
rem hostname or the IP address of the server machines.
rem

rem set SERVER1=server1name.domain.name
rem set SERVER2=server2name.domain.name
rem set SERVER3=server3name.domain.name

rem echo "Adding server machines"
rem call dscontrol server add %CLUSTER%:20+21+80:
rem %SERVER1%+%SERVER2%+%SERVER3%

rem
rem  We will now start the load balancing components of the 
rem Dispatcher.  The main load balancing component is called 
rem the manager and the second load balancing components are the 
rem advisors.  If the manager and advisors are not
rem running the Dispatcher sends requests in a round-robin 
rem format.  Once the manager is started, weighting decisions 
rem based on the number of new and active connections is 
rem employed and incoming requests are sent to the best
rem server.  The advisors give the manager further insight 
rem into a servers ability to service requests as well as 
rem detecting whether a server is up.  If an advisor detects 
rem that a server is down it will be marked down (providing the
rem manager proportions have been set to include advisor 
rem input) and no further requests will be routed to the server.
rem The last step in setting up the load balancing 
rem components is to set the manager proportions.  The 
rem manager updates the weight of each of the servers based 
rem on four policies:

rem   1.  The number of active connections on each server
rem   2.  The number of new connections for each server
rem   3.  Input from the advisors.
rem   4.  Input from the system level advisor.
rem
rem  These proportions must add up to 100.  As an example, 
rem  setting the cluster proportions using
rem      dscontrol cluster set <cluster> proportions 48 48 4 0
rem  will give active and new connections 48% input into the 
rem  weighting decision, the advisor will contribute 4% and 
rem  the system input will not be considered.
rem
rem NOTE: By default the manager proportions are set to 
rem 50 50 0 0

rem echo "Starting the manager..."
rem call dscontrol manager start

rem echo "Starting the FTP advisor on port 21 ..."
rem call dscontrol advisor start ftp 21
rem echo "Starting the HTTP advisor on port 80 ..."
rem call dscontrol advisor start http 80
rem echo "Starting the Telnet advisor on port 23 ..."
rem call dscontrol advisor start telnet 23
rem echo "Starting the SMTP advisor on port 25 ..."
rem call dscontrol advisor start smtp 25
rem echo "Starting the POP3 advisor on port 110 ..."
rem call dscontrol advisor start pop3 110
rem echo "Starting the NNTP advisor on port 119 ..."
rem call dscontrol advisor start nntp 119
rem echo "Starting the SSL advisor on port 443 ..."
rem call dscontrol advisor start ssl 443
rem

rem echo "Setting the cluster proportions..."
rem call dscontrol cluster set %CLUSTER% proportions 58 40 2 0

rem
rem The final step in setting up the Dispatcher machine is
rem  to alias the Network Interface Card (NIC).
rem
rem NOTE: Do NOT use this command in a high availability 
rem environment.  The go* scripts will configure the NIC and 
rem loopback as necessary.
rem
rem dscontrol executor configure %CLUSTER%

rem  If your cluster address is on a different NIC or subnet 
rem  from the NFA use the following format for the cluster 
rem  configure command.
rem  dscontrol executor configure %CLUSTER% tr0 0xfffff800
rem  where tr0 is your NIC (tr1 for the second token ring card,
rem  en0 for the first ethernet card) and 0xfffff800 is 
rem  a valid subnet mask for your site.
rem

rem
rem The following commands are set to the default values.
rem Use these commands to guide to change from the defaults.
rem call dscontrol manager loglevel    1
rem call dscontrol manager logsize     1048576
rem call dscontrol manager sensitivity 5
rem call dscontrol manager interval    2
rem call dscontrol manager refresh     2
rem
rem call dscontrol advisor interval ftp  21  5
rem call dscontrol advisor loglevel ftp  21  1
rem call dscontrol advisor logsize  ftp  21  1048576
rem call dscontrol advisor timeout  ftp  21  unlimited
rem call dscontrol advisor interval telnet 23 5
rem call dscontrol advisor loglevel telnet 23 1
rem call dscontrol advisor logsize  telnet 23 1048576
rem call dscontrol advisor timeout  telnet 23 unlimited
rem call dscontrol advisor interval smtp 25  5
rem call dscontrol advisor loglevel smtp 25  1
rem call dscontrol advisor logsize  smtp 25  1048576
rem call dscontrol advisor timeout  smtp 25  unlimited
rem call dscontrol advisor interval http 80  5
rem call dscontrol advisor loglevel http 80  1
rem call dscontrol advisor logsize  http 80  1048576
rem call dscontrol advisor timeout  http 80  unlimited
rem call dscontrol advisor interval pop3 110 5
rem call dscontrol advisor loglevel pop3 110 1
rem call dscontrol advisor logsize  pop3 110 1048576
rem call dscontrol advisor timeout  pop3 110 unlimited
rem call dscontrol advisor interval nntp 119 5
rem call dscontrol advisor loglevel nntp 119 1
rem call dscontrol advisor logsize  nntp 119 1048576
rem call dscontrol advisor timeout  nntp 119 unlimited
rem call dscontrol advisor interval ssl  443 5
rem call dscontrol advisor loglevel ssl  443 1
rem call dscontrol advisor logsize  ssl  443 1048576
rem call dscontrol advisor timeout  ssl  443 unlimited
rem

サンプル advisor

以下は、ADV_sample という サンプル advisor ファイルです。

/**
 * ADV_sample:  The Load Balancer HTTP advisor
 * 
 * 
 * This class defines a sample custom advisor for Load Balancer.  Like all
 * advisors, this custom advisor extends the function of the advisor base,
 * called ADV_Base.  It is the advisor base that actually performs most of
 * the advisor's functions, such as reporting loads back to the Load Balancer
 * for use in the Load Balancer's weight algorithm.  The advisor base also
 * performs socket connect and close operations and provides send and receive 
 * methods for use by the advisor.  The advisor itself is used only for
 * sending and receiving data to and from the port on the server being
 * advised.  The TCP methods within the advisor base are timed to calculate 
 * the load.  A flag within the constructor in the ADV_base overwrites the 
 * existing load with the new load returned from the advisor if desired.
 *
 * Note: Based on a value set in the constructor,  the advisor base supplies
 * the load to the weight algorithm at specified intervals.  If the actual
 * advisor has not completed so that it can return a valid load, the advisor
 * base uses the previous load.
 *  
 * NAMING 
 * 
 * The naming convention is as follows:
 *
 *  - The file must be located in the following Load Balancer directory:
 *   
 *    lb/servers/lib/CustomAdvisors/ (lb¥servers¥lib¥CustomAdvisors on Windows)
 *
 * - The Advisor name must be preceded with "ADV_".  The advisor can be 
 *    started with only the name, however; for instance, the "ADV_sample"
 *    advisor can be started with "sample".
 *
 * - The advisor name must be in lowercase.
 *
 *  With these rules in mind, therefore, this sample is referred to as:
 * 
 *             <base directory>/lib/CustomAdvisors/ADV_sample.class
 *
 *

 * Advisors, as with the rest of Load Balancer, must be compiled with the 
 * prereq version of Java.  To ensure access to Load Balancer classes, make
 * sure that the ibmlb.jar file (located in the lib subdirectory of the base
 * directory) is included in the system's CLASSPATH.
 *
 * Methods provided by ADV_Base:
 * 
 * - ADV_Base (Constructor):
 *
 *   - Parms
 *     - String sName = Name of the advisor
 *     - String sVersion = Version of the advisor
 *     - int iDefaultPort = Default port number to advise on
 *     - int iInterval = Interval on which to advise on the servers
 *     - String sDefaultName = Unused.  Must be passed in as "".
 *     - boolean replace = True - replace the load value being calculated
 *                                 by the advisor base
 *                         False - add to the load value being calculated
 *                                 by the advisor base
 *   - Return
 *     - Constructors do not have return values.
 *
 * Because the advisor base is thread based, it has several other methods
 * available for use by an advisor.  These methods can be referenced using
 * the CALLER parameter passed in getLoad().
 *
 * These methods are as follows:
 * 
 * - send - Send a packet of information on the established socket connection
 *           to the server on the specified port.
 *   - Parms
 *     - String sDataString - The data to be sent in the form of a string
 *   - Return
 *     - int RC - Whether the data was sucessfully sent or not: zero indicates
 *                 data was sent; a negative integer indicates an error.
 * 
 * - receive - Receive information from the socket connection.
 *   - Parms
 *     - StringBuffer sbDataBuffer - The data received during the receive call
 *   - Return
 *     - int RC - Whether the data was successfully received or not; zero
 *                indicates data was sent; a negative integer indicates
 *                an error.
 *
 * If the function provided by the advisor base is not sufficient, 
 * you can create the appropriate function within the advisor and
 * the methods provided by the advisor base will then be ignored.  
 *
 * An important question regarding the load returned is whether to apply 
 * it to the load being generated within the advisor base, 
 * or to replace it; there are valid instances of both situations.
 * 
 * This sample is essentially the Load Balancer HTTP advisor. It functions
 * very simply: a send request--an http head request--is issued.  Once a
 * response is received, the getLoad method terminates, flagging the advisor
 * base to stop timing the request.  The method is then complete.  The
 * information returned is not parsed; the load is based on the time
 * required to perform the send and receive operations.
 */

package CustomAdvisors;
import com.ibm.internet.nd.advisors.*;

public class ADV_sample extends ADV_Base implements ADV_MethodInterface
{
  String COPYRIGHT = 
            "(C) Copyright IBM Corporation 1997, All Rights Reserved.¥n";

  static final String  ADV_NAME              = "Sample";
  static final int     ADV_DEF_ADV_ON_PORT   = 80;
  static final int     ADV_DEF_INTERVAL      = 7;

  // Note: Most server protocols require a carriage return ("¥r") and line
  //       feed ("¥n") at the end of messages.  If so, include them in
  //       your string here.
  static final String  ADV_SEND_REQUEST      = 
    "HEAD / HTTP/1.0¥r¥nAccept: */*¥r¥nUser-Agent: " +
    "IBM_Load_Balancer_HTTP_Advisor¥r¥n¥r¥n";

  /**
   * Constructor.
   *
   * Parms:  None; but the constructor for ADV_Base has several parameters 
   *         that must be passed to it.
   *
   */
  public ADV_sample()
  {
    super( ADV_NAME,
       "2.0.0.0-03.27.98",
           ADV_DEF_ADV_ON_PORT,
           ADV_DEF_INTERVAL,
           "",     // not used
           false);
    super.setAdvisor( this );
  }


  /**
   * ADV_AdvisorInitialize
   *
   * Any Advisor-specific initialization that must take place after the
   * advisor base is started. This method is called only once and is 
   * typically not used.
   */
  public void ADV_AdvisorInitialize()
  {
    return;
  }


  /**
   * getLoad()
   *
   * This method is called by the advisor base to complete the advisor's
   * operation, based on details specific to the protocol.  In this sample
   * advisor, only a single send and receive are necessary; if more complex
   * logic is necessary, multiple sends and receives can be issued.  For
   * example, a response might be received and parsed.  Based on the 
   * information learned thereby, another send and receive could be issued.
   *
   * Parameters:
   * 
   * - iConnectTime - The current load as it refers to the length of time it
   *                  took to complete the connection to the server through
   *                  the specified port.
   *
   * - caller - A reference to the advisor base class where the Load 
   *            Balancer-supplied methods are to perform simple TCP requests,
   *            mainly send and receive.
   *
   * Results:
   *
   * - The load - A value, expressed in milliseconds, that can either be added
   *   to the existing load, or that can replace the existing load, as 
   *   determined by the constructor's "replace" flag.
   *
   *   The larger the load, the longer it took the server to respond; 
   *   therefore, the lower the weight will become within the Load Balancer.
   *
   *   If the value is negative, an error is assumed.  An error from an 
   *   advisor indicates that the server the advisor is trying to reach is not
   *   accessible and has been identified as being down.  Load Balancer will
   *   not attempt to load balance to a server that is down. Load Balancer will 
   *   resume load balancing to the server when a positive value is received.
   *
   */
  public int getLoad(int iConnectTime, ADV_Thread caller)
  {
    int iRc;
    int iLoad = ADV_HOST_INACCESSIBLE;  // -1

    // Send tcp request
    iRc = caller.send(ADV_SEND_REQUEST);
    if (iRc >= 0)
    {
      // Perform a receive
      StringBuffer sbReceiveData = new StringBuffer("");
      iRc = caller.receive(sbReceiveData);

      /**
      *  In the normal advisor mode ("replace" flag is false), the load
      *  returned is either 0 or 1 indicating the server is up or down. 
      *  If the receive is successful, a load of zero is returned
      *  indicating that the load built within the base advisor is to be used.
      * 
      *  Otherwise ("replace" flag is true), return the desired load value.
      */

      if (iRc >= 0)
      {
        iLoad = 0;
      }
    }
    return iLoad;
  }

} // End - ADV_sample