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