我们使用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);
答案 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