1 /* 2 * include/types/backend.h 3 * This file assembles definitions for backends 4 * 5 * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation, version 2.1 10 * exclusively. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22 #ifndef _TYPES_BACKEND_H 23 #define _TYPES_BACKEND_H 24 25 #include <common/config.h> 26 #include <common/hathreads.h> 27 28 #include <types/lb_chash.h> 29 #include <types/lb_fas.h> 30 #include <types/lb_fwlc.h> 31 #include <types/lb_fwrr.h> 32 #include <types/lb_map.h> 33 #include <types/server.h> 34 35 /* Parameters for lbprm.algo */ 36 37 /* Lower bits define the kind of load balancing method, which means the type of 38 * algorithm, and which criterion it is based on. For this reason, those bits 39 * also include information about dependencies, so that the config parser can 40 * detect incompatibilities. 41 */ 42 43 /* LB parameters are on the lower 8 bits. Depends on the LB kind. */ 44 45 /* BE_LB_HASH_* is used with BE_LB_KIND_HI */ 46 #define BE_LB_HASH_SRC 0x00000 /* hash source IP */ 47 #define BE_LB_HASH_URI 0x00001 /* hash HTTP URI */ 48 #define BE_LB_HASH_PRM 0x00002 /* hash HTTP URL parameter */ 49 #define BE_LB_HASH_HDR 0x00003 /* hash HTTP header value */ 50 #define BE_LB_HASH_RDP 0x00004 /* hash RDP cookie value */ 51 #define BE_LB_HASH_RND 0x00008 /* hash a random value */ 52 53 /* BE_LB_RR_* is used with BE_LB_KIND_RR */ 54 #define BE_LB_RR_DYN 0x00000 /* dynamic round robin (default) */ 55 #define BE_LB_RR_STATIC 0x00001 /* static round robin */ 56 #define BE_LB_RR_RANDOM 0x00002 /* random round robin */ 57 58 /* BE_LB_CB_* is used with BE_LB_KIND_CB */ 59 #define BE_LB_CB_LC 0x00000 /* least-connections */ 60 #define BE_LB_CB_FAS 0x00001 /* first available server (opposite of leastconn) */ 61 62 #define BE_LB_PARM 0x000FF /* mask to get/clear the LB param */ 63 64 /* Required input(s) */ 65 #define BE_LB_NEED_NONE 0x00000 /* no input needed */ 66 #define BE_LB_NEED_ADDR 0x00100 /* only source address needed */ 67 #define BE_LB_NEED_DATA 0x00200 /* some payload is needed */ 68 #define BE_LB_NEED_HTTP 0x00400 /* an HTTP request is needed */ 69 /* not used: 0x0800 */ 70 #define BE_LB_NEED 0x00F00 /* mask to get/clear dependencies */ 71 72 /* Algorithm */ 73 #define BE_LB_KIND_NONE 0x00000 /* algorithm not set */ 74 #define BE_LB_KIND_RR 0x01000 /* round-robin */ 75 #define BE_LB_KIND_CB 0x02000 /* connection-based */ 76 #define BE_LB_KIND_HI 0x03000 /* hash of input (see hash inputs above) */ 77 #define BE_LB_KIND 0x07000 /* mask to get/clear LB algorithm */ 78 79 /* All known variants of load balancing algorithms. These can be cleared using 80 * the BE_LB_ALGO mask. For a check, using BE_LB_KIND is preferred. 81 */ 82 #define BE_LB_ALGO_NONE (BE_LB_KIND_NONE | BE_LB_NEED_NONE) /* not defined */ 83 #define BE_LB_ALGO_RR (BE_LB_KIND_RR | BE_LB_NEED_NONE) /* round robin */ 84 #define BE_LB_ALGO_RND (BE_LB_KIND_RR | BE_LB_NEED_NONE | BE_LB_RR_RANDOM) /* random value */ 85 #define BE_LB_ALGO_LC (BE_LB_KIND_CB | BE_LB_NEED_NONE | BE_LB_CB_LC) /* least connections */ 86 #define BE_LB_ALGO_FAS (BE_LB_KIND_CB | BE_LB_NEED_NONE | BE_LB_CB_FAS) /* first available server */ 87 #define BE_LB_ALGO_SRR (BE_LB_KIND_RR | BE_LB_NEED_NONE | BE_LB_RR_STATIC) /* static round robin */ 88 #define BE_LB_ALGO_SH (BE_LB_KIND_HI | BE_LB_NEED_ADDR | BE_LB_HASH_SRC) /* hash: source IP */ 89 #define BE_LB_ALGO_UH (BE_LB_KIND_HI | BE_LB_NEED_HTTP | BE_LB_HASH_URI) /* hash: HTTP URI */ 90 #define BE_LB_ALGO_PH (BE_LB_KIND_HI | BE_LB_NEED_HTTP | BE_LB_HASH_PRM) /* hash: HTTP URL parameter */ 91 #define BE_LB_ALGO_HH (BE_LB_KIND_HI | BE_LB_NEED_HTTP | BE_LB_HASH_HDR) /* hash: HTTP header value */ 92 #define BE_LB_ALGO_RCH (BE_LB_KIND_HI | BE_LB_NEED_DATA | BE_LB_HASH_RDP) /* hash: RDP cookie value */ 93 #define BE_LB_ALGO (BE_LB_KIND | BE_LB_NEED | BE_LB_PARM ) /* mask to clear algo */ 94 95 /* Higher bits define how a given criterion is mapped to a server. In fact it 96 * designates the LB function by itself. The dynamic algorithms will also have 97 * the DYN bit set. These flags are automatically set at the end of the parsing. 98 */ 99 #define BE_LB_LKUP_NONE 0x00000 /* not defined */ 100 #define BE_LB_LKUP_MAP 0x10000 /* static map based lookup */ 101 #define BE_LB_LKUP_RRTREE 0x20000 /* FWRR tree lookup */ 102 #define BE_LB_LKUP_LCTREE 0x30000 /* FWLC tree lookup */ 103 #define BE_LB_LKUP_CHTREE 0x40000 /* consistent hash */ 104 #define BE_LB_LKUP_FSTREE 0x50000 /* FAS tree lookup */ 105 #define BE_LB_LKUP 0x70000 /* mask to get just the LKUP value */ 106 107 /* additional properties */ 108 #define BE_LB_PROP_DYN 0x80000 /* bit to indicate a dynamic algorithm */ 109 110 /* hash types */ 111 #define BE_LB_HASH_MAP 0x000000 /* map-based hash (default) */ 112 #define BE_LB_HASH_CONS 0x100000 /* consistent hashbit to indicate a dynamic algorithm */ 113 #define BE_LB_HASH_TYPE 0x100000 /* get/clear hash types */ 114 115 /* additional modifier on top of the hash function (only avalanche right now) */ 116 #define BE_LB_HMOD_AVAL 0x200000 /* avalanche modifier */ 117 #define BE_LB_HASH_MOD 0x200000 /* get/clear hash modifier */ 118 119 /* BE_LB_HFCN_* is the hash function, to be used with BE_LB_HASH_FUNC */ 120 #define BE_LB_HFCN_SDBM 0x000000 /* sdbm hash */ 121 #define BE_LB_HFCN_DJB2 0x400000 /* djb2 hash */ 122 #define BE_LB_HFCN_WT6 0x800000 /* wt6 hash */ 123 #define BE_LB_HFCN_CRC32 0xC00000 /* crc32 hash */ 124 #define BE_LB_HASH_FUNC 0xC00000 /* get/clear hash function */ 125 126 127 /* various constants */ 128 129 /* The scale factor between user weight and effective weight allows smooth 130 * weight modulation even with small weights (eg: 1). It should not be too high 131 * though because it limits the number of servers in FWRR mode in order to 132 * prevent any integer overflow. The max number of servers per backend is 133 * limited to about (2^32-1)/256^2/scale ~= 65535.9999/scale. A scale of 16 134 * looks like a good value, as it allows 4095 servers per backend while leaving 135 * modulation steps of about 6% for servers with the lowest weight (1). 136 */ 137 #define BE_WEIGHT_SCALE 16 138 139 /* LB parameters for all algorithms */ 140 struct lbprm { 141 union { /* LB parameters depending on the algo type */ 142 struct lb_map map; 143 struct lb_fwrr fwrr; 144 struct lb_fwlc fwlc; 145 struct lb_chash chash; 146 struct lb_fas fas; 147 }; 148 int algo; /* load balancing algorithm and variants: BE_LB_* */ 149 int tot_wact, tot_wbck; /* total effective weights of active and backup servers */ 150 int tot_weight; /* total effective weight of servers participating to LB */ 151 int tot_used; /* total number of servers used for LB */ 152 int wmult; /* ratio between user weight and effective weight */ 153 int wdiv; /* ratio between effective weight and user weight */ 154 int hash_balance_factor; /* load balancing factor * 100, 0 if disabled */ 155 char *arg_str; /* name of the URL parameter/header/cookie used for hashing */ 156 int arg_len; /* strlen(arg_str), computed only once */ 157 int arg_opt1; /* extra option 1 for the LB algo (algo-specific) */ 158 int arg_opt2; /* extra option 2 for the LB algo (algo-specific) */ 159 int arg_opt3; /* extra option 3 for the LB algo (algo-specific) */ 160 struct server *fbck; /* first backup server when !PR_O_USE_ALL_BK, or NULL */ 161 __decl_hathreads(HA_SPINLOCK_T lock); 162 163 /* Call backs for some actions. Any of them may be NULL (thus should be ignored). */ 164 void (*update_server_eweight)(struct server *); /* to be called after eweight change */ 165 void (*set_server_status_up)(struct server *); /* to be called after status changes to UP */ 166 void (*set_server_status_down)(struct server *); /* to be called after status changes to DOWN */ 167 void (*server_take_conn)(struct server *); /* to be called when connection is assigned */ 168 void (*server_drop_conn)(struct server *); /* to be called when connection is dropped */ 169 }; 170 171 #endif /* _TYPES_BACKEND_H */ 172 173 /* 174 * Local variables: 175 * c-indent-level: 8 176 * c-basic-offset: 8 177 * End: 178 */ 179