apache+mod_perl+couchbase=偶尔出现连接问题



我们使用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可以解决问题。

是什么导致了这样的问题?代码/服务器配置/沙发床服务器本身有问题吗?

可能是因为同时有很多重新连接导致的吗?一些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);

因为您使用的是服务器2.2.0,而且当您同时连接多个客户端时,这种情况似乎会发生,所以我的理论是您收到了来自服务器的最后一个错误。当前客户端引导进程尝试使用memcached上的引导(仅服务器的>=2.5.0版本支持),但失败了,它尝试使用"简洁"引导(同样,仅服务器的<=2.5.0支持),最后使用"经典"HTTP(所有版本都可用)。

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

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

这两个选项不一定能修复您的问题,但它们至少会缩短一些初始连接时间,并可能显示错误的更清楚原因(您也可以在环境中设置LCB_LOGLEVEL=5以获得实际日志记录)。

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

couchbase://192.168.0.1,192.168.0.2/my_bucket_name?detailed_errcodes=1&bootstrap_on=http&http_urlmode=2

最新更新