LVS
lvs-users
Google
 
Web LinuxVirtualServer.org

Re: New virtual server patch version 0.5

To: Wensong Zhang <wensong@xxxxxxxxxxxx>
Subject: Re: New virtual server patch version 0.5
Cc: linux-virtualserver@xxxxxxxxxxxx
From: Robert Thomas <rob@xxxxxxxxxx>
Date: Sat, 28 Nov 1998 20:53:13 +1100
Wensong Zhang wrote:

> The xfig program in RedHat-5.1 on my notebook couldn't read the file you
> sent me before. I didn't tell me that and didn't help you to solve your
> problem, sorry. Anyway, you did work it out yourself. congratulations. :-)

Wierd - I made it with the xfig that came with RH5.1.

> >on my list of 'to do's at the moment) I'll see if I can do some 'better'
> >documenation and send it off to Wensong for offical blessing 8-)
> Thank you, Rob.
> 
> I fixed the IP SNAT code (http://proxy.iinchina.net/~wensong/ipnat/) last
> night after I went out to have a dinner with my girl friend. I am now
> writing some documents about the IP SNAT code. Once it is done, I will
> write documents about virtual server, maybe I reorganize the page. But, I
> have already drawn a figure of virtual server via IP tunneling, it looks
> good, so I send it to you, what do you think about it?

Looks good. I mentioned it in the quick docco that I've attached. I haven't
played with it yet, as my virtual cluster is actually in production at the
moment - and working really well 8-)  

Anyway, here's a 'users guide', or, perhaps it's a Mini-HOWTO.  Have a read,
see what you think.

--Rob
         The Greased Turkey Document [1]
                     or
       How to set up a load-sharing server

Release History: 0.01alpha - Rob Thomas - rob@xxxxxxxxxx [Bootstrap of the 
documentation]

This document was written with [homepage link] ippvs version 0.5 and Linux 
Kernel [kernel.org link] 2.0.35 in mind.  

1: Overview

   This document coveres the basics of what ippvs does, how it works, and how 
to set it up. I expect it to expand to cover a decent man(8) page, and a FAQ.  

2: What does it do?

   ippvs is a kernel modification that offers a NAT-style load sharing for 
multiple virtual servers.  What we mean by this is that you have one 
'listening' machine, that transparently (and incredibly quickly) redirect 
clients connection requests to other machines.  The advantages of doing this is 
that it allows you to have huge arrays of redundant and load sharing servers.
   A good example of this (and the example that we will be following through 
this entire document) is the setting up of a cluster of load-sharing proxy 
servers, at a very, very, low cost-per-tps rate.  It's also perfectly suited to 
serving normal web traffic, or allmost anything that can be served over TCP or 
UDP. The only caveat is that it will NOT work with ftp services, because ftp 
services are too smart for their own good. [quick overview of how ftpd tells 
the client which ip and port to connect to, and how that will break the NAT]

3: How does it work?

   In this document, as mentioned above, we will be going through how to set up 
an array of proxy servers, that appear to the clients as one physical machine.  
The first thing you should realise is how the machines should be wired 
together. [2]

   
                                    [ ---  HUB  --- ]
   [proxy server 1]<-eth0------------+ | | | | | | +--------eth0->[proxy server 
4]
   [proxy server 2]<-eth0--------------+ | | | | +----------eth0->[proxy server 
5]
   [proxy server 3]<-eth0----------------+ | | +------------eth0->[proxy server 
6]
                                           | |
                                           | |
                                           | +--eth1->[ippvs server 
0]<-eth0-------...local network...
                                           +----eth1->[ippvs server 
1]<-eth0-------...local network...


[I realise that I use a -very- wide screen, so that'll probably look like crap 
on a 80x24 display - looks good on a 128x24 8)]

  You should have a look at this map, and take notice of a few things:

1: The proxy servers are -not- connected to your LAN - they're on their own 
seperate LAN
2: The machines are connected to the rest of the network THROUGH the ippvs 
server. Make sure their default route is set up that way

In this demonstration, the IP addresses of the machines are:

ippvs server 0:
   eth0:  203.1.1.2  [Machine's IP address]
   eth0:0 203.1.1.10 [Permanant load-sharing IP address]
   eth0:1 203.1.1.11 [Only up if ippvs1 dies - usually DOWN]
   eth1:  10.1.1.254 [Private LAN IP address - non routeable, as only the proxy 
servers see it]
   eth1:0 10.1.1.253 [Only up if ippvs1 dies - usually DOWN]
ippvs server 1:
   eth0:  203.1.1.3  [Machine's IP address]
   eth0:0 203.1.1.11 [Permanant load-sharing IP address]
   eth0:1 203.1.1.10 [Only up if ippvs0 dies - usually DOWN]
   eth1:  10.1.1.253 [Private LAN IP address - non routeable, as only the proxy 
servers see it]
   eth1:0 10.1.1.254 [Only up if ippvs0 dies - usually DOWN]
proxy server 1:
   eth0: 10.1.1.1 
   default route to 10.1.1.254
proxy server 2:
   eth0: 10.1.1.2 
   default route to 10.1.1.254
proxy server 3:
   eth0: 10.1.1.3 
   default route to 10.1.1.254
proxy server 4:
   eth0: 10.1.1.4 
   default route to 10.1.1.253
proxy server 5:
   eth0: 10.1.1.5 
   default route to 10.1.1.253
proxy server 6:
   eth0: 10.1.1.6 
   default route to 10.1.1.253

This looks a bit complex, but if you're not interested in setting up a 
fault-tolerant network you don't need the second ippvs server, or to have half 
the servers talking to one machine, and the other half talking to the other 
machine.  

[XXX - I'm aware that no auto-failover exists, but it'll only be a few 'ping' 
scripts to make it work. - XXX]
[XXX - Should I take out the redunancy stuff until I write some more 
documentation for it? - XXX]

Lets track a packet that's coming from a client machine, to port 8080 on 
203.1.1.10.  

Header: Request connection to port 8080 on 203.1.1.10 from 203.2.3.4 port 9999

   The first thing that happens, is that 203.1.1.10 looks at the headers, and 
realises that it's it's set up as a load sharing port.  ippvs0 picks a machine 
to send it to, and scribbles over the headers, changing the DESTINATION address 
(the SOURCE address stays the same) of the packet, and fires it out.  

Header: Request connection to port 8080 on 10.1.1.2 from 203.2.3.4 port 9999

   The machine 10.1.1.2 accepts the connection, and sends the data back:

Header: Connection accept, 203.2.3.4 port 9999, and here's the data, love from 
10.1.1.2 port 8080.

   The packet then heads back along the wire to the default route, which is 
ippvs0.  The machine then glues the original headers back on and sends the 
packet on it's merry way

Header: Connection accept, 203.2.3.4 port 9999, and here's the data, love from 
203.1.1.10 port 8080.

   All the client sees is a normal connection to 203.1.1.10:8080, as though 
nothing magic was going on behind the scenes.


4:  Wow. This rocks. How do I set it up?

  The only 'setting up' is done on the actual ippvs server(s) - You need to 
pick out your IP addresses for your private LAN, obviously, and configure the 
machines.  This document will pretend that you're using the IP addresses 
specified above - and there's no reason at all why you shouldn't.  This is 
exactly what 10.x.x.x and 192.168.x.x is set aside for.

On ippvs0:
  ipfwadm -F -a m 10.1.2.0/24 -D 0.0.0.0/0 (?? No descrption of '-a m' in man 
ipfwadm?)
  ippfvsadm -A -t 203.1.1.10:8080 -R 10.1.1.1:8080  - Redirect _T_CP 
connections to 203.1.1.10:8080 to 10.1.1.1:8080
  ippfvsadm -A -t 203.1.1.10:8080 -R 10.1.1.2:8080  - and 10.1.1.2:8080
  ippfvsadm -A -t 203.1.1.10:8080 -R 10.1.1.3:8080  - and 10.1.1.3:8080

On ippvs1:
  ipfwadm -F -a m 10.1.2.0/24 -D 0.0.0.0/0 (?? No descrption of '-a m' in man 
ipfwadm?)
  ippfvsadm -A -t 203.1.1.11:8080 -R 10.1.1.1:8080  - Redirect _T_CP 
connections to 203.1.1.11:8080 to 10.1.1.4:8080
  ippfvsadm -A -t 203.1.1.11:8080 -R 10.1.1.2:8080  - and 10.1.1.5:8080
  ippfvsadm -A -t 203.1.1.11:8080 -R 10.1.1.3:8080  - and 10.1.1.6:8080

That's all you have to do.  Now, when you try to make a connection to 
203.1.1.10 or .11 on port 8080, it will be automatically, and invisibly, 
redirected to a random machine.  There are various algorithims that are used to 
balance the load, which are out of the scope of this document at this stage of 
play.

5:  Things you should be aware of that will bite you if you're not careful.

  Allways make sure that the default route of the client machines points to the 
ippvs server.
  0.5 supports tunneling, which I haven't played with, so therefore I don't 
know how it works yet 8-)
  Allways make sure that the default route of the client machines points to the 
ippvs server. (Yes, twice. Don't forget!)

6:  That hi-av thing looks cool. How does that work?

  Hi-av isn't all that hard. When I get some time I'm going to whack together a 
couple of scripts and a database that can keep track of machines and 
automatically remove them from the redirection list, and have another machine 
(ala ippvs1) take over from a failed other ippvs.  It's easy to to it manually. 
 Switch ippvs0 off, run 'ifup eth0:1' and 'ifup eth1:0' on the other machine 
(if you have it set up that way) and then run the ippfvsadm commands that the 
other machine used to do, and it'll take over invisibly.  Go look at the IP 
addresses above if you don't understand what I mean.

Questions, comments and suggestions about this document, please, send to 
rob@xxxxxxxxxx
The Virtual Server mailing list is currently hosted at 
linux-virtualserver@xxxxxxxxxxxx - to subscribe to the maling list, send a 
message to 'majordomo@xxxxxxxxxxxx' with the message BODY (not subject) of 
'subscribe' - it'll all be taken care of from there. Any messages sent to the 
list saying 'I'm not subscribed to this list, so can you email the reply to me 
privately' will be ignored, as it's very, very bad manners.  

--Robert Thomas - 28/11/98

[1] - Kernel versions 2.1.129 and 2.1.130 have earned themselves the names of 
'Greased Weasel' and 'Basted Turkey', due to some light-hearted banter of Linus 
Torvalds in the kernel release notes.  This document was prepared over these 
two kernel revisions!
[2] - This is an 'optimal' diagram.  There's no -physical- reason why the ippvs 
server, the clustered machines, and the clients can't be on the same segment. 
It's just nicer this way. Go buy a $50 hub. Trust us. It's better.

<Prev in Thread] Current Thread [Next in Thread>