Hi Baptiste

Thanks for your replying.

I am using the balance roundrobin algorithm and sticking on src, not the the balance source algorithm. The configuration has been presented in my first mail as below:

>>      backend pool
>>              balance roundrobin.
>>              stick-table type ip size 200k expire 600s
>>              stick on src
>>              server 1 10.128.7.1:80 id 1 cookie srv1 weight 1 maxconn 0
>> slowstart 0s
>>              server 2 10.128.7.2:80 id 2 cookie srv2 weight 1 maxconn 0
>> slowstart 0s
>>

Best Regards,
Godbach

On 2013/5/29 13:35, Baptiste wrote:
Hi Godbach,

Before reading HAProxy source code, it worths reading its
configuration guide for the options you use.
IE, the balance source algorithm would tell you that:

  "This algorithm is static by default, which means that changing a
server's weight on the fly will have no effect, but this can be
changed using "hash-type"."

Please update your configuration following the recommandation above
and let us know your feedback.

Baptiste



On Wed, May 29, 2013 at 5:22 AM, Godbach <[email protected]> wrote:
Hi, all

It is expected that new http request will not get response from the
server of which weight was changed to 0. It cannot work well with
persistence on src but work well without the persistence in lastest
snapshot.

There are two servers in my backend, and persistence on src ip has been
enabled in backend. The configuration in backend as below:

     backend pool
             balance roundrobin.
             stick-table type ip size 200k expire 600s
             stick on src
             server 1 10.128.7.1:80 id 1 cookie srv1 weight 1 maxconn 0
slowstart 0s
             server 2 10.128.7.2:80 id 2 cookie srv2 weight 1 maxconn 0
slowstart 0s

During continuous http requset with the same client, the stick table as
below:
     # table: pool, type: ip, size:204800, used:1
     0x17d2284: key=172.22.16.250 use=0 exp=599095 server_id=1
Then I set weight of server 1 to 0 use command as below:
     set weight pool/1 0
And I get the weight of server 1 with command:
     get weight pool/1
The result is
     0 (initial 1)
So I think I have set the weight of sever1 to 0 successfully. But the
response still comes from server 1 which server 2 is expected. And the
stick table keeps the same.

I review the code of process_sticking_rules() in session.c. The codes
when server is found as below:

1403                         ptr = stktable_data_ptr(rule->table.t, ts,
STKTABLE_DT_SERVER_ID);
1404                         node =
eb32_lookup(&px->conf.used_server_id, stktable_data_cast(ptr, server_id));
1405                         if (node) {
1406                             struct server *srv;
1407
1408                             srv = container_of(node, struct server,
conf.id);
1409                             if ((srv->state & SRV_RUNNING) ||
1410                                 (px->options & PR_O_PERSIST) ||
1411                                 (s->flags & SN_FORCE_PRST)) {
1412                                 s->flags |= SN_DIRECT | SN_ASSIGNED;
1413                                 s->target = &srv->obj_type;
1414                             }
1415                         }
1416                     }
1417                     stktable_touch(rule->table.t, ts, 1);

Line 1409 used (srv->state & SRV_RUNNING) to check the server status.
If I used srv_is_usable() to instead such as below:
-        if ((srv->state & SRV_RUNNING) ||
+        if (srv_is_usable(srv->state, srv->eweight) ||

The new request will get response from server 2 once the weight of
server 1 is set to 0. But it seems to be just a workaround.

Since the manual of haproxy about 'set weight' says that:
A typical usage of this command is to disable a server during an update
by setting its weight to zero.

I am wondering that whether the flag SRV_RUNNING of server should be
cleared or not when its weight is set to 0.

--
Best Regards,
Godbach




--
Best Regards,
Godbach

Reply via email to