Linux版本Membase无法写入default bucket的问题分析
最近项目中使用的membase发现出了点问题,生产环境中读写各种数据都正常,可是新搭建的开发环境下,只有default bucket写不进去数据,调用store总是返回FALSE,配置文件也是一模一样,实在不知道哪里出问题了,其他的几个bucket都正常读写,而且,在开发环境的membase上在新建一个bucket也是正常读写的。最后发现生产上windows版本的membase,而开发环境是Linux(centos)版本,怀疑可能跟server版本有关系,于是新装了一个windows版本的,果然,一切正常。至于Linux版本的(couchbase)为什么出这个问题,还是得花时间找找原因的。
项目使用的dll:membase.dll 2.14.0.0,Enyim.Caching.dll 2.11.0.0,反编译是可以看到代码的,但是不好调试,可以在网上找到相应的源码:
第二个是把membase的源码包在了LightFramework.Caching项目中,我就是那这个代码来查原因的。
既然是store失败,那我们单步跟踪,看看default的bucket和其他bucket在store方法中有哪里不一样。
public bool Store(StoreMode mode, string key, object value)
{
ulong tmp = ;
return this.PerformStore(mode, key, value, , ref tmp);
}
可以看到实际调用的是PerformStore方法,跟进去后发现var node = this.pool.Locate(hashedKey);会返回null,也就是没有找到对应的bucket了,那还写什么数据啊。
查查为什么返回是null,我们发现在初始化membaseclient实例时,需要向注册的serverurl获取该bucket信息(是否合法,状态是否正常等),调用ResolveBucket方法,结果异常了。401错误,未授权!
我们使用其他bucket初始化时,发现该方法的client参数中credential是有值的(username、password),而default的bucket却都是null。应该就是这个原因导致的。手动将credential的username设为default,再次请求bucket验证信息,果然,正确返回了。
纳闷了,不是默认的default不能设置密码的么,怎么这里有需要验证呢?Google相关的问题,发现不少人都不知道怎么破,甚至说是membase的bug:
- http://grokbase.com/t/gg/enyim-memcached/11anh26mtr/membase-client-401-getting-config-from-pool-url
- https://issues.couchbase.com/browse/MB-2166
- http://qnalist.com/questions/5796245/membase-client-401-getting-config-from-pool-url
- http://grokbase.com/t/gg/enyim-memcached/11anh26mtr/membase-client-401-getting-config-from-pool-url
在查找问题的过程中,我发现如果bucket是default,membase.dll会将其bucketname和password都置空,意思是不需要身份验证,走的是特殊端口11210(其他bucket走的是11211验证),既然注释都这么讲了,那为毛在bucket验证信息的请求中还需要身份验证呢?
Default无法写入的问题就是由上面的原因导致的,对于windows版本的membase server是不存在的,我测试过,对于default bucket没有身份验证的限制。而对于Linux版本,通过源码跟踪过程中,将身份验证信息手动改好,也是可以正常读写的,可惜的是,无法在外部初始化membaseclient时将其credential配置正确。有另一个解决方案,就是使用MemcachedClient,因为membase是兼容memcached sdk的,所以可以按照下面的方式初始化操作实例:
var config = new MemcachedClientConfiguration();
config.AddServer("192.168.1.12",);
var client = new MemcachedClient(config);
client.Store(StoreMode.Set, DateTime.Now.ToString("HHmmss"), "testValue");
这种方式读写default bucket也是正常的。
Linux版本Membase无法写入default bucket的问题分析的更多相关文章
- 为Linux版本Oracle 11gR2配置HugePage
HugePage是Oracle在Linux版本下一种性能优化手段.对于共享内存区域(SGA)的数据库系统,Oracle通常都推荐在操作系统层面配置上HugePage,为Oracle实例准备更大的可用共 ...
- Gpload安装手册(Linux版本)
Gpload安装手册(Linux版本) 一.python 2.7版本 Linux系统默认是安装python2.7的,如果没有需要手动安装(python版本要求2.4.4以上): 通过命令:python ...
- linux版本信息以及x86与x86_64的区别
一 x86.x86_64.AMD64 x86是指intel的开发的一种32位指令集,从386开始时代开始的,一直沿用至今,是一种cisc指令集,所有intel早期的cpu,amd早期的cpu都支持这种 ...
- 不同linux版本下内核/系统/软件的安装及查询
(一)先介绍下使用apt-get 和使用yum 包管理工具的不同用法: 1.先看yum(redhat) yum的配置文件是/etc/yum.conf 更新:yum update 安装:yum inst ...
- *** + Polipo 配置全局代理(Linux 版本)
转,原文:http://blog.csdn.net/jon_me/article/details/53525059 我本来是想查这个问题: How to start server and local ...
- MYSQL—第二部分(Linux版本的安装和数据表的操作)
Linux版本的安装(过于简单了) 安装: ? 1 yum install mysql-server 服务端启动 ? 1 mysql.server start 客户端连接 ? 1 2 3 4 5 6 ...
- 使用VS+VisualGDB编译Linux版本RCF
RPC通信框架--RCF介绍中说了,RCF本身是支持跨平台的,其代码放到Linux平台,是可以通过gcc.make等工具,编译通过的. 官方提供的源码中,只有cmake编译脚本,并没有提供Makefi ...
- 查看linux版本
http://nameyjj.blog.51cto.com/788669/557424 1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version ...
- 最稳定 性能最好 的 Linux 版本?
Ubuntu太他妈不稳定了,简直是一坨屎 CentOS.Ubuntu.Debian三个linux比较异同http://blog.csdn.net/educast/article/details/383 ...
随机推荐
- JNative 传递参数bug
下载JNative网址:http://sourceforge.net/projects/jnative/files/jnative/ 下载JNative版本:JNative_1.4RC3_bin.zi ...
- Mysql distinct、group by
具体业务场景:根据某些字段组合去重得到所有字段结果. 遇到的error:sql_mode=only_full_group_by. 原因是mysql配置问题. distinct: distinct这个关 ...
- 使用nagios监控ssl证书过期时间
1.编写监控脚本. # vim check_ssl_expiry.sh #!/bin/bash STATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 Host=$1 ...
- SQLite 学习笔记(一)
(1)创建数据库 在命令行中切换到sqlite.exe所在的文件夹 在命令中键入sqlite3 test.db;即可创建了一个名为test.db的数据库 由于此时的数据库中没有任何表及 ...
- A1058. A+B in Hogwarts
If you are a fan of Harry Potter, you would know the world of magic has its own currency system -- a ...
- 【CH1602】最大异或和 trie+贪心
题目大意:给定 N 个数,求这 N 个数中任选两个数进行异或运算,求最大的异或和是多少. 一个 int 类型的整数,可以看作一个长度为32位的字符串,异或运算不像加法,最大值不一定是由两个较大值得到. ...
- Java: |(或运算) 与 多选判断
今天需要在程序中做一个多选判断,突然想起以前经常遇到的 x |= y | z; 这样的,我也明白这个是多选的用意,但为什么能达到我们希望的多选操作,我还真的没去研究过. 今天早上,百度了一下,搜索到了 ...
- babel与ES6环境的搭建
我们知道浏览器环境下直接运行ES6是存在一些兼容性问题的.那么把ES6变成ES5不就行了吗? 那如何将ES6转换成ES5呢?我们来搭建它的转换环境吧~ 第一步:初始化项目,建立写注意事项的README ...
- 编写前程贷投标loadrunner脚本及总结
1.完成前程贷的(登录,投标) 2.所有的返回信息都用关联函数(web_reg_save_param_ex)进行关联 3.对返回信息用(strcmp)函数进行if判断 4.总结(web_reg_sav ...
- Python 爬虫的工具列表 附Github代码下载链接
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...