ELK的理論雜項知識
- 2019 年 10 月 7 日
- 筆記
區分9200埠口和9300埠
- 9300埠:ES節點之間通訊使用,是TCP協議埠號,ES集群之間通訊埠號
- 9200埠:ES節點 和 外部 通訊使用,暴露ES RESTful介面埠號
倒排索引
ES為什麼那麼快?正是因為ES內部採用了倒排索引。讓我們來看下什麼是倒排索引吧。
什麼是正排索引?
- 源數據
1 我是中國人 2 我是大學生
如果使用正排索引的話,建立索引的過程是這樣的:
切詞結果: 1 我 我是 中國 中國人 2 我 我是 大學 大學生 將切詞結果進行創建索引,保存文章/id。當搜索的時候, 索引庫中如有匹配則返迴文章內容。 不足:通過切詞之後,索引比正文多了。
倒排索引:
1. 我(1:1){0},(2:1){0} 2. 我是(1:1){0},(2:1){0} 3. 中國(1:1){2} 4. 中國人(1:1){2} 5. 大學(2,1){2} 6. 大學生(2,1){2} 解釋: ()中保存的第一個元素是文章id,第二個元素是出現次數。 {} 中保存的是當前分詞在文章中的偏移量。 通過這樣的方式,當我們去搜索的時候。比如搜索『中國』,當拿到中國的時候 就可以看到哪些地方含有中國這兩個字。類似於字典的目錄。
ES的優勢
- 橫向可擴展性: 只需要增加台伺服器,做一點兒配置,啟動一下Elasticsearch就可以併入集群。
- 分片機制 提供更好的分布性:同一個索引分成多個分片(sharding), 這點類似於HDFS的塊機制;分而治之的方式可提升處理效率。
- 高可用 提供複製( replica) 機制,一個分片可以設置多個複製,使得某台伺服器在宕機的情況下,集群仍舊可以照常運行,並會把伺服器宕機丟失的數據資訊複製恢復到其他可用節點上。
- 使用簡單:
- 共需一條命令就可以下載文件,然後很快就能搭建一一個站內搜索引擎。
Elasticsearch應用場景
大型分散式日誌分析系統ELK elasticsearch(存儲日誌)+ logstash(收集日誌) + kibana(展示數據) 大型電商商品搜索系統 網盤搜索引 網站內搜索
Elasticsearch版本控制
為什麼要進行版本控制
為了保證數據再多執行緒操作下的準確性
悲觀鎖和樂觀鎖
- 悲觀鎖:假設會發生並發衝突,屏蔽一切可能違反數據準確性的操作
- 樂觀鎖:假設不會發生並發衝突,只在提交操作是檢查是否違反數據完整性。
內部版本控制和外部版本控制
- 內部版本控制: version自增長,修改數據後,version會自動的加1
- 外部版本控制:為了保持_version與外部版本控制的數值一致
ES基本概念名詞
Cluster
代表一個集群,集群中有多個節點,其中有一個為主節點,這個主節點是可以通過選舉產生的,主從節點是對於集群內部來說的。es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集群外部來說的,因為從外部來看es集群,在邏輯上是個整體,你與任何一個節點的通訊和與整個es集群通訊是等價的。
Shards代表索引分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分布到不同的節點上。構成分散式搜索。分片的數量只能在索引創建前指定,並且索引創建後不能更改。
replicas代表索引副本,es可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。
Recovery代表數據恢復或叫數據重新分布,es在有節點加入或退出時會根據機器的負載對索引分片進行重新分配,掛掉的節點重新啟動時也會進行數據恢復。
logstash 抽取MySQL的數據到ES的配置文件
input { jdbc { jdbc_driver_library => "G:developlogstash-7.3.2binjobmysql-connector-java.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" jdbc_connection_string => "jdbc:mysql://localhost:3306/drugs_manager" jdbc_user => "root" jdbc_password => "root" schedule => "* * * * *" statement => "SELECT * FROM drugs;" use_column_value => true tracking_column_type => "timestamp" tracking_column => "update_time" last_run_metadata_path => "syncpoint_table" } } #output { # stdout { # codec => rubydebug # } #} output { elasticsearch { hosts => ["127.0.0.1"] user => "" password => "" index => "drugs_manager" document_id => "%{id}" } }