apache + mod_perl + couchbase =偶尔的连接问题

时间:2015-12-23 08:57:08

标签: apache connection couchbase mod-perl

我们使用couchbase作为mod_perl脚本的会话存储。为了避免因等待新连接而导致客户端延迟,我们在child_init apache阶段预先连接到couchbase。因此,在apache重新启动/新建子项时,它会自动连接到couchbase,然后在apche子生存期间使用该连接。

通常一切正常,但有时我们在预连接期间遇到以下错误:

Couldn't connect: 0x13 (Operation not supported) at /perl/lib64/perl5/Couchbase/Bucket.pm line 38.

通常它会在apache重启期间和几个(或几十个)孩子身上出现,而且几乎从不在一个孩子身上。通常重新启动apache可以解决问题。

什么会导致这样的问题?这是代码/服务器配置/ couchbase服务器本身的问题吗?

可能是因为同时有很多重新连接造成的?一些ulimits东西/或selinux限制?

UPD:版本

OS:
 Centos 6, 2.6.32-358.2.1.el6.x86_64

libcouchbase:
 libcouchbase-devel.x86_64  2.4.7-1.el6
 libcouchbase2-core.x86_64 2.4.7-1.el6
 libcouchbase2-libevent.x86_64 2.4.7-1.el6

couchbase server:
 2.2.0 community edition (build-837)

SDK:
 perl  (Couchbase::Core v2.0.2)

连接代码(隔离和简化):

# in mod_perl environment
use Couchbase;
use Couchbase::Bucket;
use Couchbase::Document;
use Apache2::ServerUtil ();

my $cb = undef; 
# connection handler, initialized once, used during apache child lifetime

sub connect_couchbase_on_child_init {
    my ($child_pool, $s) = @_; 
    my $dsn = 'couchbase://192.168.0.1,192.168.0.2/my_bucket_name?detailed_errcodes=1';
    eval { $cb = Couchbase::Bucket->new($dsn); };
    # here we get the occasional warnings during apache restarts
    if ($@) { warn "COUCHBASE CONNECTION ERROR! $@"; $cb = undef; } 
    return Apache2::Const::OK;
}

Apache2::ServerUtil->server->push_handlers(PerlChildInitHandler => \&connect_couchbase_on_child_init);

# in request handlers it used with the following calls (only if connected):
# $doc = Couchbase::Document->new($key);
# $cb->get($doc);
# ...   
# $cb->replace($doc);
# ... 
# $cb->insert($doc);
# ...
# $cb->remove($doc);

1 个答案:

答案 0 :(得分:2)

因为您正在使用服务器2.2.0,并且因为这似乎是在您同时连接多个客户端时发生的,所以我的理论是您从服务器收到最后一个错误。当前客户端引导过程尝试使用bootstrap over memcached(仅支持版本> = 2.5.0的服务器),失败并尝试使用'terse'bootstrapping(再次,仅支持> = 2.5)。服务器的0)和最后的'经典'HTTP(所有版本都可用)。

将以下选项添加到DSN /连接字符串,以删除服务器的某些步骤。请注意,如果您升级到> = 2.5,则应删除这些选项:

  • bootstrap_on=http不尝试memcached bootstrap
  • http_urlmode=2默认情况下使用2.5之前的引导样式

这两个选项不一定修复您的问题,但它们至少会删除一些初始连接时间,并且可能会显示更明确的错误原因(您也可以设置{{ 1}}在环境中获取实际的日志记录)。

在您的情况下,连接字符串将是:

LCB_LOGLEVEL=5