早期大数据与NoSQL技术解析
立即解锁
发布时间: 2025-08-30 01:39:07 阅读量: 8 订阅数: 9 AIGC 

### 早期大数据与NoSQL技术解析
#### 1. NoSQL在实际用例中的应用
在实际用例场景下,我们需要一种面向文档的NoSQL技术,将关系型数据库中的数据结构化到JSON文档中。传统的关系型数据库管理系统(RDBMS)将数据存储在多个相互关联的表中,这使得获取整个对象的描述变得困难且效率低下。
以一个账户为例,它可能被拆分成多个表。若要检索所有账户信息,需要在三个表之间进行两次连接操作。而且,每次用户连接时都要为所有用户执行此操作,在应用程序中,这些连接操作是出于不同的业务逻辑原因。最终,我们只想要一个账户的“视图”。
如果我们可以通过将账户标识符传递给应用程序API的一个方法,就能得到如下JSON文档形式的完整账户视图:
```json
{
"id": "account_identifier",
"email": "[email protected]",
"firstname": "account_firstname",
"lastname": "account_lastname",
"birthdate": "account_birthdate",
"authentication": [
{
"token": "authentication_token_1",
"source": "authenticaton_source_1",
"created": "12-12-12"
},
{
"token": "authentication_token_2",
"source": "authenticaton_source_2",
"created": "12-12-12"
}
],
"address": [
{
"street": "address_street_1",
"city": "address_city_1",
"zip": "address_zip_1",
"country": "address_country_1",
"created": "12-12-12"
}
]
}
```
这样做的好处显而易见:通过保持应用程序实体的最新JSON表示,我们可以实现更好、更快的数据访问。此外,我们可以将这种方法推广到所有读取请求,使得所有读取操作都在NoSQL数据存储上进行,而将所有修改请求(创建、更新、删除)留给RDBMS。但我们必须实现一种逻辑,将RDBMS上的任何更改事务性地传播到NoSQL数据存储中,并且如果在缓存中未找到对象,则从关系型数据库中创建该对象。
我们保留RDBMS的原因在于,我们不想进行大规模的变革。假设RDBMS已经存在,而我们希望集成NoSQL数据存储,是因为RDBMS缺乏灵活性。我们希望充分利用这两种技术的优势,即RDBMS的数据一致性和NoSQL的可扩展性。
另外,这只是一个简单的查询示例,我们还可以进一步对文档的任何字段进行全文搜索。在关系型数据库中实现这一点并不容易,虽然可以使用索引,但不可能对所有表列进行索引。而使用NoSQL技术(如ElasticSearch),则可以轻松实现。
在深入研究这样的NoSQL缓存系统之前,我们需要先了解如何使用Couchbase面向文档的数据库,然后回顾其局限性,这将促使我们转向ElasticSearch。
#### 2. Couchbase数据库介绍
Couchbase是一个开源的、面向文档的数据库,具有灵活的数据模型、高性能、可扩展性,适用于像我们这样需要将关系型数据库数据转换为结构化JSON文档的应用程序。
##### 2.1 Couchbase架构
Couchbase基于真正的无共享架构,这意味着集群中的每个节点都是自给自足且独立的,不存在单点争用问题。这是分布式技术的工作方式,节点之间不共享任何内存或磁盘存储。
文档以JSON或二进制形式存储在Couchbase中,并在集群中进行复制,被组织成称为“桶(bucket)”的单元。桶可以根据存储和访问需求进行扩展,通过设置用于缓存的RAM和复制次数来提高弹性。在底层,桶被拆分为更小的单元,称为vBucket,实际上是数据分区。Couchbase使用集群映射将分区映射到所属的服务器。
Couchbase服务器在集群内最多复制桶三次,每个Couchbase服务器管理一部分活动或副本vBucket。这就是Couchbase的弹性机制:每次文档被索引时都会被复制,如果集群中的某个节点出现故障,集群会将副本分区提升为活动分区,以确保服务的连续性。
从客户端的角度来看,如果使用智能客户端(如Java、C、C++、Ruby等),这些客户端会连接到集群映射,从而可以将应用程序的请求发送到持有文档的适当服务器。需要注意的是,文档操作默认是异步的。例如,当你更新一个文档时,Couchbase不会立即将其更新到磁盘上,而是按照以下流程进行处理:
```mermaid
graph LR
A[智能客户端] --> B[Couchbase服务器实例]
B --> C[异步写入管理缓存]
C --> D[客户端立即获得响应]
C --> E[放入集群间写入队列]
E --> F[跨集群复制]
F --> G[放入磁盘存储写入队列]
G --> H[持久化到相关节点磁盘]
H --> I{是否多集群部署}
I -- 是 --> J[使用XDCR传播更改]
I -- 否 --> K[结束]
```
##### 2.2 Couchbase的数据查询
Couchbase有自己的数据查询方式,你可以使用简单的文档ID进行查询,但Couchbase的强大之处在于其视图功能。在Couchbase中,有一个二级索引,称为设计文档,它在桶内创建。一个桶可以包含多种类型的文档,例如,在一个简单的电子商务应用程序中,一个桶可能包含以下类型的文档:
- 账户
- 产品
- 购物车
- 订单
- 账单
Couchbase通过设计文档对这些文档进行逻辑划分。一个桶可以包含多个设计文档,每个设计文档又包含多个视图。视图是一个函数,它以用户定义的方式对桶中包含的文档进行索引。这个函数实际上是一个用户定义的map/reduce函数,它在集群中映射文档并输出键/值对,然后将这些键/值对存储在索引中以供后续检索。
以电子商务网站为例,我们尝试对所有订单进行索引,以便通过账户标识符获取这些订单。map/reduce函数如下:
```javascript
function(doc, meta) {
if (doc.order_account_id)
emit(doc.order_account_id, null);
}
```
这个`if`语句使函数只关注包含`order_account_id`字段的文档,并对该标识符进行索引。因此,任何客户端都可以根据这个标识符在Couchbase中查询数据。
##### 2.3 Couchbase集群管理与控制台
集群管理由集群中的一个特定节点(协调器节点)处理。如果集群中的某个节点出现故障,协调器会通知集群中的所有其他节点,并定位故障节点的副本分区,将其提升为活动状态。如果协调器节点出现故障,所有节点会通过心跳监视器检测到这一情况,一旦检测到故障,会在节点中选举出新的协调器。
所有与集群相关的功能都通过API公开,可以用于管理Couchbase。此外,Couchbase还提供了一个开箱即用的管理控制台。Couchbase控制台是一个安全的控制台,允许你管理和监控集群,你可以选择以下操作:
- 设置服务器
- 创建桶
- 浏览和更新文档
- 实现新视图
- 监控vBucket和磁盘写入队列
在服务器节点选项卡中,你可以执行集群管理操作,配置故障转移和复制以防止数据丢失。任何时候,你都可以通过点击“添加服务器”按钮添加新的Couchbase服务器,此时数据将开始在节点之间复制,以实现故障转移。通过点击服务器IP,你可以访问每个桶各个方面的详细监控数据。
##### 2.4 Couchbase文档管理
你可以通过管理控制台的桶视图管理所有文档。这个视图允许用户浏览桶、设计文档和视图。文档存储在Couchbase的桶中,可以在管理控制台的数据桶选项卡中访问。
控制台会提供桶的统计信息,如RAM和存储大小,以及每秒的操作次数。但这个视图的真正好处是,你可以浏览文档并通过ID检索它们。此外,你还可以在这个视图中创建设计文档和视图,以便对文档进行索引以供后续检索。
管理控制台是管理文档的便捷方式,但在实际的工业化架构中,大部分工作是通过使用Couchbase API的脚本来完成的。所有设计文档都存储在JSON文件中,其结构简单,描述了所有视图,示例如下:
```json
[
{
"doc": {
"json": {
"views": {
"by_Id": {
"map": "function (doc, meta) {\n emit(doc.id, doc);\n}"
},
"by_email": {
"map": "function (doc, meta) {\n emit(doc.email, doc);\n}"
},
"by_name": {
"map": "function (doc, meta) {\n emit(doc.firstname, null);\n}"
},
"by_company": {
"map": "function (doc, meta) {\n emit(doc.company, null);\n}"
},
"by_form": {
"map": "function (doc, meta) {\n emit(meta.id, null);\n}"
}
}
}
}
}
]
```
#### 3. ElasticSearch数据库介绍
ElasticSearch是一种NoSQL技术,与Couchbase有很大不同。它是由Elastic公司提供的分布式数据存储系统,在编写本文时,其版本为2.1。
##### 3.1 ElasticSearch架构
ElasticSearch允许存储、搜索和分析数据,它是基于Apache Lucene(一个用Java编写的开源全文搜索引擎)构建的索引/搜索引擎。从一开始,ElasticSearch就被设计为分布式且可横向扩展的,这意味着除了通过为节点添加更多资源进行纵向扩展外,还可以通过动态添加更多节点来实现横向扩展,从而提高集群的高可用性和弹性。在节点发生故障时,由于数据在集群中进行了复制,因此可以由其他节点提供服务。
ElasticSearch是一个无模式的引擎,数据以JSON形式存储,并被划分为称为“分片(shard)”的单元。分片实际上是一个Lucene索引,是ElasticSearch中最小的扩展单元。分片在ElasticSearch中被组织成索引,应用程序可以通过索引进行读写交互。最终,索引只是ElasticSearch中的一个逻辑命名空间,它将一组分片组合在一起,当请求到来时,ElasticSearch会将其路由到适当的分片,流程如下:
```mermaid
graph LR
A[请求进入] --> B[ElasticSearch]
B --> C{路由到合适索引}
C --> D{路由到合适分片}
D --> E[处理请求]
```
ElasticSearch中有两种类型的分片:主分片和副本分片。当启动一个ElasticSearch节点时,可以先只添加一个主分片,这可能足够了,但如果随着时间的推移,读写请求吞吐量增加,一个主分片可能就不够了,此时需要添加另一个分片。但不能动态添加分片并期望ElasticSearch自动扩展,因为它需要对更大索引中的所有数据进行重新索引。因此,在基于ElasticSearch的项目开始时,重要的是要对集群中需要的主分片数量有一个合理的估计。增加节点中的分片数量可能不会增加集群的容量,因为受限于节点的硬件容量。要增加集群容量,必须添加更多持有主分片的节点,ElasticSearch会自动在网络上将分片复制到新节点。
副本分片在启动时创建,用于故障转移。当主分片失效时,副本分片会被提升为主分片,以确保集群的连续性。副本分片在索引时与主分片具有相同的负载,这意味着一旦文档在主分片中被索引,它也会在副本分片中被索引。因此,向集群中添加更多副本不会提高索引性能,但如果添加额外的硬件,可以显著提高搜索性能。例如,在一个包含三个节点、两个主分片和两个副本分片的集群中,分片分配如下表所示:
| 节点 | 主分片 | 副本分片 |
| --- | --- | --- |
| 节点1 | 主分片1 | 副本分片2 |
| 节点2 | 主分片2 | 副本分片1 |
| 节点3 | 无 | 无 |
ElasticSearch中的索引被组织到节点中,实际上有三种类型的节点:
- **主节点(Master nodes)**:这些节点轻量级,负责集群管理。这意味着它们不持有任何数据、服务器索引或搜索请求,专门用于确保集群的稳定性,负载较低。建议使用三个专用的主节点,以确保如果其中一个节点发生故障,仍能保证冗余。
- **数据节点(Data nodes)**:这些节点持有数据,并处理索引和搜索请求。
- **客户端节点(Client nodes)**:这些节点在某些处理步骤中确保负载均衡,并可以承担数据节点可以执行的部分工作负载,例如在搜索请求中,将请求分散到各个节点并收集响应输出在运行时可能会非常繁重。
##### 3.2 ElasticSearch搜索API使用
了解了ElasticSearch的架构后,下面来介绍如何使用搜索API进行查询。以下是一些基本的查询操作步骤:
1. **连接到ElasticSearch集群**:使用合适的客户端库(如Python的`elasticsearch`库)连接到ElasticSearch集群。
2. **构建查询请求**:根据需求构建JSON格式的查询请求。例如,要进行简单的全文搜索,可以使用以下查询:
```json
{
"query": {
"match": {
"field_name": "search_term"
}
}
}
```
3. **发送查询请求**:将构建好的查询请求发送到ElasticSearch集群。
4. **处理响应**:接收并处理ElasticSearch返回的响应,提取所需的数据。
### 总结
通过对NoSQL技术在实际用例中的应用分析,我们了解到NoSQL技术在处理大数据方面的优势。Couchbase作为一种面向文档的数据库,具有灵活的数据模型和良好的可扩展性,适合将关系型数据库数据转换为JSON文档。而ElasticSearch作为分布式的索引/搜索引擎,在全文搜索和数据分析方面表现出色。在实际应用中,可以根据具体需求,结合使用这两种技术,充分发挥它们的优势,构建出高效、可扩展的大数据架构。同时,在使用过程中,需要注意Couchbase的一些局限性,以及ElasticSearch在分片管理和节点配置方面的要点。
0
0
复制全文
相关推荐










