圖書前言
“數據是21世紀最有價值的資產,它比黃金和石油更有價值”。隨著大數據時代的來臨,傳統的關係型資料庫在可擴展性、數據模型和可用性方面遇到了難以克服的障礙。此時各種NoSQL系統出現了。它們的特點各不相同,分別套用於不同的場景並迅速取得了巨大的成功。作為一名從事後台開發多年的工作者,我對每一種新技術的出現與套用都充滿了渴望與期待,其中NoSQL解決了我實際工作中遇到的許多問題。NoSQL具有下面幾方面的優點:
1.靈活的可擴展性
多年以來,資料庫管理員們都是通過“垂直擴展”的方式(當資料庫的負載增加的時候,購買更大型的伺服器來承載增加的負載)來進行擴展的,而不是通過“水平擴展”的方式(當資料庫負載增加的時候,在多台主機上分配增加的負載)來進行擴展。但是,隨著請求量和可用性需求的增加,資料庫也正在遷移到雲端或虛擬化環境中,“水平擴展”的經濟優勢變得更加明顯了,對各大企業來說,這種“誘惑”是無法抗拒的。
要對RDBMS(關係型資料庫,比如Oracle)做“水平擴展”,並不是很容易。但是各種新類型的NoSQL資料庫主要是為了進行透明的擴展,來利用新節點而設計的,而且,它們通常都是為了低成本的commodity hardware而設計的。
2. 輕鬆應對海量數據
在過去的十年里,正如請求量發生了翻天覆地的增長一樣,需要存儲的數據量也發生了急劇的膨脹。為了滿足數據量增長的需要,RDBMS的容量也在日益增加,但是,對一些企業來說,隨著請求量的增加,單一資料庫能夠管理的數據量也變得越來越讓人無法忍受了。現在,大量的“大數據”可以通過NoSQL系統(如MongoDB)來處理,它們能夠處理的數據量遠遠超出了最大型的RDBMS所能處理的極限。
3. 維護簡單
在過去的幾年裡,雖然一些RDBMS供應商們聲稱在可管理性方面做出了很多的改進,但是高端的RDBMS系統維護起來仍然十分昂貴,而且還需要訓練有素的DBA們的協助。DBA們需要親自參與高端的RDBMS系統的設計、安裝和調優。
NoSQL資料庫從一開始就是為了降低管理方面的要求而設計的:從理論上來說,自動修復,數據分配和簡單的數據模型的確可以讓管理和調優方面的要求降低很多。
4. 經濟
NoSQL資料庫通常使用廉價的SCommodity ervers集群來管理膨脹的數據和請求量,而RDBMS通常需要依靠昂貴的專有伺服器和存儲系統來做到這一點。使用NoSQL,每GB的成本或每秒處理的請求的成本都比使用RDBMS的成本少很多,這可以讓企業花費更低的成本存儲和處理更多的數據。
5. 靈活的數據模型
對於大型的生產性RDBMS來說,變更管理是一件很令人頭痛的事情。即使只對一個RDBMS的數據模型做出很小的改動,也必須要十分小心的管理,也許還需要停機或降低服務水平。NoSQL資料庫在數據模型約束方面是更加寬鬆的,甚至可以說並不存在數據模型的約束。NoSQL的Key/Value資料庫和文檔型資料庫可以讓應用程式在一個數據元素里存儲任何結構的數據。即使是規定更加嚴格的基於“大表”的NoSQL資料庫(如HBase)通常也允許創建新列,這並不會造成什麼麻煩。
應用程式變更和資料庫模式的變更並不需要作為一個複雜的變更單元來管理。從理論上來說,這可以讓應用程式疊代的更快,但是,很明顯,如果應用程式無法維護數據的完整性,那么這也會帶來一些不良的副作用。
本書的誕生
在當前的圖書市場上,還沒有一本全面而深入介紹NoSQL系統的圖書。要么只有理論內容並且大部分並不全面,要么千篇一律把某個NoSQL系統的操作一一羅列。為了讓眾多的NoSQL學習人員能夠更加全面和深入地學習NoSQL技術,筆者編寫了本書。本書從系統的角度出發,既深入講解NoSQL的產生原因與理論基礎,又對三種典型NoSQL系統引入了豐富的實戰,使讀者可以全面而深入地了解各種NoSQL,知道各個NoSQL和MySQL系統的聯繫和不同,在實際中根據自己的情況進行正確的技術選型。
圖書特色
1.內容全面、新穎
本書內容全面而新穎,既對NoSQL系統的理論進行了深入淺出的分析,又深入講解了列式的、Key/Value的和文檔類型這三種NoSQL系統,最後還講解了MySQL的性能 最佳化。
2.講解由淺入深,循序漸進
本書是一本入門圖書,如果你從來沒有用過NoSQL系統,那么本書正好適合你。本書也是一本深入講解NoSQL的圖書,它將各種NoSQL系統聯繫起來並分析各自的相同點和不同點,讀完之後你一定會對NoSQL系統有一個高屋建瓴的認識。
3.理論與實踐並重
本書對NoSQL系統的產生原因和理論基礎做了廣泛而深入的分析,讓讀者知其然,更知其所以然。書中盡力消除初學者學習NoSQL系統時容易遇到的障礙,變抽象為具體,變複雜為簡單。而且重點對Hadoop/HBase、MongoDB和Redis這三種NoSQL系統都給出了具體實踐。
4.圖文並茂,容易理解
本書針對NoSQL系統中的一些架構和較難理解的概念,提供了大量的插圖,並結合具體文字來講解,非常直觀,更有利於讀者的學習與理解。
5.語言通俗易懂
本書不使用那些讓人難以理解的語言來分析問題,而是採用通俗易懂的語言去講解NoSQL系統的相關知識,讓讀者能夠真正了解NoSQL技術,繼而在開發中使用這些技術。
內容介紹
第1篇 NoSQL的興起與理論基礎(第1~3章)
本篇介紹了大數據時代NoSQL的興起原因及NoSQL的理論基礎,包括NoSQL與大數據簡介,NoSQL系統的分類和特點,各種數據一致性模型的定義、原理、實現、舉例及適用場景,NoSQL系統水平擴展的方法,主要是複製和分區技術的難點、在實際系統中的運用及和數據一致性的關係,最後簡單介紹了其他雜項知識比如五分鐘法則等。這些內容都是學習後續章節所必須要掌握的基礎知識,後續章節中的實際NoSQL系統如Redis可以看成是這些理論知識的運用。
第2篇 列式NoSQL系統(第4、5章)
本篇主要介紹了列式NoSQL系統。首先以Google的BigTable為例介紹了列式NoSQL系統的特點、原理和套用。然後實戰演練開源的HBase系統。由於HBase與Hadoop、Zookeeper等有著十分密切的關係,因此對其一併進行了介紹。
第3篇 Key/Value NoSQL系統(第6~8章)
本篇主要介紹了Key/Value NoSQL系統。首先以Amazon的Dynamo為例介紹了Key/Value系統的特點、原理和套用場景,並詳細描述了這個系統是如何運用本書第1篇中的理論知識而構建的。然後介紹了另一個來自Google的LevelDB系統,最後實戰演練了被廣泛使用的Redis系統。
第4篇 文檔型 NoSQL系統(第9、10章)
本篇主要介紹了文檔型NoSQL系統。首先以CouchDB為例介紹了文檔型NoSQL的特點、原理和套用場景,然後實戰演練了被廣泛使用的MongoDB系統。
第5篇 MySQL基礎與性能最佳化(第11、12章)
本篇主要介紹了目前在網際網路公司被廣泛使用的MySQL關係型資料庫。雖然在大數據時代NoSQL將會占據數據處理技術的主流,但是傳統的MySQL在一些套用場景仍有著自己的優勢。所以本篇開始先介紹了一些MySQL的基礎知識,然後詳細描述了其高級特性,最後介紹了MySQL的性能最佳化、複製技術、垂直擴展、水平擴展和綜合套用。
適用對象
* 沒有基礎的NoSQL初學者;
* 網際網路公司高並發系統的後台開發人員;
* 大數據、NoSQL開發愛好者;
* 剛入職的國中級程式設計師;
* 高等院校師生;
* 相關培訓班的學員。
作者簡介
本書由皮雄軍主筆編寫。其他參與編寫的人員有吳萬軍、項延鐵、謝邦鐵、許黎民、薛在軍、楊佩璐、楊習偉、於洪亮、張寶梅、張功勤、張建華、張建志、張敬東、張倩、張慶利、趙劍川、趙薇、鄭強、周靜、朱盛鵬、祝明慧、張晶晶。
圖書目錄
第1篇 NoSQL的興起與理論基礎
第1章 NoSQL與大數據簡介
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的數據一致性
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的水平擴展與其他基礎知識
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雲計算原理
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
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的高可用鍵值對存儲
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—出自Key-Value資料庫
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實戰
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
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實戰
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基礎
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高級特性與性能最佳化
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 小結 388