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的内存配额。

安装与管理

  1. Memory Size
  2. Replicas

    默认bucket副本是3个。 index replica 开启选项 默认的选项,couchbase的策略比较灵活。只有当数据和节点足够多时,才会开始备份。

  3. Flush

    禁用或开启(默认禁用),用于清空bucket的数据

  4. Auto-compaction

    持久化的数据和view,index,长期会产生碎片,开启功能时,会自动整理硬盘数据碎片

客户端接口

  • Python

    > 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/‘
    }
    

实体之间的关联

  1. 内嵌

    { ‘author‘ : ‘Matin‘,
      ‘books‘ : [ {‘title‘ : ‘Refactor‘ , ‘IBSN‘ : ‘485-566‘},...]
    }
    
  2. 外部文档,引用其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创建标示符:
  1. 使用唯一的字段做标示符

    如在session中,可以使用用户的email, username作为唯一标示符

  2. 对象与自增策略

    单独创建一自增数据(Document Indentifer),如 add(‘user‘,0) 每次创建一个用户时,可以自增‘user‘, 然后得到 ‘user:1233‘等

  3. 使用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会对数字作如下的判断:

  1. 小于30天(606024*30)的一秒为单位的数字,如600表示10分钟过期。
  2. 大于三十天的数字(秒),采用从公元开始的计数,如1381921696表示16th October 2013。
  3. 为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)

  1. 单文档返回

    在php中如果docid不存在会返回undef:

        $message = $cb->get(‘message‘)
    
  2. 多文档返回 (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‘);
时间: 2024-11-06 09:54:14

Couchbase第一印象(架构特性)的相关文章

让你提前认识软件开发(45):代码的第一印象

第3部分 软件研发工作总结 代码的第一印象 我们都很注重给别人的第一印象,也有很多书籍教我们怎样给别人留下一个美好印象的.确实,如果我们第一眼看到某个人,就觉得很不爽,那么一定会在心理上产生抵触,以后再见到他,会有一种疏远的感觉.也正因为如此,当今社会交往中的"面子工程"很重要,不管怎样,先撑足了自己的脸面再说. 代码也一样,也会给别人留下或好或差的印象.当我们看到优美的代码时,会有一种想继续研究下去的欲望,甚至会有一种觉得很享受的感觉.相反,当我们看到丑陋的代码时,就会咬牙切齿,因为

nginx架构特性及编译安装

一.架构特性 nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加速器进程(cache loader)和缓存管理器进程(cache manager)等,所有进程是仅含有一个线程,并主要通过"共享内存"的机制实现进程间通信,主进程以root用户身份运行,而worker.cacher loader和cache manager均应以非特权用户身份运行. 主进程主要完成如下工作: 读取并验证配置信息: 创建.绑定及关闭套接字: 启

别让How are you 毁了你的第一印象

http://news.iciba.com/study/bilingual/1568107.shtml You never get a second chance to make a first impression, so how are you at making a good first impression in English? 你永远也不会得到第二个机会来制造第一印象,所以如何能用英文流利的给对方留下良好印象呢? Being able to make a FLUENT first i

值得赞扬的尝试与进步——CSDN开源夏令营第一印象

注:写这篇文章时我并未參加CSDN开源夏令营,也不确定是否会參加以及是否能參加上. 欣闻CSDN举办了"CSDN开源夏令营"活动.第一感觉是CSDN作为活动的组织者是很值得称赞的.作为參加了Google Summer of Code的人,这里对照下CSDN开源夏令营和Google Summer of Code.纯粹是个人见解,仅供參考. 开源组织 在了解有这个活动后,第一反应是这不就是中国的GSoC吗,先给CSDN大大的一个赞.但冷静一想:国内有合格的开源组织吗?这里不是贬低国内开源活

如何用启动界面给用户创造出色的第一印象

简评:不要让用户等待内容加载,是良好的移动用户体验设计的基本规则.但是很多时候很难,或者说几乎不可能完美地遵守这项规则,因此,利用启动界面(splash screen)平滑过渡应用等待的时间,让用户觉得应用加载得更快些,是现阶段的一个好方法. ▎什么是启动屏幕(splash screen)? 顾名思义,启动屏幕就是用户在启动应用程序时看到的第一个屏幕,Splash screen 通常包含应用程序的名称.logo 和一些背景图像. ▎启动屏幕的作用? 众所周知,第一印象往往和设计相关.糟糕的设计会

史上最强超融合入门干货:超融合与传统架构特性及收益详细对比

在IT基础架构领域工作有十年了,亲眼目睹和参与了上一代网络存储架构在中国的兴起和衰败.的确,新IT浪潮已经到来,超融合就是诸多风口之一,成为了近几年IT业界备受关注的话题.虽然超融合这个概念已经被厂商热炒了至少两年,但看到市场上依旧存在着很多模糊的定义和理解,所以想整理一些学习笔记和个人见解,希望这些干货内容能对想入门的朋友有所帮助 . 一.超融合的核心特征是什么? 首先大家需要有一个概念,我们看到的这些名词,事实上都是最早推行这些架构的厂商建立起来的,比如Nutanix最早推广的超融合这个概念

第一章.架构与设计的流程和核心概念

编程的三要素 好的学习态度 良好的编程习惯 掌握一定的编程技巧 为什么要有架构或者架构的重要性? 一个良好的架构能够使系统具有更好的伸缩性和扩展性,能让软件开发进入一个良性循环. 架构 各行各业都有架构的概念,如建筑业,架构好比房屋的地基和骨架,其它的施工行为都在"架构"上进行操作. 软件开发行业对架构的定义:是对系统的高层视角,或者说是对系统抽象,通过对全局的关注,提供核心代码,对后续的编码或维护进行指导和约束.它是系统开发的蓝图. 架构师的职责 要有领导能力和决策能力 架构师要理解

Python第一印象,大法好!

为了用flask开发web应用,这两天就开始看了一点点Python.还没看到用Python写网站后台的那部分,就被其强大的数据处理能力和语法的灵活性吸引.肯定是我少见多怪,不过看到人家灵活使用Python的这些特性,写出一些奇技淫巧般的代码时,忍不住大赞.下面写一两个例子,一来加深自己的记忆,二来赞美一下Python.(代码借鉴了大神们的思想) 1.剔除1到1000内不是回文数的数,然后打印. 判断一个数是不是回文数,想必学过编程的都写过.当我还在想着取整数的每一位,再倒序加起来和原数比较是否相

Python第一印象

最近在学python,发现它有许多新颖的地方.我之前学过一些C++,发现Python与C++在些地方很相似,有些地方大相径庭.许多Python的概念,C++中都有相似的. 目前遇到的有几个: 1. "万物皆对象" Python中,a = 10, b = 10, 则a,b同引用同一个对象10, 这个"10"被储存在内存某个地方(可以通过id(10)来查看地址) 在C++中, a = 10, b = 10 中, 10是一个右值, 没有地址(?). 另外,在python中