海量數據讀寫方式選擇
高并發讀寫場景分析
????????無論任何業務系統,無非就是兩個操作:寫和讀。 在海量數據和高并發的場景下,寫和讀就會成為系統性能的瓶頸。下面分析不同業務場景下面臨的問題:
側重“高并發讀”的系統
- 場景1:搜索引擎。 C端用戶包括網頁發布者(寫)和網頁搜索者(讀), 但是讀和寫明顯不是一個數量級。
- 場景2:電商的商品搜索。?
- 場景3:電商的商品詳情
側重“高并發寫”的系統
場景1:廣告扣費系統。?
?????????廣告通常要么按瀏覽付費,要么按點擊付費(業界叫作 CPC或 CPM)。具體來說,就是廣告主在廣告平臺開通一個賬號,充一筆錢進去,然后投放自己的廣告。C端用戶看到了這個廣告后,可能點擊一次扣一塊錢(CPC);或者瀏覽這個廣告,瀏覽1000次扣10塊(CPM)。
????????扣款要盡可能實時,如果慢扣了, 就可能造成廣告主沒有錢了,但是廣告仍在播放。
同時側重“高并發讀寫”的系統
- 場景1:秒殺系統
- 場景2: 12306網站的火車售賣
- 場景3:支付系統和微信紅包。 用戶需要實時查看自己的余額,這個值需要實時并且準確;另外,在轉賬場景,A /B兩個用戶余額變動也要盡可能快,并且要求強一致性。
- 場景4:IM、微博、朋友圈。 C端用戶要進行發消息和接受消息。這種用戶規模在億級別,無論讀還是寫,要求處理都要非常及時。
高并發讀策略
本質:以空間換時間
高并發讀的特征:讀寫分析,設計出是和高并發讀的存儲結構或者數據模型。
高并發寫策略
海量數據存儲方式選擇
????????存儲系統(數據結構),往往決定了系統的上限;計算?式(算法)決定了能否發揮這個上限以及系統的下限。
選擇時考慮的因素
1. 在線業務系統 or 分析系統
2. 數據量:存量和增量,對未來數據量可以考慮兩三年的業務量
- 1GB以下:任意存儲
- 1~10GB(1億內):單機存儲系統的處理上限
- 10GB以上:分布式存儲
- TB : ?般需要事先對數據做聚合計算
3.成本:運維成本、學習成本
分析類系統常用的存儲方式
- 一些列式數據庫,比如Hbase、Cassandra、ClickHouse 等
- ES,?為搜索??的存儲產品
????????當數據量級超過TB 級的時候,做數據統計分析,?論使?哪種存儲系統,速度都快不了,這?的性能瓶頸主要在于磁盤IO和?絡帶寬。這么?量級的數據,?般是選擇存儲在HDFS中,配合Spark、 Hive等?數據?態圈產品,對數據進?聚合和計算。
Hadoop:是一個分布式計算的開源框架
HDFS:是Hadoop的三大核心組件之一
Hive:用戶處理存儲在HDFS中的數據,hive的意義就是把好寫的hive的sql轉換為復雜難寫的map-reduce程序。
Hbase:是一款基于HDFS的數據庫,是一種NoSQL數據庫,主要適用于海量明細數據(十億、百億)的隨機實時查詢,如日志明細、交易清單、軌跡行為等。
RocksDB
????????RocksDB是Facebook開源的?個?性能、持久化的KV存儲引擎。簡單理解成單機版的Redis.
????????Redis只是?個內存數據庫,并不是?個可靠的存儲引擎。在 Redis 中,數據寫到內存中就算成功了,其并不能保證將數據安全地保存到磁盤上。? RocksDB則是?個持久化的KV存儲引擎,它需要保證每條數據都已安全地寫到磁盤上。
????????RocksDB采?了?個?常復雜的數據存儲結構(數據結構LSM-Tree),采?了內存和磁盤混合存儲的?式,它使?磁盤來保證數據的可靠存儲的,并且會利?速度更快的內存來提升讀寫性能。
- MemTable(內存)有?個固定的上限??,?般是32MB; SSTable容量也是有限的。
- Log : 順序寫磁盤,對應的磁盤WAL日志。唯?作?就是從故障中恢復系統數據
有?個后臺線程,不停地把 ImmutableMemTable復制到磁盤?件中,然后釋放內存空間
寫入:MemTable(有序表) ->Immutable MemTable(不允許再寫) ->磁盤文件(SSTable)-> 合并到下一層(并刪除已合并的SSTable)
查找:分層查找。MemTable/Immutable MemTable -> SSTable -> 下一層SSTable
ES檢索
????????ElasticSearch(簡稱ES)是一個分布式、RESTful 風格的搜索和數據分析引擎,是用Java開發并且是當前最流行的開源的企業級搜索引擎,能夠達到近實時搜索,穩定,可靠,快速,安裝使用方便。客戶端支持Java、.NET(C#)、PHP、Python、Ruby等多種語言。
應用場景
- 站內搜索
- 日志管理與分析
- 大數據分析
- 應用性能監控
- 機器學習
站內檢索使用步驟
1. 確定業務檢索內容
????????比如,商城首頁,根據關鍵字查詢、根據品牌查詢、商品類別、商品屬性信息、價格區間、是否有庫存、排序(銷量、價格、上架時間等)
2. 文檔建模
- 確定要做分詞的字段,分詞器
- 確定keyword(不需要分詞)
- 商戶與屬性的關聯關系
3. 定義mapping, 創建索引庫
4. 索引文檔(檢索文檔)