Re: nginx и несколько memcached серверов
mente
nginx-forum на nginx.us
Вт Мар 23 21:24:45 MSK 2010
Здравствуйте,
nginx по умолчанию использует остаток от деления?
Или все тот же memcached_hash, но с дефолтными опциями?
Пробовал без ketama_points в memcached_hash и OPT_LIBKETAMA_COMPATIBLE ставил на false, результат был 40% не найдено.
Не сильно изменилось :-/.
Есть подозрение, что memcached_hash вообще не работает, т.к. если убрать эту опцию, то процент промахов тот же.
Патчи нгинкса от memcached_hash пришлось встраивать самому в nginx 0.7.65. Собственно diff
--- nginx_orig/nginx-0.7.65/src/http/modules/ngx_http_memcached_module.c 2009-10-27 01:09:27.000000000 +0800
+++ nginx-0.7.65/src/http/modules/ngx_http_memcached_module.c 2010-03-22 22:22:52.000000000 +0800
@@ -12,6 +12,7 @@
typedef struct {
ngx_http_upstream_conf_t upstream;
ngx_int_t index;
+ ngx_int_t ns_index;
} ngx_http_memcached_loc_conf_t;
@@ -148,6 +149,7 @@
static ngx_str_t ngx_http_memcached_key = ngx_string("memcached_key");
+static ngx_str_t ngx_http_memcached_ns = ngx_string("memcached_namespace");
#define NGX_HTTP_MEMCACHED_END (sizeof(ngx_http_memcached_end) - 1)
@@ -221,11 +223,11 @@
ngx_http_memcached_create_request(ngx_http_request_t *r)
{
size_t len;
- uintptr_t escape;
+ uintptr_t escape, ns_escape = 0;
ngx_buf_t *b;
ngx_chain_t *cl;
ngx_http_memcached_ctx_t *ctx;
- ngx_http_variable_value_t *vv;
+ ngx_http_variable_value_t *vv, *ns_vv;
ngx_http_memcached_loc_conf_t *mlcf;
mlcf = ngx_http_get_module_loc_conf(r, ngx_http_memcached_module);
@@ -240,7 +242,15 @@
escape = 2 * ngx_escape_uri(NULL, vv->data, vv->len, NGX_ESCAPE_MEMCACHED);
- len = sizeof("get ") - 1 + vv->len + escape + sizeof(CRLF) - 1;
+ ns_vv = ngx_http_get_indexed_variable(r, mlcf->ns_index);
+
+ if (ns_vv != NULL && !ns_vv->not_found && ns_vv->len != 0) {
+ ns_escape = 2 * ngx_escape_uri(NULL, ns_vv->data,
+ ns_vv->len, NGX_ESCAPE_MEMCACHED);
+ }
+
+ len = sizeof("get ") - 1 + ns_vv->len + ns_escape
+ + vv->len + escape + sizeof(CRLF) - 1;
b = ngx_create_temp_buf(r->pool, len);
if (b == NULL) {
@@ -263,6 +273,16 @@
ctx->key.data = b->last;
+ if (ns_vv != NULL && !ns_vv->not_found && ns_vv->len != 0) {
+ if (ns_escape == 0) {
+ b->last = ngx_copy(b->last, ns_vv->data, ns_vv->len);
+ } else {
+ b->last = (u_char *) ngx_escape_uri(b->last, ns_vv->data,
+ ns_vv->len,
+ NGX_ESCAPE_MEMCACHED);
+ }
+ }
+
if (escape == 0) {
b->last = ngx_copy(b->last, vv->data, vv->len);
@@ -517,6 +537,9 @@
* conf->upstream.temp_path = NULL;
* conf->upstream.uri = { 0, NULL };
* conf->upstream.location = NULL;
+ *
+ * conf->index = 0;
+ * conf->ns_index = 0;
*/
conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;
@@ -626,6 +649,12 @@
return NGX_CONF_ERROR;
}
+ mlcf->ns_index = ngx_http_get_variable_index(cf, &ngx_http_memcached_ns);
+
+ if (mlcf->ns_index == NGX_ERROR) {
+ return NGX_CONF_ERROR;
+ }
--- nginx_orig/nginx-0.7.65/src/http/ngx_http_variables.c 2010-02-01 23:20:43.000000000 +0800
+++ nginx-0.7.65/src/http/ngx_http_variables.c 2010-03-22 21:06:26.000000000 +0800
+static ngx_int_t
+ngx_http_optional_variable(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data)
+{
+ *v = ngx_http_variable_null_value;
+ return NGX_OK;
+}
+
+
ngx_int_t
ngx_http_variables_init_vars(ngx_conf_t *cf)
{
@@ -1785,6 +1794,12 @@
continue;
}
+ if (ngx_strncmp(v.name.data, "memcached_namespace", 19) == 0) {
+ v.get_handler = ngx_http_optional_variable;
+
+ continue;
+ }
+
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
"unknown \"%V\" variable", &v.name);
Спасибо
Posted at Nginx Forum: http://forum.nginx.org/read.php?21,16628,67056#msg-67056
Подробная информация о списке рассылки nginx-ru