|  An 
              Introduction to IBM's Network Dispatcher
 Mike Wilcox
              The Internet has brought us many new technologies as well as new 
              requirements for the Web-based application. One urgent need is for 
              high availability and rapid scalabilty of the infrastructure supporting 
              our Web-based application. To meet this need, I am going to discuss 
              "client spraying". In a basic setup, an HTTP client will 
              connect to one HTTP server. However, if this server is down or is 
              busy, there is not a backup server for the client to connect to. 
              Although there are other ways to correct this problem, the method 
              used by IBM's Network Dispatcher is called "client spraying". 
              The idea behind client spraying is to create a pool of HTTP servers 
              and allow a client to connect to any one of the available servers. 
              Because the Network Dispatcher only allows connections to available 
              servers, high availability can be achieved. By adding more servers 
              to the pool and then using advisors (which I will address later), 
              the Network Dispatcher can load balance among the available servers. 
              The ease of adding servers combined with the load balancing provides 
              a powerful architecture to scale our application's server resources. 
              My goal in this article is to introduce the technology and then, 
              via an example, elaborate on how the Network Dispatcher works. I 
              will start with a discussion of how load balancing and high availability 
              of the servers is achieved using Network Dispatcher's advisors 
              and metrics. I will then discuss how high availability is built 
              into the Network Dispatcher, so that the Network Dispatcher is not 
              a single point of failure.
              I'll begin with a simple example of one machine running Network 
              Dispatcher (ND1) and two servers (HTTP1 and HTTP2) running our application. 
              See Figure 1. Our Network Dispatcher cluster address is 9.9.10.1 
              (www.mike.com), and we are spraying port 80. From the client's 
              perspective, the client makes a request to a specific IP address 
              and port and gets a response for a server, in this example HTTP2. 
              There are two critical concepts here: one is that the client does 
              not know that Network Dispatcher is involved, and the second is 
              that the response from the server (in our example, HTTP 2) is sent 
              directly back to the client and bypasses ND1. The second point is 
              subtle, but important. From a performance standpoint, we do not 
              want all the traffic to have to go from the server back through 
              ND1; and if we consider the typical HTTP-based application flow, 
              the client will send a small amount of data to ND1 (e.g., a URL 
              and page request). The HTTP server can send large amounts of data 
              back to the client (e.g., to send an HTML page with many pictures).
              Network Dispatcher Advisors
              The next time the client makes a request, it may get connected 
              either to HTTP1 or HTTP2, depending upon what ND1 chooses. To determine 
              the availability of a server, ND1 will be running what are called 
              Network Dispatcher Advisors. These advisors are Java programs that 
              run on ND1. Advisors that come with the product include: ping, 
              socket, SSL, telnet, ftp, NNTP, SMTP, POP3, 
              IMAP, and HTTP). In this example, I will use an HTTP advisor on 
              ND1, which sends an HTTP "Get request" to each server, 
              and then time how long each server takes to get a response back 
              to ND1. The server with the shortest response time is marked the 
              best, while the next shortest response time is marked second, and 
              so on until all the servers have been ordered. In this example, 
              only two servers are involved, so either HTTP1 or HTTP2 will be 
              marked as the "best." 
              If a server does not respond in specific period of time (e.g., 
              if the server is down), then the HTTP advisor marks the server down 
              and ND1 will not dispatch any more clients to that node. If the 
              advisor code determines that the HTTP Get response was unsatisfactory 
              (e.g., if "Error 404" occurred in response to the HTTP 
              Get), then the HTTP advisor could mark the server down as well. 
              Another key feature of Network Dispatcher is that it handles server 
              failure by routing around the failed server, and we have a very 
              powerful tool to use to decide when a server is actually down. The 
              default HTTP Advisor in ND will only mark a server down if the server 
              response times out, but you can easily create your own advisor. 
              The appendix of the Network Dispatcher User's Guide contains 
              the source code for an HTTP Advisor, and you can easily modify the 
              advisor to look for the actual response from the HTTP Get.
              This approach to determining whether a server is up or down has 
              been described as the "client's eye view of the application", 
              because we're looking for a response from the server that indicates 
              that the application is available for useful work from the client's 
              perspective. The client may have to traverse many layers to get 
              to usable data. For example, the client may have to connect to the 
              HTTP server first and then on to the application server, which will 
              then make a call to a database. If any of these layers has a problem 
              on the server being tested, then the advisor should mark the server 
              as down. We then have the ability to dispatch around a "bad" 
              server with either the supplied advisor or our own custom "client's 
              eye" advisor.
              Which Is the Best?
              I will now discuss how Network Dispatcher selects the "best" 
              server for the client to connect to. If we can select the best server 
              on a regular basis, we can then "load balance" across 
              our servers. There are actually four components, I will call them 
              metrics, used to determine the "best" server. These metrics 
              are:
              
              1. The number of active connections to the server
              2. The number of connections sent to the server recently
              3. The advisor's response
              4. The Interactive Session Support (ISS) agent input
              
              These four metrics can be weighted in any fashion. For example, 
              30%, 30%, 30%, and 10 % would indicate that ISS input is not as 
              heavily weighted as the other three metrics. The first metric is 
              simply a count of the connections, while the second metric is a 
              count of the number of connections during the last window. The window 
              is a value that can be changed, but changing the window length is 
              generally not required. The third metric was discussed above, while 
              the fourth metric is a new topic. ISS agents provide statistics 
              based on system load as derived from CPU load or free memory, or 
              you can write a custom value. Typically, the best weighting of the 
              metrics is 30% or greater for active connections and 30% for recent 
              connections, with the remaining 40% falling on ISS and advisor input. 
              Network Dispatcher is composed of two main programs: the executor 
              and the ndserver. The executor is responsible for reading the TCP 
              header from the client, doing a lookup in a table to find the correct 
              server to spray to, and then dispatching the client packet to a 
              server. Because every client packet is sent to the executor, the 
              executor is a key part in determining the Network Dispatcher's 
              performance. The "in memory connection" table in combination 
              with the executor running in kernel space allows the Network Dispatcher 
              to be very efficient in "spraying" a client request. With 
              the ndserver handling all the other activities (particularly the 
              important task of updating the "in-memory connection" 
              table), the executor is free to handle only the few tasks mentioned 
              above.
              The last issue involves what happens with Network Dispatcher software 
              crashes. The answer lies in using Network Dispatcher's High 
              Availability option, which comes free with the product. With the 
              HA option, you run Network Dispatcher code on two separate machines. 
              One machine acts as the primary (ND1-primary) and the other machine 
              acts as a backup (ND1-backup). See Figure 2. The cluster status 
              is communicated between the machines via heartbeats. Then, when 
              the primary machine dies, the backup Network Dispatcher takes over.
              One of the keys to the success of the failover is the passing 
              of the "in-memory" connection table from the primary Network 
              Dispatcher to the backup Network Dispatcher. The table is actually 
              passed via the heartbeats. With the "in-memory" connection 
              information on the backup node, items like the stickiness setting 
              are maintained after failover. Mutual high availability is supported 
              with the latest version of Network Dispatcher (version 3). Mutual 
              high availability allows you to have one ND as the primary ND for 
              one cluster address and as the backup ND for a second cluster address. 
              Therefore, you utilize both machines for dispatching. By sending 
              out ping-like requests to a third machine, typically a high-profile 
              router, the network dispatcher can also detect a network card failure. 
              Thus, in the event that a network adapter fails on the primary (ND1-primary), 
              the "reach machine" will not be accessible, and a failover 
              to the backup network dispatcher (ND1-backup) will occur.
              Network Dispatcher also supports "co-location", which 
              allows you to run your application on the same machine as the Network 
              Dispatcher. Thus, in the previous example, we could run the Network 
              Dispatcher (ND1) on the server node HTTP1. If we run the backup 
              Network Dispatcher on HTTP2, we have reduced the setup to only two 
              nodes. However, we have a highly available application, because 
              any one node could crash and we would survive. We also have load 
              balanced our client connections and, if we need more servers, we 
              simply add them to our Network Dispatcher cluster.
              Conclusion
              I have provided a brief introduction into the features of the 
              Network Dispatcher. In addition to the key points of high availability, 
              load balancing, and scaling, remember that the Network Dispatcher 
              will dispatch any port, not just port 80 (the example port). With 
              this in mind, many applications can use the Network Dispatcher. 
              For example, Oracle's financial application (Oracle 10 or 11), 
              routers, firewalls, and so forth. Some barriers may come to mind 
              as you think through the potential uses for Network Dispatcher, 
              but I have only discussed a few of the features here. In the future, 
              I may address additional features such as content-based routing, 
              wide-area dispatching, dynamic DNS, IP-rules, and Web traffic express. 
              Network Dispatcher can run on Windows NT and 2000, AIX, Solaris, 
              and Linux. Good luck, and start the sprayers.
              Mike Wilcox has worked with AIX systems and TCP networking 
              for the past 11 years. The majority of this time has been as a consultant 
              to fortune 500 companies, building the infrastructure for applications 
              ranging from ERP applications to "Web browser-enabled applications". 
              Mike is a senior member of IEEE and has been certified in HACMP, 
              SP, TSM on AIX (a.k.a. ADSM), and multiple AIX certifications. His 
              most recent project was to build a highly available e-business infrastructure 
              composed of multiple backend platforms using WebSphere Application 
              Server, WebSphere Performance Pack, IBM's content manager, 
              MQ, DB2, and AIX. Mike can be contacted at: mwilcox1@ieee.org.
       |