內容簡介
這是國內首本從大型網際網路系統的套用角度探討分散式快取的書籍,包含了原理、框架、架構、案例等多方面的視角。
網際網路系統隨著容量需求的陡增,許多看似簡單的存儲類場景都面臨著巨大的容量和穩定性風險,而其中的大部分都可以通過對快取的合理使用來規避。讀者從對本書的閱讀當中,將會獲得應對這些問題的經驗,也會對分散式快取有一個體系化的認識。
本書內容共分為三個部分,按照從理論到實現,再到實踐的思路撰寫。
首先介紹分散式快取的背景知識,對本書“分散式”和“快取”這兩個關鍵字進行了全面的綜述,作為後續章節敘述的基礎;
第二部分介紹業界主流的快取,關注其原理與實現,囊括了Ehcache、Memcached、Redis、tair、EVCache、Aerospike等六個快取或類快取系統;
最後一部分討論快取在網際網路系統中的實踐,從廣告、社交、新聞、電商、行銷等五類典型的網際網路套用入手,分析它們面臨的性能穩定性問題以及如何利用分散式快取解決這些問題
圖書目錄
讚譽
推薦序1
推薦序2
推薦序3
作者寄語
前言
第1章 快取為王1
1.1 什麼是快取?1
1.2 為什麼使用快取?2
1.2.1 從用戶體驗說起3
1.2.2 關於系統的性能3
1.3 從網站的架構發展看快取4
1.4 客戶端快取5
1.4.1 頁面快取6
1.4.2 瀏覽器快取7
1.4.3 APP上的快取8
1.5 網路中的快取11
1.5.1 Web代理快取11
1.5.2 邊緣快取12
1.6 服務端快取14
1.6.1 資料庫快取14
1.6.2 平台級快取16
1.6.3 套用級快取18
第2章 分散式系統理論24
2.1 分散式系統概論24
2.2 分散式系統概念26
2.2.1 進程與執行緒26
2.2.2 並發26
2.2.3 鎖26
2.2.4 並行27
2.2.5 集群27
2.2.6 狀態特性28
2.2.7 系統重發與冪等性28
2.2.8 硬體異常30
2.3 分散式系統理論31
2.3.1 CAP理論32
2.3.2 CAP理論澄清34
2.3.3 Paxos35
2.3.4 2PC38
2.3.5 3PC39
2.3.6 Raft40
2.3.7 Lease機制41
2.3.8 解決“腦裂”問題43
2.3.9 Quorum NWR44
2.3.10 MVCC45
2.3.11 Gossip46
2.4 分散式系統設計策略49
2.4.1 心跳檢測50
2.4.2 高可用設計50
2.4.3 容錯性52
2.4.4 負載均衡53
2.5 分散式系統設計實踐54
2.5.1 全局ID生成54
2.5.2 哈希取模56
2.5.3 一致性哈希57
2.5.4 路由表58
2.5.5 數據拆分58
第3章 動手寫快取60
3.1 快取定義的規範60
3.1.1 新規範的主要內容及特性60
3.1.2 新規範的API介紹61
3.2 快取框架的實現62
3.2.1 前期準備63
3.2.2 快取的架構介紹63
3.2.3 設計思路以及知識點詳解64
3.3 快取框架的使用示例74
第4章 Ehcache與Guava Cache76
4.1 Ehcache的主要特性76
4.2 Ehcache使用介紹77
4.2.1 Ehcache架構圖77
4.2.2 快取數據過期策略78
4.2.3 Ehcache快取的基本用法81
4.2.4 在Spring中使用Ehcache83
4.3 Ehcache集群介紹85
4.3.1 集群的方式86
4.3.2 如何配置集群88
4.4 Ehcache的適用場景89
4.5 Guava Cache的使用92
4.5.1 Guava Cache的適用場景92
4.5.2 Guava Cache的創建方式93
4.5.3 快取數據刪除95
4.5.4 並發場景下的使用95
4.6 本章小結96
第5章 從Memcached開始了解集中式快取97
5.1 Memcached基本知識98
5.1.1 Memcached的操作命令98
5.1.2 Memcached使用場景100
5.1.3 Memcached特徵100
5.1.4 Memcached的一些問題101
5.2 Memcached記憶體存儲102
5.2.1 Slab Allocation機制102
5.2.2 使用 Growth Factor進行調優104
5.2.3 Item105
5.3 典型問題解析106
5.3.1 過期機制106
5.3.2 哈希算法107
5.3.3 熱點問題108
5.3.4 快取與資料庫的更新問題108
5.3.5 別把快取當存儲109
5.3.6 命名空間110
5.3.7 CAS110
5.4 Memcached客戶端分析110
5.4.1 Memcached的Client111
5.4.2 Spymemcached設計思想解析111
5.5 Memcached周邊工具發展117
第6章 Memcached 周邊技術119
6.1 Twemcache119
6.1.1 Twemcache 的設計原理120
6.1.2 Twemcache的安裝及命令行詳解122
6.1.3 基於Java的Twemcache用法125
6.2 Twemproxy126
6.2.1 Twemproxy的常用部署模式127
6.2.2 Twemproxy的可擴展性129
6.2.3 Twemproxy原始碼簡析131
6.3 Mcrouter137
6.3.1 Mcrouter路由算法138
6.3.2 典型的使用場景139
6.3.3 Mcrouter的可擴展性142
6.3.4 源碼簡要解析144
第7章 Redis探秘148
7.1 數據結構148
7.1.1 value對象的通用結構149
7.1.2 String149
7.1.3 List152
7.1.4 Map155
7.1.5 Set157
7.1.6 Sorted-Set159
7.2 客戶端與伺服器的互動160
7.2.1 客戶端/伺服器協定161
7.2.2 請求/回響模式163
7.2.3 事務模式164
7.2.4 腳本模式168
7.2.5 發布/訂閱模式169
7.3 單機處理邏輯171
7.3.1 多路復用171
7.3.2 定時任務處理173
7.4 持久化174
7.4.1 基於全量模式的持久化174
7.4.2 基於增量模式的持久化176
7.4.3 基於增量模式持久化的最佳化178
第8章 分散式Redis180
8.1 水平拆分(sharding)181
8.1.1 數據分布181
8.1.2 請求路由182
8.2 主備複製(replication)182
8.2.1 主備複製流程183
8.2.2 斷點續傳183
8.3 故障轉移(failover)184
8.3.1 sentinel間的相互感知185
8.3.2 master的故障發現186
8.3.3 failover決策186
8.4 Redis Cluster187
8.4.1 拓撲結構187
8.4.2 配置的一致性188
8.4.3 sharding190
8.4.4 failover193
8.4.5 可用性和性能196
第9章 Tair探秘198
9.1 Tair總體架構198
9.2 Config Server簡介199
9.3 Data Server簡介201
9.4 Tair高可用和負載均衡204
9.4.1 對照表204
9.4.2 數據遷移219
9.5 存儲引擎220
9.6 Tair的API222
9.6.1 key/value相關API223
9.6.2 prefix相關的API226
第10章 EVCache探秘229
10.1 EVCache項目介紹230
10.1.1 EVCache的由來231
10.1.2 EVCache的發展232
10.1.3 EVCache的演進234
10.2 EVCache 的使用場景238
10.2.1 典型用例238
10.2.2 典型部署239
10.3 EVCache的性能240
10.3.1 EVCache集群的性能240
10.3.2 全局化複製時的性能問題242
10.3.3 Moneta項目中的組件性能243
10.4 EVCache 的高可用性244
10.4.1 AWS的多可用區244
10.4.2 EVCache對AWS高可用性的增強245
10.5 源碼與示例245
10.5.1 源碼淺析245
10.5.2 EVCache 示例253
第11章 Aerospike原理及廣告業務套用259
11.1 Aerospike架構259
11.2 Aerospike具體實現261
11.2.1 Aerospike集群管理261
11.2.2 數據分布263
11.3 Aerospike集群配置和部署265
11.3.1 搭建集群的方式與配置266
11.3.2 部署集群267
11.4 Aerospike與Redis的對比271
11.5 Aeropsike在廣告行業的具體套用272
11.5.1 Aerospike在個性化推薦廣告中的套用273
11.5.2 Aerospike在實時競價廣告中的套用274
第12章 社交場景架構進化:從資料庫到快取283
12.1 社交業務示例283
12.1.1 業務模型283
12.1.2 業務場景284
12.1.3 業務特點285
12.2 關係(relation)的存儲286
12.2.1 基於DB的最簡方案286
12.2.2 DB的sharding方案288
12.2.3 引入快取290
12.2.4 快取的最佳化方案292
12.3 帖子(post)的存儲293
12.3.1 基於DB的方案294
12.3.2 引入服務端快取296
12.3.3 本地快取297
12.4 時間線(timeline)的存儲297
12.4.1 基於DB的方案—push模式298
12.4.2 基於DB的方案—pull模式300
12.4.3 增量查詢引入服務端快取302
第13章 快取在社交網路Feed系統中的架構實踐304
13.1 Feed系統架構304
13.2 Feed快取模型307
13.3 Feed快取架構的設計309
13.3.1 簡單數據類型的快取設計310
13.3.2 集合類數據的快取設計312
13.3.3 其他類型數據的快取設計314
13.4 Feed快取的擴展 315
13.4.1 Redis的擴展315
13.4.2 計數器的擴展316
13.4.3 存在性判斷的擴展318
13.5 Feed快取的服務化319
第14章 典型電商套用與快取324
14.1 電商類套用的挑戰及特點324
14.2 套用數據靜態化架構高性能單頁Web套用325
14.2.1 整體架構326
14.2.2 CMS系統326
14.2.3 前端展示系統328
14.2.4 控制系統328
14.3 套用多級快取模式支撐海量讀服務329
14.3.1 多級快取介紹329
14.3.2 如何快取數據331
14.3.3 分散式快取與套用負載均衡332
14.3.4 熱點數據與更新快取334
14.3.5 更新快取與原子性336
14.3.6 快取崩潰與快速修復336
14.4 構建需求回響式億級商品詳情頁337
14.4.1 商品詳情頁前端結構338
14.4.2 單品頁技術架構發展338
14.4.3 詳情頁架構設計原則343
14.4.4 遇到的一些問題349
第15章 同程鳳凰快取系統基於Redis的設計與實踐357
15.1 同程鳳凰快取系統要解決什麼問題357
15.1.1 Redis用法的凌亂358
15.1.2 從實際案例再看Redis的使用360
15.1.3 如何改變Redis用不好的誤區362
15.1.4 鳳凰快取系統對Redis系統化改造364
15.2 用好Redis先運維好它366
15.2.1 傳統的Redis運維方式366
15.2.2 Redis的Docker化部署368
15.2.3 鳳凰快取系統對Redis的監控369
15.2.4 鳳凰快取系統對Redis的集群分片最佳化370
15.2.5 客戶端在運維中的作用371
15.2.6 鳳凰快取系統在Redis運維上的工具372
15.3 鳳凰快取系統的使用效果373
第16章 新的旅程374
16.1 更好的引入快取技術374
16.1.1 快取引入前的考量374
16.1.2 快取組件的選擇375
16.1.3 快取架構的設計376
16.1.4 快取系統的監控及演進377
16.2 快取分類總結377
16.3 快取知識結構更多Tips378
16.3.1 快取使用模式379
16.3.2 快取協定379
16.3.3 快取連線池380
16.3.4 幾個關注點383
16.3.5 管理快取387
16.3.6 快取可用性390
16.3.7 數據一致性392
16.3.8 熱點數據處理393
16.3.9 注意事項Tips396