红帽白皮书新鲜出炉!点击获取,让你的云战略更胜一筹! 了解详情
写点什么

一文读懂智能 NoSQL 数据库 Couchbase

  • 2019-08-30
  • 本文字数:5215 字

    阅读完需:约 17 分钟

一文读懂智能 NoSQL 数据库 Couchbase

每一家大中型企业,在业务规模扩张的过程中都需要一个强而有力的数据库来为业务做支撑,尤其是大型跨国企业更是需要在全球的不同地区广泛部署不同的数据库。因其业务原因,财务数据以及应用数据必须在全球范围内都保持强一致性,然而现实情况却是当前市面上很少有数据库能够同时满足这两个需求。


财务数据的重要性不必多说,应用程序则需要为全球用户提供 24x7x365 的全天候服务,并且还需要处理不可预测的数据高峰,而且最关键的是,传统的关系型数据库管理系统(RDBMS)在做灾备或跨数据中心复制数据时,往往具有相当大的挑战。


Couchbase 作为一款能够被部署在本地集群的数据服务,其具备很强的一致性,是一个专注于服务、分布式以及灵活的 JSON 文档数据库,且 Couchbase Server 支持异地跨数据中心复制,能够在各集群之间保持数据一致。


Couchbase Lite 作为一款支持离线工作的嵌入式移动端 NoSQL 数据库,无论网络状况如何,移动应用始终会对本地数据库做出响应,离线时不会影响数据库正常的增删改,查等功能,并且当其恢复在线时,会与 Couchbase Sync Gateway 网关进行数据同步。Sync Gateway 会将数据同步至 Counchbase 服务器以及多个 Couchbase Lite 实例上。(Couchbase Sync Gateway:用于通过 Web 进行数据访问和同步的安全 Web 网关)


Couchbase 拥有开源与商业两个版本,其均可以被部署在云端、Kubernetes 以及一些复杂的混合配置中。


Couchbase Server 查询语言 N1QL,是一款为支持 JSON 文档数据库所设计的 SQL 语言,且还具备扩展分析的作用,N1QL 结合了 SQL 的强大功能以及 JSON 数据模型的灵活性,为应用程序的开发人员提供了一种富有表现力、功能强大且完整的声明性语言,可用于查询、转换和操作 JSON 数据,同时 Couchbase 还支持键值数据访问和全文搜索。


2011 年,Membase (提供键/值、持久化、可伸缩的解决方案) 和 CouchOne (提供端到端复制的文档数据库)这两家企业合并,成立了 Couchbase。Couchbase Server 就是合并后的新产品,其每年都有新功能上线。从 key-value 层开始,2012 年添加了 JSON 文档层,2014 年添加了移动数据库,2015 年添加了 sql 查询,2017 年添加了全文搜索,2018 年添加了企业数据分析功能。

Couchbase 的选择与竞争

Couchbase 在当前市面上面临着非常激烈的竞争,包括 MongoDB、Redis、Oracle、SQL Server 等等。其中 MongoDB 可以被认为是 Couchbase 最直接、最核心的竞争对手。同样作为一款灵活性非常高的文档型数据库,MongoDB 与 Redis 的结合是当下市面上用于解决缓存最常用的方法。除此之外还有像 Oracle、SQL Server 等关系型数据库也使 Couchbase Server 的竞争对手。


但是上述的这些数据库或多或少都有自己所不擅长的领域。关系型数据库的设计初衷是为单体的大型数据库而服务的,因此关系型数据库的扩展性往往很差。但是如果选择 MongoDB,由于其伸缩性不够,往往需要借助 Redis 的配合来加快 MongoDB 的伸缩速度,但这样就会使后台数据系统的管理复杂性大大增加。(作为分布式横向数据扩展平台,Couchbase 长期以来一直是可扩展性,性能和高可用性方面的领导者。)


除此之外,包括像 CockroachDB、Azure Cosmos DB、Amazon Aurora、Aerospike、Amazon DocumentDB 和 Amazon DynamoDB 等都是属于 Couchbase 的竞品。

Couchbase 的服务架构

Couchbase 可以提供诸如索引、查询、安全性、复制、搜索、事件处理、分析和管理等多种数据服务,且这些服务可以在一个或多个节点上运行。Couchbase 的设计围绕三个基本原则,分别是:以内存和网络为中心的体系结构、工作负载隔离以及对所有数据查询的异步支持。在下文中能看到详细的解释。


用一个例子就能将这三点解释清楚,即发生写入请求后,该请求会被提交到内存中并同步存储至磁盘内,Couchbase 会在不堵塞数据读写的前提下来异步建立索引查询,通过将最常用的数据和索引保存至内存中,以便后续可以快速读取相应的数据。这种方式尽管增加了 Couchbase 的 RAM 消耗,但这样也极大降低了数据库读写的延迟并大幅度提升了数据的吞吐量。


此外 Couchbase 具备一个显著特性,即 MDS(多位伸缩),其可以通过独立扩展单个服务来提高效率,这使得在数据查询过程中,CPU 能够将更多的资源分给查询服务,同样也可以使用 SSD 来进行数据索引,从而使用更多的 RAM。


同样,异步操作也减少了 Couchbase 数据堵塞的概率,开发人员可以在数据性能之间的持久性、移植性以及延迟高低之间自定义平衡这三者的关系。


Couchbase JSON 支持基本数据类型和复杂数据类型,包括数字、字符串、嵌套对象和数组,支持创建规范化或非规范化的文档。Couchbase Server 不会引入任何全局调度程序或全局协调,也不依赖精细调整。相比之下,MongoDB 虽然同样不需要调度计划,但是如果开发人员愿意,MongoDB 可以支持这样的操作。


正如稍后将会谈论的内容,有 4 种访问 Couchbase Server 文档的机制,分别为键值、基于 SQL 的查询、全文搜索以及 JavaScript 事件。同样如果 JSON 文档存在子文档或数组的情况,则可以使用路径表达式直接访问,不需要再额外进行传输以及文档的解析。事件模型可以在数据更改(OnUpdate)后触发。此外,还可以通过与 Couchbase Mobile 同步访问 Couchbase 服务器文档。


Couchbase Server 有四个关键概念,分别是 bucket、vBuckets、节点以及集群。bucket Couchbase 通过使用 buckets 提供数据管理服务,buckets 相当于关系数据库中的库,在 Couchbase Server 中用于保存 JSON 文档;vBucket 相当于一个 key 的子集,保存的是客户端存储对象的 key 值,vBuckets 用于在集群的节点间分配数据和备份数据,其本质是自动分布节点上的碎片。节点就是物理或虚拟机,承载 Couchbase Server 的单个实例;集群就是节点组,同步复制就发生在集群的节点之间。

Couchbase 的部署

Couchbase 可以部署在本地、云端以及 Kubernetes 上,Couchbase Server 企业版的开发和测试部分都是免费的,并可通过订阅用于生产。开源版 Couchbase Server 的所有功能都是免费的。当然,这两者之间除一些企业版特有的功能外,开源版 Couchbase Server 与企业版 Couchbase Server 之间的 API 可以互相兼容。


Couchbase Server 简易的部署操作流程可以让用户快速部署一个服务器,只需要通过一个小时左右的时间去学习相关的 Couchbase 教程即可。这里以下图谷歌云为例,在谷歌云平台上创建一个云测试驱动会话程序,在经过 5 分钟的部署生成后可提供一个三节点的 Couchbase 服务器集群以及一个 Sync Gateway 节点,Sync Gateway 节点可用于通过 Web 进行数据访问和数据同步。



谷歌云平台上的测试驱动程序仪表盘,上图这里刚刚加载了一个航空旅行样本

Couchbase Autonomous Operator(自主操作符)

Couchbase 通过与 Azure Kubernetes Service、Amazon Elastic Kubernetes Service 以及 Google Kubernetes Engine 之间进行合作,Couchbase 企业版中研发了 Autonomous Operator(自主操作符)功能,这提供了 Couchbase Server 与开源 Kubernetes 和 Red Hat OpenShift 之间的本地集成提供了条件。


该自主操作符通过创建自定义资源并注册为自定义 Couchbase 服务控制器来扩展 Kubernetes API,以管理复杂有状态的 Couchbase Server 集群应用程序实例。这减少了在 Kubernetes 上运行 Couchbase 集群所需的运维工作量,并允许自动建立并管理常见的 Couchbase Server 任务,如配置、创建、扩展和恢复等。

Couchbase Cross Datacenter Replication (XDCR)

上文有提到,Couchbase Server 可执行跨数据中心之间的数据同步复制,并且在集群中具有极强的一致性。XDCR(跨数据中心复制)功能为 Couchbase 数据库提供了防止数据中心故障,为全球分布式任务关键型应用程序提供高性能数据访问的保障。通过跨集群、不同数据中心和可用性区域采取执行异步、主从复制等措施,避免引起高写入所带来的延迟。当然,XDCR 使得 Couchbase 成为了一个全球性的分布式数据库,但代价是集群之间的数据最终无法保证强一致性。


目前所有 Couchbase Server 版本都支持基本的 XDCR。但是一些诸如过滤、节流、基于时间戳冲突的解决方案等功能只是企业版的特有功能。

Couchbase 查询工具

Couchbase 支持一键查询和检索数据关联值,该值可以是 JSON 文档或 Blob。此外还可以使用类似 SQL 的 N1QL 语言或全文搜索来查询。当然如果 bucket 有支持查询的索引,N1QL 和全文查询都会更快。

N1QL

N1QL,发音为“nickel”, 看起来非常像带有 JSON 扩展的标准 SQL 语句。N1QL 使得开发者可以在 Couchbase 上使用 SQL 语言进行开发,其不仅支持复杂的 SQL 能力和保留了 JSON 文档灵活的数据模型,还支持了跨文档的连接操作以及针对 JSON 数据的嵌套格式,这些都使得在 JSON 文档上使用 SQL 开发比基于 MongoDB 的开发要更加容易。


并且 N1QL 也在不断发展着分支,其中一种是用于 Couchbase Server 的高性能数据查询服务;另一个 N1QL for Analytics 基于 SQL++研发,用于企业版的分析服务。


还有一些 N1QL 扩展,比如 USE KEYS, NEST, UNNEST, and MISSING。USE KEYS 和 USE HASH 是连接的查询提示。嵌套和反嵌套被用于打包和解包数组。MISSING 是 JSON 特定的 NULL 替代方案;“IS NOT MISSING”表示文档中存在的特定值或为空。“NOT MISSING 和 NOT NULL”则表示这些不丢失和不为空的关键词是已知的。因此 N1QL 查询可以使用路径,同样也适用于全文本搜索。



上图为针对 Couchbase Server 航空旅行样例 bucket 的简单 N1QL 查询。注意 N1QL 与 SQL 十分相似。



Couchbase Server 中按节点划分的航空旅行样例桶的索引列表。def_type 索引对于上图 WHERE t.type=…而言是必需的

全文搜索

Couchbase 支持诸如 Solr 等外部的全文搜索引擎,当然 Couchbase 也拥有基于 Go 语言的全文搜索引擎 Bleve。Bleve 包含在 Couchbase Mobile 和 Couchbase 服务器中,它支持大多数搜索的语法。



上图为使用 Couchbase Server 的 Bleve 引擎的全文搜索。此查询需要全文索引。

Couchbase SDKs

大部分主要的 Couchbase Server 功能都可以通过 SDK 的形式公开出来。SDKs 可用于 C/ c++、. net (c#、f#和 Visual Basic . net)、Go、Java 和 Node。js、PHP、Python 和 Scala 等多种语言。


除了 SDKs, Couchbase 还提供了与几款与自身功能关系紧密的数据框架,如 Spring Data、.net LINQ 以及 Couchbase 自己的 Ottoman Node.js ODM。例如,下面的示例查询应用了 Linq2Couchbase:


{     Servers = new List<Uri> {new Uri("http://localhost:8091/")}});
var context = new BucketContext(ClusterHelper.GetBucket("travel-sample"));var query = (from a in context.Query<AirLine>() where a.Country == "United Kingdom" select a). Take(10);
query.ToList().ForEach(Console.WriteLine);
复制代码

Couchbase Mobile(移动端)

Couchbase Mobile 由两部分组成,分别为运行在移动设备上的 Couchbase Lite 以及运行在服务器节点上的 Couchbase Sync Gateway。Couchbase Lite 可以运行在 iOS、Android、.Net 以及 Xamarin 上,并且支持 Swift、Objective-C、Java、Kotlin 和 c++等语言。


例如,下图使用 Java 定义了一个要在 Android 上运行的查询:


Database database = DatabaseManager.getDatabase();Query searchQuery = QueryBuilder  .select(SelectResult.expression(Expression.property("airportname")))  .from(DataSource.database(database))  .where(    Expression.property("type").equalTo(Expression.string("airport"))      .and(Expression.property("airportname").like(Expression.string(prefix + "%"))));
复制代码

Couchbase 基准测试

虽然 InfoWorld 还没有对 Couchbase Server 进行基准测试,但是第三方(Altoros)已经使用 YCSB JSON、键值测试以及 TPCx-IoT 测试进行了基准测试。下图则用于 JSON 文档基准测试。可以看到,Couchbase 服务器的性能优于 MongoDB 和 DataStax。此外 Altoros 提供了所有必须的脚本,因此开发者可以自己重新运行这些基准测试。



在 Altoros 中运行 JSON 基准测试,比较 Couchbase 服务器、MongoDB 和 DataStax。可以看到,在这个测试中,Couchbase 提供了更高的吞吐量和更低的延迟,并随着数据和服务器的伸缩而得到改善。


总体来说,Couchbase Server 与 NoSQL JSON 文档数据库一样,都具备类似 sql 的查询语言和全文搜索引擎,Couchbase Mobile 将数据价值扩展到移动终端上。因此 Couchbase 的价值高低与否,这取决于开发者产品应用以及业务需求。


如果需要关系型数据库的可靠模式结构或相关的数据库,那么 Couchbase 并非最优解。但是如果需要一个全局可伸缩的文档数据库,那么相信 Couchbase 将会是一个不错的选择。


原文链接:


https://www.infoworld.com/article/3430716/couchbase-review-a-smart-nosql-database.html?upd=1565772462442


2019-08-30 11:288084
用户头像
佘磊 策划编辑

发布了 50 篇内容, 共 20.1 次阅读, 收获喜欢 75 次。

关注

评论

发布
暂无评论
发现更多内容

Web3.0杂谈-#004(51/100)

hackstoic

NFT Web3.0

这些js原型及原型链面试题你能做对几道

loveX001

JavaScript

工赋开发者社区 | 当PLC与见“IT”:MES/MOM标准之ISA-95基础内容介绍

工赋开发者社区

【牛客刷题-算法】NC4 判断链表中是否有环

清风莫追

算法 10月月更

乐观锁和悲观锁

潜水员

并发

Qt中读取json文件以及总结

中国好公民st

c++ qt 10月月更

Vue3入门指北(六)列表渲染

Augus

Vue3 10月月更

【牛客刷题-算法】3-第一篇-斐波拉契数列-C实现

清风莫追

递归 数据结构与算法、 10月月更

Python基础(七) | 文件、异常以及模块详解

timerring

异常 模块 10月月更

【愚公系列】2022年10月 Go教学课程 016-运算符之逻辑运算符和其他运算符

愚公搬代码

10月月更

Linux操作系统——用户管理、实用指令

胖虎不秃头

Linux 10月月更

Python应用之计算阶乘

攻城狮Wayne

函数 10月月更 阶乘计算

JavaScript中this指向哪儿?如何确定this?-前端面试进阶

loveX001

JavaScript

工赋开发者社区 | 某大型电子装备总装数字化工厂MES/MOM系统实施

工赋开发者社区

【牛客刷题-算法】2-算法入门-栈的压入、弹出序列

清风莫追

算法 10月月更

Linux操作系统——组管理和权限管理

胖虎不秃头

Linux 操作系统 10月月更

MyBatis 学习笔记之MyBatis入门开发

openpark

mybatis 10月月更 mybatis入门

Linux操作系统——定时任务调度、磁盘分区与挂载、网络配置

胖虎不秃头

Linux 操作系统 10月月更

用30分钟相中10倍工程师

愚夫一得

面试 技术管理 招聘 文化 & 方法

你是如何使用React高阶组件的?

beifeng1996

React

匿名网络追踪溯源机制及方法

郑州埃文科技

IP地址 追踪溯源 匿名网络

【LeetCode】在LR字符串中交换相邻字符Java题解

Albert

LeetCode 10月月更

计算机网络——以太网交换机学习和转发帧

StackOverflow

编程 计算机网络 10月月更

Python基础(六) | 面向对象类定义及特性详解

timerring

实例 10月月更

[架构实战] 课后作业二

爱学习的麦子

架构师的十八般武艺:风险管理

agnostic

风险管理

【一Go到底】第二天---你好,Go and GOROOT&GOPATH

指剑

golang Go入门 10月月更

Taurus: 面向机器学习的数据面架构

俞凡

人工智能 网络 自智网络

架构师的十八般武艺:变更管理

agnostic

需求变更

【从0到1学算法】2.递归

Geek_65222d

10月月更

MyBatis 学习笔记之配置文件

openpark

mybatis 10月月更 mybatis配置文件

一文读懂智能 NoSQL 数据库 Couchbase_数据库_Martin Heller_InfoQ精选文章