/lbwwd

HAproxy Load Balancer Weight WatchDog

lbwwd is designed for use with HAProxy

It polls backend server load to dynamically change their weight on haproxy through haproxy socket.


How to start lbwwd:
* all parameters are mandatory
* required system user lbwwd with write privilege on log dir and haproxy socket

/srv/libexec/watchdog/lbwwd -i 60 -b dynamic -s w215:192.168.213.215:80,w216:192.168.213.216:80, -l /srv/log/lbwwd/www_1.log -p /srv/log/lbwwd/www_1.pid -k /srv/sock/haproxy/www_1.sock -u www.mysite.net:/load_check/index.jsp

Parameters:
-i : poll interval
-b : backend name
-s : serverlist; name1:ip1:port1,name2:ip2:port2,name3:ip3:port3,...
-l : log file location
-p : pid file location
-k : haproxy socket location
-u : check url; http_1.1_host_header:/url or /url; must return a string like LOAD=xxx where 0 < xxx < 100

haproxy is configured like this:
global
  daemon
  maxconn 4096
  user haproxy
  group haproxy
  stats socket /srv/sock/haproxy/www_1.sock user lbwwd group haproxy level admin
[...cut...]
backend dynamic
  cookie LBID insert indirect nocache maxidle 30m maxlife 8h
  balance roundrobin
  server w215 192.168.213.215:80 cookie w215 weight 50
  server w216 192.168.213.216:80 cookie w216 weight 50


load check page is like this (jsp)
<%@page import="java.io.*,java.util.*,javax.management.*,org.apache.commons.modeler.Registry"%><%!
public int getLoadValue(String workerName){
  MBeanServer mBeanServer = null;
  mBeanServer = Registry.getRegistry().getServer();
  String qry = "Catalina:type=ThreadPool,name="+workerName;
  Set names = null;
  try {
    names=mBeanServer.queryNames(new ObjectName(qry), null);
    Iterator it=names.iterator();
    if (it.hasNext()) {
      ObjectName oname = (ObjectName)it.next();
      MBeanInfo minfo=mBeanServer.getMBeanInfo(oname);
      MBeanAttributeInfo attrs[]=minfo.getAttributes();
      Object value = null;
      
      String threadsBusyString = mBeanServer.getAttribute(oname, "currentThreadsBusy").toString();
      String threadCountString = mBeanServer.getAttribute(oname, "currentThreadCount").toString();
      
      int threadsBusy = Integer.parseInt(threadsBusyString.trim());
      int threadCount = Integer.parseInt(threadCountString.trim());
	        
      int rap =(int) ((double)threadsBusy * 100 / (double)threadCount) ;
      if (rap > 100) rap=100;
      if (rap < 0) rap = 0;
	  
      return rap;
    }else{
      return 50;
    }
  } catch (Exception e) {
    return 50;
  }
}
%><%
int k = getLoadValue("http-80");
out.println("LOAD="+k);
%>