第1篇 NoSQL的兴起与理论基础
第1章 NoSQL与大数据简介 2
1.1 引子——NoSQL在国内使用的案例 2
1.1.1 新浪微博 2
1.1.2 淘宝数据平台 3
1.1.3 视觉中国网站 4
1.1.4 优酷运营数据分析 5
1.1.5 飞信空间 6
1.1.6 豆瓣社区 7
1.2 大数据 8
1.2.1 大数据的度量单位 8
1.2.2 大数据的特点 9
1.3 大数据相关技术 10
1.3.1 大数据采集技术 10
1.3.2 大数据预处理技术 11
1.3.3 大数据存储及管理技术 11
1.3.4 大数据分析及挖掘技术 11
1.3.5 大数据展现与应用技术 12
1.4 NoSQL简介 12
1.4.1 什么是NoSQL 12
1.4.2 关系型数据库简史 13
1.4.3 数据库分类 13
1.4.4 关系型数据库的优势 14
1.4.5 不擅长的处理 15
1.4.6 NoSQL数据库 18
1.5 NoSQL数据库的类型 20
1.5.1 键值(Key/Value)存储 20
1.5.2 面向文档的数据库 21
1.5.3 面向列的数据库 22
1.6 如何使用和学习NoSQL数据库 23
1.6.1 始终只是一种选择 23
1.6.2 在何种程度上信赖它 23
1.7 云数据管理 24
第2章 NoSQL的数据一致性 25
2.1 传统关系数据库中的ACID 25
2.1.1 原子性 25
2.1.2 一致性 25
2.1.3 隔离性 26
2.1.4 持久性 26
2.1.5 举例 26
2.2 CAP理论 27
2.2.1 NoSQL系统是分布式系统 27
2.2.2 CAP理论阐述 27
2.3 AP的例子——DNS系统 29
2.3.1 DNS系统 29
2.3.2 DNS域名解析过程 29
2.3.3 DNS系统是最终一致性的 31
2.4 数据一致性模型与BASE 31
2.4.1 数据一致性模型 31
2.4.2 BASE(Basically Available,Soft-state,Eventual consistency) 32
2.5 数据一致性实现方法 33
2.5.1 Quorum系统NRW策略 33
2.5.2 时间戳策略 34
2.5.3 向量时钟 37
第3章 NoSQL的水平扩展与其他基础知识 41
3.1 所有数据存放在一个服务器上 41
3.2 分片(Sharding) 41
3.3 主从复制 43
3.4 对等(Peer To Peer)复制 44
3.5 复制和分片的同时使用 45
3.6 数据水平扩展的方法总结 46
3.7 分片对数据的划分方式 46
3.7.1 Range-Based Partitioning 47
3.7.2 Round-Robin 49
3.8 一致性hash算法(Consistent Hashing) 50
3.8.1 基本场景 51
3.8.2 hash算法和单调性 51
3.8.3 Consistent Hashing算法的原理 51
3.8.4 虚拟节点 54
3.9 磁盘的读写特点及五分钟法则 55
3.9.1 磁道、扇区、柱面和磁头数 56
3.9.2 固态硬盘(SSD):随机读写速度快 57
3.9.3 内存:读写速度极快 57
3.9.4 五分钟法则 57
3.10 不要删除数据 58
第2篇 列式NoSQL系统
第4章 BigTable与Google云计算原理 60
4.1 云计算 60
4.1.1 云计算的概念 60
4.1.2 云计算发展现状 63
4.1.3 云计算实现机制 64
4.1.4 网格计算与云计算 66
4.2 Google文件系统GFS 68
4.2.1 系统架构 69
4.2.2 容错机制 71
4.2.3 系统管理技术 72
4.3 并行数据处理MapReduce 73
4.3.1 产生背景 73
4.3.2 编程模型 73
4.3.3 实现机制 74
4.4 分布式锁服务Chubby 78
4.4.1 Paxos算法 78
4.4.2 Chubby系统设计 79
4.4.3 Chubby文件系统 80
4.4.4 通信协议 82
4.4.5 正确性与性能 83
4.5 分布式结构化数据表BigTable 84
4.5.1 设计动机与目标 85
4.5.2 数据模型 85
4.5.3 系统架构 87
4.5.4 主服务器 88
4.5.5 子表服务器 89
4.5.6 性能优化 92
第5章 Google云计算的开源版本——Hadoop 94
5.1 Hadoop简介 94
5.1.1 Hadoop发展史 94
5.1.2 Apache Hadoop项目及体系结构 96
5.2 Hadoop产生的原因 97
5.2.1 海量的数据 97
5.2.2 数据的存储和分析 98
5.3 Hadoop和其他系统的比较 99
5.3.1 和关系型数据库管理系统(RDBMS)的比较 99
5.3.2 和网格计算的比较 100
5.4 HDFS的架构设计 101
5.4.1 前提和设计目标 102
5.4.2 Namenode和Datanode 102
5.4.3 文件系统的Namespace 103
5.4.4 数据复制 103
5.4.5 文件系统元数据的持久化 104
5.4.6 通讯协议 105
5.4.7 健壮性 105
5.4.8 数据组织 106
5.4.9 可访问性 107
5.4.10 空间的回收 107
5.5 安装Hadoop 108
5.5.1 安装JDK 1.7 108
5.5.2 安装Hadoop 109
5.6 HDFS操作 113
5.6.1 使用FS Shell命令操作HDFS 113
5.6.2 编程读写HDFS 118
5.7 Hadoop中的MapReduce模型 119
5.7.1 MapReduce计算模型 119
5.7.2 Hadoop中的Hello World程序 120
5.7.3 运行MapReduce程序 124
5.7.4 Hadoop中的Hello World程序——新的API 125
5.7.5 MapReduce的数据流和控制流 127
5.8 Zookeeper 129
5.8.1 Zookeeper配置安装 129
5.8.2 Zookeeper的数据模型 130
5.8.3 Zookeeper的基本使用 131
5.8.4 ZooKeeper 典型的应用场景 133
5.8.5 统一命名服务(Name Service) 133
5.8.6 共享锁(Locks) 136
5.8.7 队列管理 137
5.8.8 Zookeeper总结 139
5.9 HBase 139
5.9.1 简介 139
5.9.2 逻辑视图 139
5.9.3 物理存储 141
5.9.4 系统架构 144
5.9.5 关键算法/流程 146
5.10 HBase的安装和配置 149
5.11 HBase使用例子 151
第3篇 Key/Value NoSQL系统
第6章 Dynamo:Amazon的高可用键值对存储 156
6.1 简介 156
6.2 背景 157
6.2.1 系统假设和要求 158
6.2.2 服务水平协议(SLA) 158
6.2.3 设计考虑 160
6.3 系统架构 161
6.3.1 系统接口 162
6.3.2 划分算法 162
6.3.3 复制 163
6.3.4 版本的数据 163
6.3.5 执行get()和put()操作 165
6.3.6 故障处理:暗示移交(Hinted Handoff) 166
6.3.7 处理永久性故障:副本同步 167
6.3.8 会员和故障检测 167
6.3.9 添加/删除存储节点 169
6.4 实现 169
6.5 Amazon使用的经验与教训 170
6.5.1 平衡性能和耐久性 171
6.5.2 确保均匀的负载分布 172
6.5.3 不同版本:何时以及有多少 175
6.5.4 客户端驱动或服务器驱动协调 176
6.5.5 权衡后台和前台任务 177
6.5.6 讨论 177
6.6 结论 178
第7章 LevelDb——出自Google的 Key-Value数据库 179
7.1 LevelDb简介 179
7.2 LevelDb的静态部分 180
7.2.1 整体架构 180
7.2.2 log文件 182
7.2.3 SSTable文件 183
7.2.4 MemTable详解 186
7.3 LevelDb的动态部分 187
7.3.1 写入与删除记录 187
7.3.2 读取记录 188
7.3.3 Compaction操作 190
7.3.4 LevelDb中的Cache 192
7.3.5 Version、VersionEdit和VersionSet 194
第8章 Redis实战 195
8.1 Redis安装与准备 195
8.1.1 下载与安装 195
8.1.2 配置文件修改 196
8.1.3 启动Redis 197
8.1.4 停止Redis 198
8.2 Redis所支持的数据结构 198
8.2.1 String 199
8.2.2 List 203
8.2.3 Set 207
8.2.4 Hash/哈希/散列 210
8.2.5 有序集合/Zset 213
8.3 Key操作命令 218
8.3.1 概述 218
8.3.2 命令示例 220
8.4 事物 223
8.4.1 事物概述 223
8.4.2 相关命令 223
8.4.3 命令示例 224
8.4.4 WATCH命令和基于CAS的乐观锁 225
8.5 Redis的主从复制 226
8.5.1 Redis的Replication 226
8.5.2 Replication的工作原理 227
8.5.3 如何配置Replication 227
8.5.4 应用示例 228
8.6 Redis的持久化 228
8.6.1 持久化机制 228
8.6.2 RDB机制的优势和劣势 229
8.6.3 AOF机制的优势和劣势 229
8.6.4 其他 230
8.7 Redis的虚拟内存 231
8.7.1 简介 231
8.7.2 应用场景 231
8.7.3 配置 231
8.8 pipeline/管线 233
8.8.1 请求应答协议和RTT 233
8.8.2 管线(pipelining) 233
8.8.3 Benchmark 234
8.9 实例 234
第4篇 文档型NoSQL系统
第9章 面向文档的数据库CouchDB 240
9.1 CouchDB介绍 240
9.1.1 基本概念 240
9.1.2 扩展概念 241
9.2 CouchDB安装与配置 241
9.3 REST API 242
9.3.1 数据库REST API 243
9.3.2 文档REST API 243
9.3.3 视图 REST API 243
9.3.4 附件 REST API 244
9.4 为应用建模 244
9.4.1 描述实体 244
9.4.2 描述一对一和一对多关系 245
9.4.3 描述多对多关系 246
9.5 实战开发 247
9.5.1 开发Web应用 247
9.5.2 使用CouchDB jQuery插件 248
9.5.3 示例应用建模 249
9.5.4 管理文档 250
9.5.5 视图 253
9.6 高级话题 259
9.6.1 权限控制与安全 259
9.6.2 文档更新校验 259
9.6.3 分组 259
9.6.4 键的排序 260
第10章 MongoDB实战 261
10.1 为什么要使用MongoDB 261
10.1.1 不能确定的表结构信息 261
10.1.2 序列化可以解决一切问题吗 261
10.1.3 无需定义表结构的数据库 262
10.2 MongoDB的优势和不足 262
10.2.1 无表结构 262
10.2.2 容易扩展 263
10.2.3 丰富的功能 263
10.2.4 性能卓越 264
10.2.5 简便的管理 264
10.2.6 MongoDB的不足 264
10.3 基本概念 264
10.4 Linux下MongoDB的安装和配置、启动和停止 265
10.4.1 下载 265
10.4.2 安装 266
10.4.3 启动数据库 267
10.4.4 停止数据库 269
10.5 创建、更新及删除文档 270
10.5.1 连接数据库 270
10.5.2 插入记录 270
10.5.3 _id key 272
10.5.4 修改记录 272
10.5.5 删除记录 272
10.6 查询记录 273
10.6.1 普通查询 273
10.6.2 条件查询 274
10.6.3 findOne()语法 274
10.6.4 通过limit限制结果集数量 274
10.7 高级查询 275
10.7.1 条件操作符 275
10.7.2 $all匹配所有 275
10.7.3 $exists判断字段是否存在 276
10.7.4 Null值处理 276
10.7.5 $mod取模运算 276
10.7.6 $ne不等于 277
10.7.7 $in包含 277
10.7.8 $nin不包含 278
10.7.9 $size数组元素个数 278
10.7.10 正则表达式匹配 278
10.7.11 JavaScript查询和$where查询 279
10.7.12 count查询记录条数 279
10.7.13 skip限制返回记录的起点 279
10.7.14 sort排序 280
10.7.15 游标 280
10.8 MapReduce 281
10.8.1 Map 282
10.8.2 Reduce 282
10.8.3 Result 282
10.8.4 Finalize 283
10.8.5 Options 283
10.9 索引 284
10.9.1 基础索引 284
10.9.2 文档索引 285
10.9.3 组合索引 285
10.9.4 唯一索引 285
10.9.5 强制使用索引 286
10.9.6 删除索引 287
10.10 性能优化 287
10.10.1 explain执行计划 287
10.10.2 优化器Profile 288
10.10.3 性能优化举例 289
10.11 性能监控 290
10.11.1 mongosniff 291
10.11.2 Mongostat 292
10.11.3 db.serverStatus 292
10.11.4 db.stats 294
10.11.5 第三方工具 294
10.12 Replica Sets复制集 294
10.12.1 部署Replica Sets 295
10.12.2 主从操作日志oplog 297
10.12.3 主从配置信息 298
10.12.4 管理维护Replica Sets 299
10.12.5 增减节点 301
10.13 Sharding分片 305
10.13.1 建立Sharding Cluster 306
10.13.2 管理维护Sharding 308
10.14 Replica Sets和Sharding的结合 313
10.14.1 创建数据目录 314
10.14.2 配置Replica Sets 314
10.14.3 配置3台Route Process 316
10.14.4 配置Shard Cluster 316
10.14.5 验证Sharding正常工作 317
第5篇 MySQL基础与性能优化
第11章 MySQL基础 320
11.1 CentOS 6.5下MySQL的安装 320
11.2 MySQL基本命令 322
11.3 MySQL数据类型 325
11.3.1 整型 325
11.3.2 浮点型 326
11.3.3 定点数 326
11.3.4 字符串(char,varchar,xxxtext) 326
11.3.5 二进制数据 327
11.3.6 日期时间类型 327
11.3.7 数据类型的属性 327
11.4 创建数据库和表 328
11.5 检索表中的数据 331
11.6 多个表的操作 334
第12章 MySQL高级特性与性能优化 338
12.1 MySQL Server系统架构 338
12.1.1 逻辑模块组成 338
12.1.2 各模块工作配合 341
12.2 存储引擎 343
12.2.1 MySQL存储引擎概述 343
12.2.2 MyISAM存储引擎简介 344
12.2.3 Innodb 存储引擎简介 346
12.3 MySQL中的锁定机制 347
12.3.1 MySQL中锁定机制概述 347
12.3.2 合理利用锁机制优化MySQL 349
12.4 索引与优化 350
12.4.1 选择索引的数据类型 351
12.4.2 索引入门 351
12.4.3 索引的类型 352
12.4.4 高性能的索引策略 353
12.4.5 索引与加锁 358
12.5 MySQL的MyISAM和Innodb的Cache优化 359
12.5.1 MyISAM存储引擎的Cache优化 359
12.5.2 Innodb缓存相关优化 362
12.6 MySQL的复制 364
12.6.1 复制对于可扩展性的意义 364
12.6.2 复制的原理 365
12.6.3 体验MySQL复制 366
12.6.4 复制的常用拓扑结构 370
12.7 可扩展性设计之数据切分 375
12.7.1 何谓数据切分 375
12.7.2 数据的垂直切分 375
12.7.3 数据的水平切分 377
12.7.4 垂直与水平联合切分的使用 379
12.7.5 数据切分及整合方案 381
12.7.6 数据切分与整合中可能存在的问题 386
12.8 小结