CouchBase 安装篇

Memcache基本上已经是开发的标配了,但是对于Memcache集群,很多线上部署仍然是很单薄的。几个常用的方式:

1,PHP内建支持Memcache::addServer,存取时将key进行Hash,在对应的服务器上进行操作。存在问题:1,不健壮;2,数据不安全;3,配置变更可能导致存取异常

2,引入代理:memcache-agent 或者 moxi ,可以设置数据后备,当一台服务器停止服务时不影响业务。存在问题:后备数据的一致性

鉴于存在以上问题,Memcache的开发团队开发了Membase,支持多台服务器集群,数据的切片和复制,有效的提高了服务稳定性和数据的安全性,并且支持数据的持久存储。代码的稳定性不够好,我曾经在部分线上业务上使用了Membase,后来因为几次莫名的存取操作缓慢,只能又撤销回到Memcache。

之后,Membase团队与CouchDB团队合并,推出二合一的产品: Couchbase。Couchbase的最大特点: 1,完全继承Memcache,原生支持所有Memcache操作;2,继承了Membase的特性,支持集群和数据持久化;3,继承了CouchDB的文档性质,支持通过View对数据进行操作。这个View的特性,提供了以往memcache所不具备的便利性,但是同Mongodb相比又很简单原始,感觉不是一种普遍需求的功能。

首先,从安装讲起:

安装服务器:

下载对应版本的安装包 wget http://packages.couchbase.com/releases/2.0.1/couchbase-server-enterprise_x86_64_2.0.1.rpm

安装: rpm -Uvh couchbase-server-enterprise_x86_64_2.0.1.rpm

有可能提示: libcrypto.so.6 找不到,需要安装openssl0.9.8e版本。特别注意,必须是098e。如果安装最新版本的Openssl,仍然会提示报错。

wget ftp://ftp.muug.mb.ca/mirror/centos/6.4/os/x86_64/Packages/openssl098e-0.9.8e-17.el6.centos.2.x86_64.rpm

rpm -Uvh openssl098e-0.9.8e-17.el6.centos.2.x86_64.rpm

然后再安装couchbase就OK了。请留意安装完成后的提示信息:

从membase开始,就提倡采用web方式进行管理,这里是提示服务已经启动,可以通过8091端口访问。

另外一段信息,是关于端口。11211是memcache访问端口,8091是管理和操作端口,其他几个是用于管理和集群通讯的。

打开8091进行初始化设置

初始化过程很人性化,第一步是选择物理存储位置,并且设定新创建还是加入到一个已有的集群中。

如果选择新创建,需要指定内存使用的数量。下一步中,还可以选择自动灌入一些测试数据,这样能直接体验一些view的效果。

再下一步,是创建缺省Bucket设置,这个很重要:

Bucket的意义,在于将数据进行分隔,比如:任何view就是基于一个bucket的,仅对bucket内的数据进行处理。一个server上可以有多个Bucket,每个Bucket的存储类型、内容占用、数据复制数量等,都需要分别指定。从这个意义上看,每个Bucket都相当于一个独立的实例。在集群状态下,我们需要对server进行集群设置,Bucket只侧重数据的保管。

创建Bucket,需要指明驱动类型: Memcached顾名思义,纯内存,无复制集等功能;Couchbase型是带有持久存储,可以有复制集。

关于复制集,可以设置:禁止复制集、复制集数量(如果设为2,数据将在两个节点上保存,任何一个节点损坏数据仍然存在),是否对索引也进行复制。Flush,是指是否支持清空全部数据的操作。

建议是使用Couchbase类型,设定好内存使用量,其他按默认。关于内存设定,尽量不要将Server上的内存全部分配出去,留一些空闲,对新建Bucket进行测试就很方便。当然,Bucket占用的内存数,在建立后也是可以动态调整的。

后面按照提示进行,设置完管理员密码,服务就可以使用了。在首页的管理界面,可以看到运行的概况:

在ServerNodes帧中,可以查看服务器集群情况;在View中,可以管理各个Bucket中的View,在DataBuckets中,对Buckets进行管理。比如调整内存占用:

只有一个服务器节点,replica是没有意义的,我们来搭建第二个服务器节点。安装过程类似,这里选择加入集群,填写IP和密码:

 

点击下一步,经过验证就可以加入集群了。集群中任何一台服务器,地位是对等的,用浏览器连接上去都可以进行管理。

可以看到,新加入的服务器处于 Pending 状态,意味着数据尚未进行同步。只有数据进行同步之后,这个节点才能提供服务。点击Rebalance按钮,进行数据同步。还有进度条显示,真的很体贴。

服务器的安装到这里就OK了。下一篇中讲介绍PHP扩展的安装和部分程序示例。

在上一篇中,介绍了Couchbase的安装和配置,接下来介绍一些如何使用。

启动和停止服务: 

/etc/rc.d/init.d/couchbase start / stop 

如果安装时设置的有问题,需要重新安装,只需要将服务停止,删除/opt/couchbase/var/lib/couchbase目录下的数据(请保留log目录),再启动服务,通过浏览器连接上去就可以看到熟悉的欢迎界面,全部重新配置即可。

如果PHP安装了memcache扩展,则可以不经任何修改操作Couchbase:

include('../init.php');
var_dump($_SERVER['CACHE_DEFAULT_HOST']);
$m = Cache::getInstance('default');
var_dump($m->set('m2c','memcache to couchdb'));

这是原有项目中检测memcache的PHP代码,用couchbase替换掉memcache之后,不用进行任何修改即可使用,端口仍然是11211,set/get等方法完全兼容。这一点很重要,对于已经存在的项目,可以不用修改任何代码和配置文件,这是非常有意义的。

用memcache扩展,只能使用memcache等效功能,对于view等couchbase提供的新功能是无法使用的。要使用新功能,就要安装couchbase扩展才行。

wget http://packages.couchbase.com/clients/php/php-ext-couchbase-1.1.2-centos55-x86_64.tar.gz
tar -xzvf php-ext-couchbase-1.1.2-centos55-x86_64.tar.gz 
cd php-ext-couchbase
cp couchbase.so /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

然后编辑php.ini,重启apache,查看php -i —— 奇怪,没有找到couchbase的信息,说明扩展没有成功加载。
将php.ini中的display_startup_errors 设置为ON,再次运行 php -i ,可以看到提示: libcouchbase没有找到。原来需要安装couch_client:

git clone git://github.com/couchbase/libcouchbase.git
cd libcouchbase/
./configure
make
make install
find /usr/local/ -name libcouchbase.so.2
ldconfig /usr/local/lib
/usr/local/php/bin/php -i | more

可以看到,couchbase的扩展已经正确安装了。ldconfig是重新扫描指定目录的动态库文件,确保系统能够在需要时正确加载这些文件。

下面写一个简单的测试:

$cb = new Couchbase("127.0.0.1:8091", "", "", "default");
$cb->set("default_jimmy_a", 101);
var_dump($cb->get("default_m2c"));

注意: default_m2c 项是在上面代码中,使用memcache接口写入的(封装中自动加入了default_的前缀),使用cachebase的接口正确的读取了出来。再做一个反向的测试,使用couchbase的函数读取memcache函数写入的项,也是可行的。在Data Buckets中,可以从document视图中看到已经存储到couchbase中的数据。这对于调试期来讲是很方便的。

下面,我们来看couchbase带来的新功能: 1,observe , 2,view

Observe提供了对数据操作的监控,提高数据的安全性。比如:

$object->set($key, $value [, $expiry ] [, $casunique ] [, $persistto ] [, $replicateto ])

persistto 和 replicateto 参数,可以设定需要物理保存的数量和复制集数量,比如完成指定数量后函数才返回,保证数据安全。

$object->observe($key, $casunique, $observedetails)

可以进行数据的可靠性测试
view
view的原理是对“某个bucket已经存储到硬盘上的所有数据进行map/reduce操作,并可将结果持久保存"。view的管理界面:

可以看到,首先View是属于某个Bucket,一个View有一个document,下面可以有多个view。view分Development Views和Production Views。前者可以修改,通过Publish按钮转换成生产模式。

我们来看一个例子:
Map

function (doc, meta) {
  if(doc.type=='test'){
    emit(meta.id, doc.count);
  }
}

Reduce

function (key, value, rereduce){
  var result = {odd_cnt:0, even_cnt:0};
  for(i=0;i<value.length;i++){
      if(rereduce){
        result.odd_cnt = result.odd_cnt + value[i].odd_cnt;
        result.even_cnt = result.even_cnt + value[i].even_cnt;
      }else{
        if( value[i]%2 == 1 )result.odd_cnt = result.odd_cnt + value[i];
        else result.even_cnt = result.even_cnt + value[i];
      }     
  }
  return result;
}

PHP生成数据和调用view:

$cb = new Couchbase("127.0.0.1:8091", "", "", "default");
 
for($i = 1; $i < 5; $i++){
    $t = array('type'=>'test', 'name'=>'test'.$i, 'content'=>date('H:i:s') . '_' . $i, 'count'=>$i);
    $cb->set('test'.$i, json_encode($t));
}
 
$t = $cb -> view('test','test2',array('stale'=>false,'reduce'=>false));
var_dump($t);

首先,我们写入一些文档型的数据 t1~t4。注意PHP代码中json_encode函数。在管理界面 Data Buckets=>Documents里面可以查看到数据:

执行view时,首先map函数执行,将满足条件”doc.type=='test'"的内容emit出来,结果如下所示:

然后,reduce函数执行,根据奇偶分别进行求和,得出结果:

在PHP的view函数中,第一个参数是文档,第二个是view,第三个是参数。其中,最重要的两个参数:
1,stale : false时,每次都新生成数据;ok,使用上次生成的缓存;update_after,使用缓存数据立刻返回,之后刷新数据
2,reduce: 是否执行reduce函数。如果不执行,则返回所有map后的数据。

既往使用memcache的时候,对其中的数据进行批量处理会是非常困难的事情,couchbase的view功能,使其从单一缓存工具转变为文档型数据库。但是,这个功能也有些蛋疼,要map全部数据,性能上很成问题。可以通过设置更多的bucket,尽量让一类数据放在一个bucket上,可以改善一些。但总体来看瑕不掩瑜,View功能让通过缓冲进行数据统计分析成为可能,这是一个很可喜的事情。

最后,说一下运维中还可能遇到的问题:
1,如何在同一Server下建立多个Bucket?
与membase时类似,默认的bucket是11211端口,可以建立多个Bucket复用这个端口,但是需要客户端连接是通过SLD验证来确定到底连接哪一个Bucket。另一个更实用的办法,是将更多的Bucket分别建立在不同的端口上。这与以往在一台服务器上运行多个memcache实例是相似的。
2,出现某台服务器宕机的情况,数据存取出现异常,怎么回事?
当某个node失效时,在管理界面中可以看到该节点处于down状态。注意,这时PHP连接时,仍然会试图将对此node进行操作,从而返回false。这与我们理解上的集群应该自动保持有效的想法是有差异的。需要手工点击“Fail Over”将此node从服务中屏蔽,之后php才不会对此node进行操作。当节点重新启动后,需要将其恢复回来。根据提示点击“Add Back”,然后视情况决定是否执行Rebalance。

尤其是在只有两个节点时,意味着一个节点失效,如果不及时进行干预,就会有超过一半的请求失败(默认失效节点为主的写和轮询的读),结果会很惨。这看似很傻,其实是为了保证数据有效性。根据官方解释:
A,node少于3个时,必须手工干预;
B,node大于等于3个时,可以通过REST接口设置为“Auto Failover”
C,可以进一步设定,当节点数大于某个数值时,进行自动failover
这样的设定使得大集群可以有效的工作,不会因为运维经验不足导致数据永久损失。这种考虑还是很值得认可的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值