MongoDB大数据处理权威指南(第3版) pdf

MongoDB大数据处理权威指南(第3版)

内容简介

《MongoDB大数据处理*指南(第3版)》针对MongoDB 3做了精细更新,呈现MongoDB的所有最新特性,涵盖2.2版引入的聚集框架、2.4版引入的哈希索引以及3.2版本的WiredTiger,还新纳入Node.js和Python。

MongoDB是最流行的“大数据”NoSQL数据库技术,目前仍在蓬勃发展。来自10gen的David Hows以及经验丰富的Peter Membrey和Eelco Plugge等MongoDB专家联袂撰写本书,在书中分享他们的宝贵专业知识和经验,向读者呈现成长为一名MongoDB专家需要了解的所有知识。

作者简介

Peter Membrey,是一位特许IT研究员,他拥有15年使用Linux和开源解决方案解决现实问题的经验。从17岁起他就是一位红帽认证工程师,也有幸在Red Hat工作过,并撰写了几本与开源解决方案相关的书籍。他拥有利物浦大学的信息安全硕士学位,目前是香港理工大学的博士生,他的研究方向包括时间同步、云计算、大数据和安全。他与自己贤惠的妻子Sara和儿子Kaydyn一起居住在香港。

Eelco Plugge,是一个工作和生活在荷兰的技术人员。目前是移动设备管理行业的工程师,他把大部分时间花在分析日志、配置和错误上,他之前是McAfee的一位数据加密专家,完成一些IT/系统工程工作。Eelco撰写了不少有关MongoDB和负载平衡的书,这位技术攻关人员对与IT安全相关的主题很有兴趣,与IT安全中的MSc相互补充。Eelco是两个孩子的父亲,闲暇时会离开电脑屏幕,偶尔看书。他感兴趣的事情有科学和自然方面的奇闻趣事、外汇交易(外汇)、编程、安全性和寿司。

Tim Hawkins,曾在1993年创建了世界上首个在线分类广告门户网站loot.com,之后负责管理雅虎欧盟的许多非媒体属性产品,例如搜索、本地搜索、邮件、消息和社交网络。他目前正在管理美国主要电子零售商的一个大型离岸团队,负责开发和部署下一代电子商务应用。他喜欢礼帽,讨厌复杂性。

目录

第1章 MongoDB简介 1
1.1 了解MongoDB哲学 1
1.1.1 使用正确的工具处理正确的工作 1
1.1.2 天然缺少对事务的支持 3
1.1.3 JSON和MongoDB 3
1.1.4 采用非关系方式 5
1.1.5 选择性能还是特性 6
1.1.6 在任何地方均可运行数据库 6
1.2 将所有组合在一起 7
1.2.1 生成或创建键 7
1.2.2 使用键和值 8
1.2.3 实现集合 8
1.2.4 了解数据库 9
1.3 了解特性列表 9
1.3.1 WiredTiger 9
1.3.2 使用面向文档存储(BSON) 9
1.3.3 支持动态查询 10
1.3.4 为文档创建索引 11
1.3.5 使用地理空间索引 11
1.3.6 分析查询 11
1.3.7 就地更新信息(仅用于内存映射
的数据库) 12
1.3.8 存储二进制数据 12
1.3.9 复制数据 12
1.3.10 实施分片 13
1.3.11 使用map和reduce函数 13
1.3.12 聚集框架 14
1.4 获取帮助 14
1.4.1 访问网站 14
1.4.2 剪切和粘贴MongoDB代码 14
1.4.3 在Google小组中寻找解决方案 14
1.4.4 在Stack Overflow中寻找解
决方案 14
1.4.5 利用JIRA跟踪系统 15
1.4.6 与MongoDB开发者沟通 15
1.5 小结 15
第2章 安装MongoDB 17
2.1 选择版本 17
2.2 在系统中安装MongoDB 18
2.2.1 在Linux中安装MongoDB 18
2.2.2 在Windows中安装MongoDB 19
2.3 运行MongoDB 20
2.3.1 先决条件 20
2.3.2 研究安装目录布局 20
2.3.3 使用MongoDB shell 21
2.4 添加额外的驱动 22
2.4.1 安装PHP驱动 22
2.4.2 确认PHP安装正确 25
2.4.3 安装Python驱动 27
2.4.4 确认PyMongo安装正确 28
2.5 小结 29
第3章 数据模型 31
3.1 设计数据库 31
3.1.1 集合的更多细节 32
3.1.2 使用文档 33
3.1.3 在文档中内嵌或引用信息 34
3.1.4 创建_id字段 35
3.2 构建索引 36
3.3 使用地理空间索引 36
3.4 可插拔的存储引擎 41
3.5 在真实世界中使用MongoDB 42
3.6 小结 42
第4章 使用数据 43
4.1 浏览数据库 43
4.2 在集合中插入数据 44
4.3 查询数据 45
4.3.1 使用点号 47
4.3.2 使用函数sort、limit和skip 48
4.3.3 使用固定集合、自然顺
序和$natural 48
4.3.4 获取单个文档 50
4.3.5 使用聚集命令 50
4.3.6 使用条件操作符 52
4.3.7 使用正则表达式 59
4.4 更新数据 60
4.4.1 使用update()更新 60
4.4.2 使用save()命令实现upsert 60
4.4.3 自动更新信息 61
4.4.4 从数组中删除元素 64
4.4.5 指定匹配数组的位置 65
4.4.6 原子操作 65
4.4.7 以原子方式修改和返回文档 67
4.5 批处理数据 67
4.5.1 执行批处理 68
4.5.2 评估输出 69
4.6 重命名集合 70
4.7 删除数据 70
4.8 引用数据库 71
4.8.1 手动引用数据 71
4.8.2 使用DBRef引用数据 72
4.9 使用与索引相关的函数 74
4.10 小结 77
第5章 GridFS 79
5.1 背景 79
5.2 使用GridFS 80
5.3 开始使用命令行工具 80
5.3.1 使用_id键 81
5.3.2 使用文件名 81
5.3.3 文件的长度 82
5.3.4 使用块大小 82
5.3.5 跟踪上传日期 82
5.3.6 生成文件的哈希值 83
5.4 查看MongoDB中的数据 83
5.4.1 使用搜索命令 84
5.4.2 删除 84
5.4.3 从MongoDB中获取文件 85
5.4.4 mongofiles命令小结 85
5.5 使用Python 85
5.5.1 连接数据库 86
5.5.2 访问单词 87
5.6 在MongoDB中添加文件 87
5.7 从GridFS中读取文件 87
5.8 删除文件 88
5.9 小结 88
第6章 PHP和MongoDB 89
6.1 比较MongoDB和PHP中
的文档 89
6.2 MongoDB类 90
6.2.1 连接和断开连接 91
6.2.2 插入数据 92
6.3 查询数据 94
6.3.1 返回单个文档 94
6.3.2 列出所有文档 95
6.4 使用查询操作符 96
6.4.1 查询特定信息 96
6.4.2 排序、限制和忽略数据项 97
6.4.3 统计匹配结果的数目 98
6.4.4 使用聚集框架对数组分组 98
6.4.5 使用hint()函数指定索引 99
6.4.6 使用条件操作符重新定义查询 100
6.4.7 判断某个字段是否有值 105
6.4.8 正则表达式 106
6.5 使用PHP修改数据 106
6.5.1 使用update()函数更新数据 107
6.5.2 节省更新操作的时间 108
6.5.3 使用save()函数更新数据 114
6.5.4 以原子方式修改文档 115
6.6 批处理数据 116
6.6.1 执行批处理 117
6.6.2 评估输出 118
6.7 删除数据 118
6.8 DBRef 120
6.9 GridFS和PHP驱动 122
6.9.1 存储文件 122
6.9.2 在已存储的文件中添加
元数据 123
6.9.3 获取文件 123
6.9.4 删除数据 124
6.10 小结 124
第7章 Python和MongoDB 125
7.1 在Python中使用文档 125
7.2 使用PyMongo模块 126
7.3 连接和断开 126
7.4 插入数据 126
7.5 搜索数据 128
7.5.1 搜索单个文档 128
7.5.2 搜索多个文档 129
7.5.3 使用点操作符 129
7.5.4 返回字段 130
7.5.5 使用sort()、limit()和skip()简化
查询 130
7.5.6 聚集查询 132
7.5.7 使用hint()指定索引 134
7.5.8 使用条件操作符重定义查询 135
7.5.9 使用正则表达式执行搜索 140
7.6 修改数据 140
7.6.1 更新数据 141
7.6.2 修改操作符 141
7.6.3 用replace_one()替代文档 145
7.6.4 以原子方式修改文档 146
7.6.5 使用参数 146
7.7 批处理数据 147
7.8 删除数据 148
7.9 在两个文档之间创建链接 149
7.10 小结 152
第8章 高级查询 153
8.1 文本搜索 153
8.1.1 文本搜索的代价和限制 154
8.1.2 使用文本搜索 154
8.1.3 其他语言中的文本索引 158
8.1.4 文本索引的复合索引 159
8.2 聚集框架 160
8.2.1 $group 161
8.2.2 $limit 163
8.2.3 $match 164
8.2.4 $sort 165
8.2.5 $unwind 166
8.2.6 $skip 168
8.2.7 $out 169
8.2.8 $lookup 170
8.3 MapReduce 171
8.3.1 MapReduce的工作方式 171
8.3.2 设置测试文档 172
8.3.3 使用map函数 172
8.3.4 高级MapReduce 174
8.3.5 调试MapReduce 176
8.4 小结 177
第9章 数据库管理 179
9.1 使用管理工具 179
9.1.1 mongo——MongoDB控制台 179
9.1.2 使用第三方管理工具 180
9.2 备份MongoDB服务器 180
9.2.1 创建*个备份 180
9.2.2 备份单个数据库 182
9.2.3 备份单个集合 182
9.3 深入学习备份 183
9.4 恢复单个数据库或集合 183
9.4.1 恢复单个数据库 184
9.4.2 恢复单个集合 184
9.5 自动备份 185
9.5.1 使用本地数据存储 185
9.5.2 使用远端数据存储(基于云) 187
9.6 备份大数据库 188
9.6.1 使用隐藏的辅助服务器
备份数据 188
9.6.2 使用日志文件系统创建快照 188
9.6.3 使用卷管理器时的磁盘布局 190
9.7 将数据导入MongoDB 191
9.8 从MongoDB导出数据 192
9.9 通过限制对MongoDB服务器
的访问保护数据安全 193
9.10 使用身份验证保护服务器 193
9.10.1 添加admin用户 193
9.10.2 启用身份验证 194
9.10.3 在mongo控制台中执行
身份验证 194
9.10.4 MongoDB用户角色 196
9.10.5 修改用户凭据 197
9.10.6 添加只读用户 198
9.10.7 删除用户 198
9.10.8 在PHP应用中进行连接
身份验证 198
9.11 管理服务器 199
9.11.1 启动服务器 199
9.11.2 获得服务器版本 201
9.11.3 获得服务器状态 201
9.11.4 关闭服务器 203
9.12 使用MongoDB日志文件 204
9.13 验证和修复数据 204
9.13.1 修复服务器 205
9.13.2 验证单个集合 205
9.13.3 修复集合验证错误 206
9.13.4 修复集合的数据文件 207
9.13.5 压缩集合的数据文件 207
9.14 升级MongoDB 208
9.15 监控MongoDB 208
9.16 使用MongoDB云管理器 209
9.17 小结 210
第10章 优化 211
10.1 优化服务器硬件以提高性能 211
10.2 理解MongoDB的存储引擎 211
10.3 了解MMAPv1中MongoDB
使用内存的方式 212
10.4 理解WiredTiger下MongoDB
的内存使用方式 212
10.4.1 WiredTiger中的压缩 213
10.4.2 选择正确的数据库服务
器硬件 213
10.5 评估查询性能 214
10.5.1 MongoDB分析器 214
10.5.2 使用explain()分析特定的
查询 217
10.5.3 使用分析器和explain()优化
查询 219
10.6 管理索引 224
10.6.1 显示索引 224
10.6.2 创建简单的索引 225
10.6.3 创建复合索引 226
10.7 Jesse Jiryu Davis的三步
混合索引 226
10.7.1 设置 227
10.7.2 范围查询 227
10.7.3 相等和范围查询 228
10.7.4 题外话:MongoDB选择
索引的方式 230
10.7.5 相等、范围查询和排序 231
10.7.6 *后的方法 233
10.8 指定索引选项 234
10.8.1 使用{background: true}在
后台创建索引 234
10.8.2 使用{unique: true}创建*
键索引 234
10.8.3 使用{sparse: true}创建
稀疏索引 235
10.8.4 创建部分索引 235
10.8.5 TTL索引 235
10.8.6 文本索引 236
10.8.7 删除索引 236
10.8.8 重建集合索引 237
10.9 通过hint()强制使用特定
的索引 237
10.10 使用索引过滤器 238
10.11 优化小对象的存储 240
10.12 小结 241
第11章 复制 243
11.1 MongoDB复制的目标 243
11.1.1 改善可扩展性 243
11.1.2 改善持久性/可靠性 244
11.1.3 提供隔离性 244
11.2 复制基础 244
11.2.1 主服务器的定义 245
11.2.2 辅助服务器的定义 245
11.2.3 仲裁服务器的定义 246
11.3 深入学习oplog 246
11.4 实现复制集 247
11.4.1 创建复制集 248
11.4.2 启动复制集成员 249
11.4.3 向复制集中添加服务器 250
11.4.4 添加仲裁服务器 255
11.4.5 复制集链 256
11.4.6 管理复制集 256
11.4.7 为复制集成员配置选项 261
11.4.8 从应用连接到复制集 262
11.5 读顾虑 266
11.6 小结 266
第12章 分片 267
12.1 了解分片的需求 267
12.2 对数据进行水平和垂直分区 268
12.2.1 对数据进行垂直分区 268
12.2.2 对数据进行水平分区 268
12.3 分析一个简单的分片场景 269
12.4 使用MongoDB实现分片 270
12.4.1 创建分片设置 271
12.4.2 确定连接的方式 277
12.4.3 列出分片服务器的状态 278
12.4.4 使用复制集实现分片 279
12.5 均衡器 279
12.6 哈希片键 281
12.7 标签分片 282
12.8 添加更多配置服务器 284
12.9 小结 285

感悟与笔记

MongoDB简介

MongoDB(源自单词humongous)是一种较新的数据库,它没有表、模式、SQL或行的概念。它没有事务、ACID兼容性、连接、外键或其他许多容易在凌晨引起问题的特性。

1.1了解MongoDB哲学

1.1.1使用正确的工具处理正确的工作

MongoDB中最重要的哲学概念是:一鞋难合众人脚。

1.1.2天然缺少对事务的支持

数据库将不会包含事务的语义(用于保·证数据一致性和存储的元素),

1.1.3 BSON和MongoDB

BSON(二进制JSON的英文简称)的开放数据格式。大多数情况下,使用BSON取代JSON并不会改变处理数据的方式,BSON通过使计算机更容易处理和搜索文档的方式,使MongoDB处理速度变得更快。BSON还添加了一些标准JSON不支持的特性,包括数字数据(例如int32和int64)的许多扩展类型,以及支持处理二进制数据。

1.1.4采用非关系方式

改进关系型数据库性能的方式是非常直接的:购买更大更快的服务器。

MongoDB通过一种非常聪明的方式解决了这些活跃/活跃集群问题, MongoDB是以BSON文档格式存储数据的,所以数据是自包含的。尽管相似的数据文档被存储在一起,但各个文档之间并没有关系。你需要的所有东西都在同一个地方。

因为MongoDB查询将在文档中寻找特定的键和值,该信息可以轻松地被扩散到所有可用的服务器上。每台服务器都将检查该查询,并返回结果。这样,可扩展性和性能的提升几乎是线性的。

MongoDB并不提供主/主复制,两台不同的服务器都可以接受写入请求。不过,它支持分片,允许将数据分散到多台机器中,每台机器都将负责更新数据集的不同部分。

  • 分片集群的好处是可以添加额外的分片,来增加部署中的资源能力,而不必更改任何应用程序代码。
  • 非分片数据库部署仅限于垂直缩放:可以添加更多的内存/CPU/磁盘,但是这很快就会变得非常昂贵。

分片的部署也可以垂直缩放,但更重要的是,它们可以基于能力要求进行横向扩展(水平扩展):

一个分片集群可以包含更多、能买得起的商用服务器,而不是几个非常昂贵的服务器。水平扩展非常适于通过云实例和容器进行弹性供应。

1.2将所有组合在一起

1.2.1生成或创建键

MongoDB要求每个文档必须有唯一标识符;在MongoDB中,该标识符被称为id。

除非为该字段指定某个值,否则MongoDB将自动创建唯一值。MongoDB是一个分布式数据库,所以其主要目标之一是消除对共享资源的依赖(例如检查主键是否独一无二)。非分布式的数据库通常使用一个简单的主键,例如自动递增的序列号。

MongoDB的默认id格式是一个Objectld,它是一个12字节的唯一标识符,可以独立地在分布式环境中生成。

1.2.2使用键和值

MongoDB不要求每个文档必须含有相同的字段,也不要求同名的字段有相同类型的值。如果MongoDB中不含某个键值对,那它就被认为是不存在的。

1.2.3实现集合

在MongoDB中,集合就是一组类似元素的集合。其中的元素不必相似(MongoDB本质上是非常灵活的);不过,当我们开始学习索引和高级查询时,就会看到在集合中放置类似元素的优点。可以在一个集合中混合各种不同的元素,但几乎没有必要这么做。

MongoDB的目标是使生活变得轻松,所以你应该按照自己感觉正确的方式去实现。最后但并非最不重要的是,集合可以按需求即时创建。尤其是,在第一次尝试保存文档时,MongoDB将创建引用它的集合。这意味着可以按照需求即时创建集合(但并不是应该这么做)。因为MongoDB也允许动态地创建索引,执行其他数据库级别的命令,所以可以利用该特性构建出一些非常动态的应用。

1.2.4了解数据库

可能理解MongoDB中数据库的最简单方式就是将它看成一个集合的集合。

1.3了解特性列表

1.3.1 WiredTiger

首先,引入了MongoDB的可插拔存储API和WiredTiger,它是一个性能卓越的数据库引擎。

WiredTiger在MongoDB 3.0中引入,是一个可选的存储引擎,现在是MongoDB 3.2的默认存储引擎。WiredTiger本身就使MongoDB达到一个全新水平,取代了内部数据存储和管理的旧MMAP模型。

WiredTiger允许MongoDB更好地优化驻留在内存中的数据和驻留在磁盘上的数据,而没有以前的杂乱溢出。其结果是,对所有用户而言, WiredTiger往往是一个真正的性能增益。

WiredTiger也更好地优化了数据存储在磁盘上的方式,提供了一个内置的压缩API,大大节省了磁盘空间。可以说,在安装了WiredTiger的机器上, MongoDB使数据库迈出了一大步。

1.3.2使用面向文档存储(BSON)

BSON更易于遍历(即浏览),遍历索引页非常快。尽管比起JSON, BSON需要稍微多一些的硬盘空间,但这并不是问题,

MongoDB可跨机器扩展。多占用一点硬盘空间,换来更好的查询和索引性能。

WiredTiger存储引擎支持多个压缩库,默认启用索引和数据压缩。压缩级别默认可以在每个服务器上设置,也可以在每个集合(在创建时)设置。

在存储数据时,较高的压缩级别会使用更多CPU,但可节省大量磁盘空间。使用BSON的第二个关键优点在于,很容易将BSON数据快速转换为编程语言的原生数据格式。如果以纯JSON方式存储数据,就需要添加一个较高级别的转换。

BSON也提供了对JSON的一些扩展 例如,通过BSON可以存储二进制数据,以及处理特定的数据类型。

因此, BSON可以存储任何JSON文档,但有效的BSON文档可能不是有效的JSON,

1.3.8存储二进制数据

GridFS是MongoDB在数据库中存储二进制数据的解决方案。

BSON支持在一个文档中存储最多16MB的二进制数据,这可能已经可以满足你的需求。

GridFS通过在files集合中存储文件的信息(称为元数据)来实现。数据本身被分成多块(称为信息块)存储在chunks集合中。这种方式使数据存储既简单又有扩展性:还使范围操作(例如获取文件的特定部分)变得更简单通常来说,我们将通过编程语言对应的MongoDB驱动来使用GridFS

1.3.9复制数据

MongoDB提供了包含主/从复制特性的安全网络,这种情况下只有一个数据库可以处于活跃状态,并且可以在任何时间写入,

复制集有一台主服务器(类似于主/从复制中的主服务器),它将处理所有来自客户端的请求。因为在指定的复制集中只有一台主服务器,它可以保证所有写入都会被正确处理。当写入操作·发生时,该操作也会被写入主服务器的oplog集合中。oplog集合将被复制到辅助服务器(可能有许多),并帮助它们将数据更新到与主服务器一致的状态。一旦主服务器出现故障,辅助服务器中的某一台将会成为主服务器,并负责处理所有来自客户端的写入请求。应用驱动将自动检测副本集配置或副本集状态的任何更改,根据更新的副本集状态重新连接。为让副本集维护主服务器,大多数健康的副本节点必须能够相互连接。例如,一套3个节点的副本集需要两个健康的节点来维护一个主服务器。

1.3.10实施分片

对于涉及大规模部署的应用, 自动分片可能是MongoDB最重要和最常用的特性。

在自动分片场景中, MongoDB将处理所有数据的分割和重组。它将保证数据进入正确的服务器,并以最高效的方式运行查询和重组结果。

事实上,从开发者的角度看,使用含有数百个分片的MongoDB数据库和使用单个MongoDB数据库并没有区别。与此同时,如果刚刚开始构建第一个基于MongoDB的网站,那么可能单实例MongoDB就足以满足需求

Copyright © 2021-2022 知识猫. All Rights Reserved.