Couchbase第一印象(架构特性)
Couchbase第一印象(架构特性)
面向文档 保存的字节流总有一个 DOCUMENT ID(Object_ID)
高并发性,高灵活性,高拓展性,容错性好
面向文档的集群存储系统
每个文档用一个唯一的Doc ID
均衡负载
Buckets vs vBuckets
1. Buckets
couchbase的存储逻辑单元叫Bucket
每个bucket有个名字
couchbase 一个节点当前限制10及以下buckets
bucket 有两种类型 couchbase和memcached
bucket有可选的密码控权 SASL authentication
每个bucket有可控的内存配额和复制策略设定,独立可监控和管理
2. vBuckets
主要用来管理维护集群节点之间的bucket分布和路由
doc id的算法使分布式成为可能
Time To Live (TTL)
可用于控制过期时间(默认为一小时)
可用于seesion缓存等功能
后台管理过期,自动删除过期数据,释放内存和硬盘
数据一致性
并发性
Views, Indexs, Queries
Views
这里的views概念完全和SQL的view概念不同
views作为数据翻译转换层,将数据转换为特定格式结构的数据形式如JSON
views 通过 map/reduce功能完成, map将文档结构转换为表输出结构, reduce用来做计数,统计等聚集功能
indexes
每当views建立时, 就会建立indexes, index的更新和以往的数据库索引更新区别很大。 比如现在有1W数据,更新了200条,索引只需要更新200条,而不需要更新所有数据,map/reduce功能基于index的懒更新行为,大大得益。
建立views和index后可以用来Queries
用户用例
替代memcached的缓存层, 提供兼容memcached协议接口
Amazon S3类似服务
session
安装、管理 与客户端接口
三思而后行(安装初始化)
数据存储的路径
Couchbase数据需要持久化到硬盘,需要分配硬盘空间和路径,在Linux与Windows默认是couchbase安装路径
Server Quota(服务缓存层的内存分配)
Couchbase的数据会被缓存,服务层的缓存内存配额配置被各个节点所共享。 如是:现在有一个节点(Node)分配的是2G RAM,那么在加三个节点后,就增加6G RAM来还缓存数据了 ,故一共有8G RAM被分配用来缓存了。
Bucket Quota
集群可以用多个bucket,bucket用来保存一组特别数据或应用,如一个bucket用来做session,另一个bucket用来做做副本。bucket RAM quota的策略,对server quota设定是相辅相成的莲藕关系,很大程度影响cache的内存配额。
安装与管理
Memory Size
Replicas
默认bucket副本是3个。 index replica 开启选项 默认的选项,couchbase的策略比较灵活。只有当数据和节点足够多时,才会开始备份。
Flush
禁用或开启(默认禁用),用于清空bucket的数据
Auto-compaction
持久化的数据和view,index,长期会产生碎片,开启功能时,会自动整理硬盘数据碎片
客户端接口
-
> pip install couchbase
PHP
$servers = array("192.168.0.72:8091","127.0.0.1:8091");
foreach($servers as $server) {
$cb = new Couchbase($server, "", "", "default");
if ($cb) {
echo "Connected to $server";
break;
}
}
C
JAVA
基于面向文档的设计开发
Model
JSON
Number (either integer or floating-point).
Boolean
{'value' : true}
String
"hello world"
Array
[1, 4, 5]
Object
{ 'title' : 'google',
'url' : 'https://www.google.com/'
}
实体之间的关联
内嵌
{ 'author' : 'Matin',
'books' : [ {'title' : 'Refactor' , 'IBSN' : '485-566'},...]
}
外部文档,引用其docment id
{ 'author' : 'Matin',
'books' : [ 'AD3D63D6-2FE0-11E2-93F9-898688C79046_book',...]
}
事务
存储操作伊始
CURD
- add(id, document [, expiry]) Add an item if ID doesn’t already exist
- set(id, document [, expiry]) Store a document with ID
- replace(id, document [, expiry]) Update the document for an existing ID
- cas(id, document, check [, expiry]) Update the document for an existing ID providing the check matches
- get(id) :Get the specified document
- incr(id [, offset])Increment the document value by offset
- decr(id [, offset] Decrement the document value by offset
- append(id, value) Append the content to the end of the current document
- prepend(id, value) Prepend the content to the beginning of the current document
- delete(id) Delete the specified document
Document Indentifer
与Mongodb相比,Couchbase的存储方式为Key/Value,Value的类型很为单一, 不支持数组。另外也不会自动创建doc id, couchbase需要为每一docment指定一个用于存储的Document Indentifer。
为document创建标示符:
使用唯一的字段做标示符
如在session中,可以使用用户的email, username作为唯一标示符
对象与自增策略
单独创建一自增数据(Document Indentifer),如 add('user',0) 每次创建一个用户时,可以自增'user', 然后得到 'user:1233'等
使用uuid
标示符的命名规范与最佳实践
使用couchbase的bucket策略 自定义方式 (加前缀)
实践列举:
1. 网站访问量(PAGE VIW)
若我们需要用couchbase统计网站PV
那么命名如 'pv:index', 'pv:blog', 'pv:about'。
2. 用户朋友圈
为用户建立一个朋友圈
apend('user#1233','user#444,user#666,')
Time To Live (TTL)
常用来做cache,session,购物车使用,验证码等。ttl通过传入一个数字表示, couchbase会对数字作如下的判断:
小于30天(606024*30)的一秒为单位的数字,如600表示10分钟过期。
大于三十天的数字(秒),采用从公元开始的计数,如1381921696表示16th October 2013。
为0的表示永不过期。
保存数据
set和add都是原子性操作,是多线程环境安全的操作。
set(docid, docdata [, expiry])
set不存在docid数据时会创建,存在时替换存在的docid的内容。 过期设定expiry是可选的。
$cb->set('message', 'Hello World!');
$cb->set('message', 'Hello World!', 10); /*设定过期时限*/
if ($cb->set("spoon", "Hello World!", 10)) {
/*操作结果决断*/
echo "Message stored!";
}
add(docid, docdata [, expiry])
与set不同的是,如果docid内容存在时会,会更新失败。
$cb->add('message', 'Hello World!');
/*下面语句会失败*/
$cb->add('message', 'I pushed the button, but nothing happened!');
获取数据 get(docid)
单文档返回
在php中如果docid不存在会返回undef:
$message = $cb->get('message')
多文档返回 (Retrieving in Bulk)
不同库的多文档返回实现不同,多文档返回比单独返回要快,因为请求和响应有延迟。 php的会返回一个关联数组:
$ret = $cb->getMulti(array('recipe1','recipe2'));
更新数据 replace(id, document [, expiry])
在set,add后可以使用replace更新数据:
$message = $cb->get('message');
$message = $message . " How are you today?";
$cb->replace('message',$message);
并发更新 cas(id, document, check [, expiry])
在并发环境中,有必要保证并发更新
情景一:
1.A 获取了文档'樱花盛开'
2.B 也获取了文档'樱花盛开'
3.A 向文档加入信息并更新。
4.之后,B 也向文档修改并更新'樱花盛开'
这样A的努力完全被B给覆盖了
为了防止以上情况,需要使用cas功能做版本检查
情景 cas版:
1.音 获取了文档'樱花盛开'并加入自己的cas id
2.暧 也获取了文档'樱花盛开', 并加入自己的cas id
3.音 向文档做修改,并使用自己的cas id检查后成功更新。
4.之后,暧 也向文档修改并更新'樱花盛开'。使用自己的cas id检查后更新失败,因为 音已经更新了,使cas id不一样。
cas如是:检查要更新的文档是不是“原来的版本”(使用get换取的原本)。
$value = client->get("customer", NULL, $casvalue);
$response = client->cas($casvalue, "customer", "new string value");
cas的缺点是数据更新比起set要慢很多,做大量更新事务并发版本控制并非很完美。另外如果有用户使用set或replace操作不带cas,会使cas失效。
强制锁
cas虽有锁的一些性质,但不能防止期间有不带cas设置的set,replace打乱cas版本。故需要强锁 使用强制锁时,其他用户可以获取数据,但如果没有相应的cas是不能更新文档。
$article = $ai->getAndLock('樱花盛开', &$cas);
$article = '樱花飘落的速度是每秒五厘米哦';
# This will fail, because we are not supplying the CAS value
$ai->set('樱花盛开', $article);
# This will succeed and then unlock document
$ai->set('樱花盛开', $article, 0, $cas);
锁也可以设定过期时间,另外也可以释放锁:
$ai->unlock('recipe1',$cas);
艺术与文学同在(异步)
不同的客户端接口实现不同:
/*使用异步*/
$format_recipe = function($key, $value) {
return ('<li>' . $value['title'] . '</li>');
};
$ret = $cb->getDelayed(array('recipe1','recipe2'),0,$format_recipe);
/*单独迭代获取*/
$ret = $cb->getDelayed(array('recipe1','recipe2'),0,$format_recipe);
while ($ret = $cb->fetch()) {
echo('<li>' . $ret[value]['title'] . '</li>');
}
服务端更新 (Server-side Updates)
Increment And Decrement
用于页面访问量更新,数据统计等功能:
/*To increment by 1*/
$cb->set('counter',10);
$cb->increment('counter');
/*To increment by 10:*/
$cb->set('counter',10);
$cb->increment('counter', 10);
Append And Perpend
向文档首尾追加内容:
$user->set('userlist','martin,');
$user->append('userlist', 'stuart,');
$user->append('userlist', 'sharon,');
删除数据
当数据存在时,可以使用delete删除:
$cb->delete('message');
Couchbase第一印象(架构特性)的更多相关文章
- QQ群web前端分析二——第一印象
对QQ群WEB进行前端分析 入口是 http://qun.qzone.qq.com/ 以下为第一印象,主要是从我的理解上找问题. ----------------------------------- ...
- UE4随笔 二 第一印象
打开UE4,短暂的兴奋过后,开始大概扫一扫UE4的编辑器,整个界面比UE3更有现代气息: 之前看其他人写的文章,虚幻4最重要的改动集中在下面几个方向上: 跨平台: WIN和MAC平台都能使用,这就意味 ...
- MySQL高级第一章——架构介绍
一.简介 是一个经典的RDBMS,目前归属于Oracle 高级MySQL包含的内容: MySQL内核 SQL优化工程师 MySQL服务器的优化 各种参数常量设定 查询语句优化 主从复制 软硬件升级 容 ...
- 第三十章 elk(1) - 第一种架构(最简架构)
软件版本: es:2.4.0 logstash:2.4.0 kibana:4.6.1 一.logstash安装(收集.过滤日志.构建索引) 1.下载:https://www.elastic.co/do ...
- Python第一印象,大法好!
为了用flask开发web应用,这两天就开始看了一点点Python.还没看到用Python写网站后台的那部分,就被其强大的数据处理能力和语法的灵活性吸引.肯定是我少见多怪,不过看到人家灵活使用Pyth ...
- 值得赞扬的尝试与进步——CSDN开源夏令营第一印象
注:写这篇文章时我并未參加CSDN开源夏令营,也不确定是否会參加以及是否能參加上. 欣闻CSDN举办了"CSDN开源夏令营"活动.第一感觉是CSDN作为活动的组织者是很值得称赞的. ...
- 【第三十章】 elk(1) - 第一种架构(最简架构)
软件版本: es:2.4.0 logstash:2.4.0 kibana:4.6.1 一.logstash安装(收集.过滤日志.构建索引) 1.下载:https://www.elastic.co/do ...
- Apache Kylin的架构特性
不多说,直接上干货! http://kylin.apache.org/cn/ 可扩展的超快OLAP引擎,提供标准SQL查询接口 支持单机或集群部署,为减少在Hadoop上百亿规模数据查询延迟而设计: ...
- 推荐 的FPGA设计经验(4) 时钟和寄存器控制架构特性使用
Use Clock and Register-Control Architectural Features FPGAs provide device-wide clocks and register ...
随机推荐
- CentOS 7.2安装pip
CentOS 7.2默认安装的python版本为python2.7.5,我的系统里面默认是没有安装pip 的,搜了下网上各路大侠的解决办法,如下: 使用yum安装python-pip,但是报错,说没有 ...
- Netty实现WebSocket
package com.qmtt.server; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; ...
- Properties没有被注意的地方
源起: 今天阅读源码时发现一个地方不理解: 为什么以下代码第10行 get() 之后value为null时还去 getProperty() 呢? org.springframework.util.Co ...
- JVM初探
### JVM分为类的加载生命周期和gc垃圾回收两个大的方面#####首先是类的生命周期, 类的加载: --> 记载字节码 ---> 这个过程有类的加载起参与,双亲委托机制() --> ...
- 【转】深入理解Android中的SharedPreferences
SharedPreferences作为Android中数据存储方式的一种,我们经常会用到,它适合用来保存那些少量的数据,特别是键值对数据,比如配置信息,登录信息等.不过要想做到正确使用SharedPr ...
- logging模块进阶2
1.两种级别设置: 全局级别:生成logger对象后设置的级别 局部级别:生成handler对象设置的级别 我们都知道输出的级别不能低于设定的级别,那么全局级别和局部级别哪一个对输出产生影响? 经过多 ...
- cordova应用使用手机调试
对于cordova应用的调试,最方便调试方式还是作为h5应用在浏览器来调试,调试好了再打包cordova应用和打包apk.然而h5应用时的效果跟最终在安卓手机运行还有少数情况会不一样,因此,也需要有能 ...
- 如何创建你的第一个手机APP?
本文使用helloworld来作为android的入门项目,通过这个最简单的项目来帮助大家了解android程序开发包含哪些部分,以及如何运行android程序,本次开发android程序的工具是ec ...
- 【Jenkins】Jenkins配置从节点,实现远程主机调用功能
一.需求 使用Jenkins进行持续集成部署过程中,需要用到远端主机的处理功能.如部署到远程主机.文件备份等功能 二.思路 1.当远端主机为Linux系统时使用Publish Over SSH Plu ...
- Linux安装技巧--安装Uuntu与windows8/10共存
1.准备安装双系统所需工具. 系统: Linux有众多的衍生版本,选择一个自己喜欢的版本下载,建议新手上ubuntu吧,中文教程较多,出了问题容易解决,等到熟悉了再用其他的也行,新手的话ubuntu也 ...