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