Home > lbwwd

lbwwd

Lbwwd is a project mainly written in ..., it's free.

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); %>

Previous:dDDRace