Ou, we've been waiting it so much. Really delightful thing.
Thanks.

On Mon, Nov 18, 2013 at 9:49 PM, James Hogarth <[email protected]> wrote:
> Hi all,
>
> We've been looking at improving the behaviour when nbproc > 1
>
> We focused on making the unix control socket have deterministic rather than
> almost random behaviour (depending on which process picks up the incoming
> request).
>
> There still remains larger issues with nbproc which may affect your decision
> to use it (each process maintaining it's own session persistence, maxconns,
> separated stats, etc) but this at least allows for some control of the
> sessions when doing so.
>
> The general idea was to make use of existing functionality to minimise code
> additions or modifications and as such there is very little it touches that
> could cause a problem in itself (indeed setting multiple stats socket lines
> already created bindings to multiple control sockets but just to all
> processes).
>
> To control all processes a wrapper of some nature is still needed to iterate
> through all the sockets to gather data or send commands to each one.
>
> To make use of this functionality just have one stats socket line per
> process defined in nbproc.
>
> As an example:
>
> global
>   nbproc 4
>   stats socket /var/run/haproxy.1.sock
>   stats socket /var/run/haproxy.2.sock
>   stats socket /var/run/haproxy.3.sock
>   stats socket /var/run/haproxy.4.sock
>
> To stop sample-frontend only for maintenance on all processes:
>
> for {1..4}
> do
> echo 'disable fontend sample-frontend' | socat /var/run/haproxy.1.sock
> done
>
> Kind regards,
>
> James
>
>
> ___________
>
>
> From e8c72a98b9b626f5c853f00f82dcfb1b6dec7764 Mon Sep 17 00:00:00 2001
> From: James Hogarth <[email protected]>
> Date: Mon, 18 Nov 2013 17:26:53 +0000
> Subject: [PATCH] Add multiple sockets to stats process for the case nbproc >
> 1
>
> ---
>  doc/configuration.txt |  2 ++
>  src/cfgparse.c        |  2 +-
>  src/haproxy.c         | 19 +++++++++++++++++++
>  3 files changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/doc/configuration.txt b/doc/configuration.txt
> index 0b4844b..0802739 100644
> --- a/doc/configuration.txt
> +++ b/doc/configuration.txt
> @@ -632,6 +632,8 @@ stats socket [<address:port>|<path>] [param*]
>    All parameters supported by "bind" lines are supported, for instance to
>    restrict access to some users or their access rights. Please consult
>    section 5.1 for more information.
> +
> +  Multiple stats socket lines can be in global if nbproc is greater than 1
> controlling each process.
>
>  stats timeout <timeout, in milliseconds>
>    The default timeout on the stats socket is set to 10 seconds. It is
> possible
> diff --git a/src/cfgparse.c b/src/cfgparse.c
> index 28507dd..5507d89 100644
> --- a/src/cfgparse.c
> +++ b/src/cfgparse.c
> @@ -7144,7 +7144,7 @@ out_uri_auth_compat:
>   /* Check multi-process mode compatibility */
>   if (global.nbproc > 1) {
>   if (global.stats_fe && !global.stats_fe->bind_proc) {
> - Warning("stats socket will not work as expected in multi-process mode
> (nbproc > 1), you should force process binding using 'stats
> bind-process'.\n");
> + Warning("stats socket will not work as expected in multi-process mode
> (nbproc > 1), you should force process binding using 'stats bind-process' or
> provide multiple stats sockets lines - one for each process.\n");
>   }
>   }
>
> diff --git a/src/haproxy.c b/src/haproxy.c
> index bc03a73..a15b81c 100644
> --- a/src/haproxy.c
> +++ b/src/haproxy.c
> @@ -1563,6 +1563,25 @@ int main(int argc, char **argv)
>   px = px->next;
>   }
>
> + /* unbind unix control sockets leaving one on each process for
> deterministic control */
> + {
> + int ListenCount = 1;
> + struct proxy * px = proxy;
> +
> + while (px != NULL) {
> + if (strcmp(px->id , "GLOBAL") == 0) {
> + struct listener * l;
> + list_for_each_entry(l, &px->conf.listeners, by_fe) {
> + if(ListenCount != relative_pid && !(px->bind_proc)){
> +    unbind_listener(l);
> + }
> + ListenCount++;
> + }
> + }
> + px = px->next;
> + }
> + }
> +
>   if (proc == global.nbproc) {
>   if (global.mode & MODE_SYSTEMD) {
>   for (proc = 0; proc < global.nbproc; proc++)
> --
> 1.8.4.2
>
>



-- 
The more you know, the less you need.
Rgrds, Pavel Morozov

Reply via email to