Linux版本Membase没法写入default bucket的问题分析

  最近项目中使用的membase发现出了点问题,生产环境中读写各类数据都正常,但是新搭建的开发环境下,只有default bucket写不进去数据,调用store老是返回FALSE,配置文件也是如出一辙,实在不知道哪里出问题了,其余的几个bucket都正常读写,并且,在开发环境的membase上在新建一个bucket也是正常读写的。最后发现生产上windows版本的membase,而开发环境是Linux(centos)版本,怀疑可能跟server版本有关系,因而新装了一个windows版本的,果真,一切正常。至于Linux版本的(couchbase)为何出这个问题,仍是得花时间找找缘由的。node

  项目使用的dll:membase.dll 2.14.0.0,Enyim.Caching.dll 2.11.0.0,反编译是能够看到代码的,可是很差调试,能够在网上找到相应的源码:git

  第二个是把membase的源码包在了LightFramework.Caching项目中,我就是那这个代码来查缘由的。github

  既然是store失败,那咱们单步跟踪,看看default的bucket和其余bucket在store方法中有哪里不同。windows

public bool Store(StoreMode mode, string key, object value)
{
    ulong tmp = 0;
    return this.PerformStore(mode, key, value, 0, ref tmp);
}

  能够看到实际调用的是PerformStore方法,跟进去后发现var node = this.pool.Locate(hashedKey);会返回null,也就是没有找到对应的bucket了,那还写什么数据啊。centos

  查查为何返回是null,咱们发如今初始化membaseclient实例时,须要向注册的serverurl获取该bucket信息(是否合法,状态是否正常等),调用ResolveBucket方法,结果异常了。401错误,未受权!memcached

  咱们使用其余bucket初始化时,发现该方法的client参数中credential是有值的(username、password),而default的bucket却都是null。应该就是这个缘由致使的。手动将credential的username设为default,再次请求bucket验证信息,果真,正确返回了。测试

  纳闷了,不是默认的default不能设置密码的么,怎么这里有须要验证呢?Google相关的问题,发现很多人都不知道怎么破,甚至说是membase的bug:this

  在查找问题的过程当中,我发现若是bucket是default,membase.dll会将其bucketname和password都置空,意思是不须要身份验证,走的是特殊端口11210(其余bucket走的是11211验证),既然注释都这么讲了,那为毛在bucket验证信息的请求中还须要身份验证呢?url

  Default没法写入的问题就是由上面的缘由致使的,对于windows版本的membase server是不存在的,我测试过,对于default bucket没有身份验证的限制。而对于Linux版本,经过源码跟踪过程当中,将身份验证信息手动改好,也是能够正常读写的,惋惜的是,没法在外部初始化membaseclient时将其credential配置正确。有另外一个解决方案,就是使用MemcachedClient,由于membase是兼容memcached sdk的,因此能够按照下面的方式初始化操做实例:spa

var config = new MemcachedClientConfiguration();
config.AddServer("192.168.1.12",11211);
var client = new MemcachedClient(config);
client.Store(StoreMode.Set, DateTime.Now.ToString("HHmmss"), "testValue");

  这种方式读写default bucket也是正常的。

相关文章
相关标签/搜索