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也是正常的。

相關文章
相關標籤/搜索