可伸縮服務架構-框架與中間件(讀書筆記二)

個人經營的讀書打卡羣,一衆志同道合的人,聚在一個羣裏,每天至少閱讀15分鐘,然後拍照或截屏在羣裏打卡,同時,簡短的分享一下自己的心得,日復一日,月復一月,我們終將發現閱讀的力量。歡迎喜歡閱讀的你加入(加入時需要推薦2本自己閱讀的書才能入羣,以表示你確實在閱讀)

限100人以內,羣二維碼:

以下爲正文:

第五章 大數據利器之Elasticsearch

 

5.1、Lucene介紹

Lucent採用了基於倒排表的設計原理,可以非常高效地實現文本查找,在底層採用了分段的存儲模式,使他在讀寫時幾乎完全避免了鎖的出現,大大提升了讀寫性能。

5.1.1、核心模塊

— analysis模塊:分詞

— index模塊:建索引

— store模塊:負責索引讀寫

— queryParser:語法分析

— search模塊:對索引的搜索

— similarity模塊:負責相關性打分和排序的實現

 

5.1.2、核心術語

— Term:單詞,索引裏最小的存儲和查詢單元

— 詞典:Term的集合,詞典的數據結構有HashMap(性能高,浪費空間),fst(finite-state transducer)有更好的數據壓縮和查詢效率

— 倒排表:記錄的是某個詞在哪些文章出現過

— 正向信息:原始的文檔信息,可以用來做排序、聚合、展示

— 段:索引中最小的存儲單元,只讀不能寫

 

5.1.3、檢索方式

1、單詞查詢

2、AND

3、OR

4、NOT

 

5.1.4、分段存儲

段不變性的有點:

— 不需要鎖

— 可以常駐內存

— 緩存友好

— 增量創建

段不變性的缺點:

— 刪除時,舊數據不會立即被刪除,而是標記爲.del,等到段更新時才真正的刪除

— 更新由刪除和新增組成

— 由於索引具有不變性,每次新增數據時,都需要新增一個段來存儲數據

— 查詢出來的數據需要對已刪除的數據進行過濾

 

爲了提升寫的性能,Lucene採用了延遲寫的策略。先寫內存,然後批量寫入磁盤,若有一個段被寫到磁盤,則生成一個提交點。

 

5.1.5、段合併策略

爲了控制所有裏段的數量,我們必須定期進行段的合併操作

 

5.1.6、Lucene相似度打分

1、文本相似度的主要影響因子

— tf:詞頻,其值越大,這篇文章描述的內容與該詞越接近

— idf:(inverse document frequency),表示整個文檔包含某個詞的文檔數量越少,這個便越重要

— length:同等條件下,搜索詞所在的文檔長度越長,搜索詞和文檔的相似度就越低;文檔長度越短,相似度就越高

 

— term boost:查詢在語句中每個詞的權重

— document boost:文檔權重

— field boost:域的權重,就是字段權重

— query boost:查詢條件的權重

 

2、基於向量空間模型

向量空間模型的主要思路是把文本信息映射到空間向量中,形成文本信息和向量數據的映射關係,然後通過計算幾個或者多個不同的向量的差異,來計算文本的相似度

3、基於概率的模型

BM25算法是根據BIM算法改進而來的,目前爲止,是優秀的排名算法

 

5.2、Elastisearch簡介

5.2.1、核心概念

— Cluster:集羣

— Node

— Shards:分片

— Replicas:副本

— Index:索引

— Type:類別

— Document:文檔

— Settings:集羣中索引的定義

— Mapping,類似關係數據庫的表結構信息

— Analyzer:字段的分詞方式的定義

 

Elastic search的節點分類如下:

— 主節點,負責創建索引、刪除索引、分配分片、追蹤集羣中的節點狀態

— 數據節點,負責數據的存儲和相關具體操作,如索引的創建、修改、刪除、搜索、聚合

— 客戶端節點,既不是候選主節點也不是數據節點的節點

— 部落節點,跨越多個集羣

— 協調節點,任何節點都可以成爲協調節點

 

集羣的狀態有紅黃綠三種。

 

5.2.2、3C和腦裂

1、共識性(Consensus),分佈式系統中所有節點必須對給定的數據或者節點的狀態達成共識(zen discovery)

2、併發(Concurrency),

— 樂觀併發控制(OCC),解決寫-寫衝突的無鎖併發控制

— 多版本併發控制:使用版本號控制

3、一致性(Consistency)

三種允許寫操作的判斷

— One:只要主分片可用,就寫

— All:只有當主分片和所有副本都可用時,才允許寫操作

— Quorum:默認選項,一半以上節點可用就寫

 

4、腦裂

集羣中出現多個主節點時,可能會丟失數據,這種現象稱爲腦裂

 

5.2.3、事務日誌

內存裏的日誌不可搜索,文件系統裏的日誌可以搜索

 

第六章 全面揭祕分佈式定時任務

 

6.1、什麼是定時任務

常用定時任務

1、crontab命令

Linux下的任務調度分爲兩類,系統任務調度和用戶任務調度

— 系統任務調度:操作系統保存一個針對整個系統的crontab文件,該文件通常存放於/etc或者/etc的子目錄下面

— 用戶任務調度:每個用戶都有自己的crontab文件,所有用戶定義的文件都存放於/var/spool/cron目錄中,文件名與用戶名一致

crontab配置文件格式說明:

# *  *  *  *  *  command

# |  |   |  |   |   |

# |  |   |  |   |   --要執行的命令

# |  |   |  |   —星期(0-7,星期日爲0或7)

# |  |   |  —月(1-12)

# |  |   —日(1-31)

# |  —小時(0-23)

# —分鐘(0-59)

 

— 以逗號隔開表示一個列表範圍

— 連字符,指定值得範圍

— 星號,代表任何的值

— 正斜線,指定時間的頻率

 

— -u 設定某個用戶的crontab文件

— file,命令文件的名稱

— -e 編輯某個用戶的crontab文件

— -l 用於顯示某個用戶的crontab文件

— -r 用於刪除某個用戶的crontab文件

— -i  用於在刪除用戶crontab文件時給出提示

 

2、JDKTimer

是一個單線程,定時調度所有TimerTask任務

Timer類的主要函數:Timer,schedule,然後重新run方法

 

Timer類的缺陷:

— 時間不準確延遲

— 異常終止

— 執行週期任務時依賴系統時間

 

3、ScheduleExecutor

每個調度任務都會有線程池中的一個線程去執行,因此任務是併發執行的。

ScheduleExecutor與Timer相比:

— 可以解決Timer不準時延遲的問題

— 多線程併發,能做到線程隔離

— 不依賴系統時間的變化而發生執行上的變化

— 執行過程中拋出異常,就會停止

 

4、Spring Schedule

主要包括TaskExecutor、TaskSchedule、Trigger三個抽象接口

 

 

5、Quartz,開源項目

框架的核心對象如下:

— Job,表示一個工作,爲要執行的具體內容

— JobDetail,任務調度細節

— Trigger,執行任務的規則

— Schedule,代表一個任務調度容器

 

6、cron表達式

在線表達式工具(http://www.pppet.net)

 

6.2、分佈式定時任務

6.2.1、定時任務使用場景

— 業務需求

— 產品運營

— 運維管理

 

6.2.2、傳統定時任務存在的問題

1、只在一臺服務器上運行

2、通過配置參數分散運行

3、通過全局鎖互斥執行

 

6.2.3、分佈式定時任務及其原理

分佈式定時任務特點:

— 高可用性

— 可伸縮性

— 負載均衡

— 失效轉移

 

分佈式鎖有3種實現方式

— 基於數據庫的實現方式,依靠數據庫的全局索引實現

— 基於Redis的實現方式

— 基於zookeeper的實現方式

1、永久節點

2、臨時節點

3、順序節點

 

6.3、開源分佈式定時任務的用法

6.3.1、Quartz的分佈式模式

6.3.2、TBSchedule(阿里巴巴開源的分佈式調度框架)

6.3.3、Elastic-Job

噹噹網開源的分佈式調度解決方案

第七章 RPC服務的發展歷程和對比分析

7.1、什麼是RPC服務

RPC協議是一種通過網絡向遠程計算機請求服務,而不需要了解底層網絡技術的協議。

RPC有以下優勢:

— 簡單

— 高效

— 通用

 

7.2、RPC的服務原理

7.2.1、Socket套接字

雙向通信

7.2.2、RPC的調用過程

step1 客戶端調用本地的客戶端存根方法

step2 客戶端存根通過系統調用,使用操作系統內核套接字向遠程服務發送編碼的網絡消息

step3 網絡消息由內核通過TCP/UDP傳輸到遠程服務器

step4 服務端存根接收客戶端消息,並對消息進行解碼

step5 服務端存根調用服務端方法,並將從客戶端接收到的參數傳遞給該方法

step6 服務端執行完成後,把返回結果存入服務端存根代碼中

step7 服務端存根將返回值編碼並序列化後,通過一個或多個網絡消息返回給客戶端

step8 消息通過網絡傳輸給客戶端

step9 客戶端從本地存根讀取本地套接字消息

step10 客戶端存根將消息返回給客戶端函數,並將消息從網絡二進制轉換爲本地語言格式

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章