Re: [lvs-users] Weight being reset

To: " users mailing list." <lvs-users@xxxxxxxxxxxxxxxxxxxxxx>
Subject: Re: [lvs-users] Weight being reset
Cc: keepalived-devel <keepalived-devel@xxxxxxxxxxxxxxxxxxxxx>
From: Graeme Fowler <graeme@xxxxxxxxxxx>
Date: Mon, 14 Jan 2008 20:47:56 +0000

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

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)

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.


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)
  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)
  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.


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