最近项目中使用的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也是正常的。