Hi
Will cc this to keepalied list as you posted there too :)
On Mon, 2008-01-14 at 11:19 -0500, Scott McClanahan wrote:
> We run ipvs with keepalived (CentOS 5.1) and often change the run-time
> configuration of real servers by manipulating there weights. Our
> problem is if the backend real server reboots or the application
> restarts, the weight gets reset to the value in the keepalived config
> file which is often times not what we want.
You probably need the following (see keepalived.conf.SYNOPSIS or the man
page), edited slightly, in your virtual_server or virtual_server_group
definitions:
MISC_CHECK { # MISC healthchecker
misc_path <STRING>|<QUOTED-STRING> # External script or program
misc_timeout <INTEGER> # Script execution timeout
# If set, exit code from healthchecker is used
# to dynamically adjust the weight as follows:
# exit status 0: svc check success, weight
# unchanged.
# exit status 1: svc check failed.
# exit status 2-255: svc check success, weight
# changed to 2 less than exit status.
# (for example: exit status of 255 would set
# weight to 253)
misc_dynamic
}
My reading of that is that you replace your healthcheck scripts with a
MISC_CHECK that can lookup the set weight in some way (in a file, a
database, or by parsing the output from ipvsadm - TMTOWTDI, in Perl
parlance) and then return a value appropriate to your circumstance.
Example:
You configure an HTTP realserver with weight 100 in keepalived.conf. You
have a MISC_CHECK script which uses wget, LWP or something to check the
web service is running.
You want to turn the weight down to 75.
Your MISC_CHECK script, as well as doing a health check, can do a lookup
in a file (say /etc/keepalived/weights/$virtual_server). If the file
doesn't exist, skip the weight setting. If it does, read the contents
and set the return code appropriately.
For the avoidance of confusion, you put the *real* weight - 75 - in the
file. The MISC_CHECK then does some meta-logic:
Is the service healthy?
No? Exit 1 (ie. fail)
Yes?
Does /etc/keepalived/weights/$virtual_server exist?
No? Skip this part.
Yes? Read the file and fetch $value.
Is the value numeric, from 2-255?
No? Log the error, Exit 0 (ie. success)
Yes?
Exit $value+2 (ie. success, change weight to $value)
This is untried/untested but if I read you right it should work.
The joy of this is that the weight will then remain at whatever you set
it to in the file *and* persist across service, server, keepalived or
director restarts as long as the file exists.
Graeme
|