Elasticsearch

ELK能夠做什麼?

26 個datanode:

2.4Ghz*8, 42G, 300G *10 RAID5

25種日誌,7天,650億條數據,6萬個字段

單日數據8TB,寫入峯值19萬qps

10個rsyslog/logstash

rsyslog/logstash/kibana都有二次開發

使用人員:故障管理組,客戶端開發,服務端開發,運維

日誌能夠幹什麼?

    1、找問題

    2、安全審計

    3、監控    

其他日誌分析系統:

    splunk  收費,多用在銀行、金融、中石油等。土豪系統


一.簡介 

ElasticSearch是一個基於Lucene構建的開源,分佈式,RESTful搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。支持通過HTTP使用JSON進行數據索引。 

我們建立一個網站或應用程序,並要添加搜索功能,令我們受打擊的是:搜索工作是很難的。我們希望我們的搜索解決方案要快,我們希望有一個零配置和一個完全免費的搜索模式,我們希望能夠簡單地使用JSON通過HTTP的索引數據,我們希望我們的搜索服務器始終可用,我們希望能夠一臺開始並擴展到數百,我們要實時搜索,我們要簡單的多租戶,我們希望建立一個雲的解決方案。Elasticsearch旨在解決所有這些問題和更多的。

1.基於Lucene構建ES 

怎樣在Lucene之上構建一個分佈式、高度伸縮、接近實時的搜索引擎呢? 讓我們回顧一下在搜索引擎(基於lucene)伸縮性這條路上都做了那些嘗試,並且elasticsearch是如何嘗試並去解決這些挑戰的。 

首先我們瞭解下最基礎的理論知識 building blocks (這些理論基礎是構建分佈式近實時搜索引擎的基礎)。 接着我們研究一下到底哪種纔是最佳的分區策略 partitioning (將lucene索引文檔分割到多個分佈式的分片中去)。 然後我們同樣需要決定使用哪種分區複製方式 replication (複製能夠保證系統的高可用以及提高搜索的吞吐)。 最後,我們再看一下事務日誌 transaction log (事務日誌在elasticsearch裏面是一個保證數據一致性的非常酷的功能)。

二.ElasticSearch概念

1.Cluster(集羣) 

代表一個集羣,集羣中有多個節點,其中有一個爲主節點,這個主節點是可以通過選舉

產生的,主從節點是對於集羣內部來說的。es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集羣外部來說的,因爲從外部來看es集羣,在邏輯上是個整體,你與任何一個節點的通信和與整個es集羣通信是等價的。 

2.Node(節點) 

一個節點是你集羣中的一個服務器,作爲集羣的一部分,它存儲你的數據,參與集羣的索引和搜索功能。和集羣類似,一個節點也是由一個名字來標識的,默認情況下,這個名字是一個隨機的漫威漫畫角色的名字,這個名字會在啓動的時候賦予節點。這個名字對於管理工作來說挺重要的,因爲在這個管理過程中,你會去確定網絡中的哪些服務器對應於Elasticsearch 集羣中的哪些節點。 

一個節點可以通過配置集羣名稱的方式來加入一個指定的集羣。默認情況下,每個節點都會被安排加入到一個叫做“elasticsearch”的集羣中,這意味着,如果你在你的網絡中啓動了若干個節點,並假定它們能夠相互發現彼此,它們將會自動地形成並加入到一個叫做“elasticsearch”的集羣中。 

在一個集羣裏,只要你想,可以擁有任意多個節點。而且,如果當前你的網絡中沒有運行任何Elasticsearch節點,這時啓動一個節點,會默認創建並加入一個叫做“elasticsearch”的集羣。 

3.index(索引) 

一個索引就是一個擁有幾分相似特徵的文檔的集合。比如說,你可以有一個客戶數據的索引,另一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須全部是小寫字母的),並且當我們要對對應於這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。 

在一個集羣中,如果你想,可以定義任意多的索引。 

索引相當於數據庫

4.Type(類型) 

在一個索引中,你可以定義一種或多種類型。一個類型是你的索引的一個邏輯上的分類/分區,其語義完全由你來定。通常,會爲具有一組共同字段的文檔定義一個類型。比如說,

我們假設你運營一個博客平臺並且將你所有的數據存儲到一個索引中。在這個索引中,你可以爲用戶數據定義一個類型,爲博客數據定義另一個類型,當然,也可以爲評論數據定義另一個類型。 

類型相當於數據庫中的表

5.Document(文檔) 

一個文檔是一個可被索引的基礎信息單元。比如,你可以擁有某一個客戶的文檔,某一個產品的一個文檔,當然,也可以擁有某個訂單的一個文檔。文檔以 JSON(Javascript Object Notation)格式來表示,而 JSON 是一個到處存在的互聯網數據交互格式。 

在一個 index/type 裏面,只要你想,你可以存儲任意多的文檔。注意,儘管一個文檔,物理上存在於一個索引之中,文檔必須被索引/賦予一個索引的 type。 

文檔相當於表中的一行記錄

6.Shards(分片) 

代表索引分片,es可以把一個完整的索引分成多個分片,這樣的好處是可以把一個大的索引拆分成多個,分佈到不同的節點上。構成分佈式搜索。分片的數量只能在索引創建前指定,並且索引創建後不能更改。 

7.Replicas(副本分片) 

代表索引副本,es可以設置多個索引的副本,副本的作用一是提高系統的容錯性,當個某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。 

總之,每個索引可以被分成多個分片。一個索引也可以被複制 0 次(意思是沒有複製)或多次。一旦複製了,每個索引就有了主分片(作爲複製源的原來的分片)和複製分片(主分片的拷貝)之別。分片和複製的數量可以在索引創建的時候指定。在索引創建之後,你可以在任何時候動態地改變複製的數量,但是你事後不能改變分片的數量。 

默認情況下,Elasticsearch 中的每個索引被分片 5 個主分片和 1 個複製,這意味着,如果你的集羣中至少有兩個節點,你的索引將會有 5 個主分片和另外 5 個複製分片(1 個完全拷貝),這樣的話每個索引總共就有 10 個分片。 


ES集羣是通過組播來進行發現的。

GREEN:健康    Y:主分片正常  red:主分片丟失

vi /etc/sysctl.conf

# 增加下面的內容

fs.file-max=65536

vm.max_map_count=262144

#java -version > v1.8

#tar zxf elasticsearch-5.6.2.tar.gz

#ln -s elasticsearch-5.6.2 elasticsearch

elasticsearch.yml 用於配置elasticsearch

log4j2.properties 用於配置elasticsearch的日誌。

#sudo vi /path/elasticsearch/config/elasticsearch.yml


# ---------------------------------- Cluster -----------------------------------


cluster.name: elasticsearch


# ------------------------------------ Node ------------------------------------


node.name: yournodename

# ----------------------------------- Memory -----------------------------------


bootstrap.memory_lock: false

bootstrap.system_call_filter: false


# ---------------------------------- Network -----------------------------------


network.host: 172.16.64.94

http.port: 52333


# --------------------------------- Discovery ----------------------------------


discovery.zen.ping.unicast.hosts: ["172.16.64.94", "172.16.64.95", "172.16.64.96"]

#


#vi jvm.options 


-Xms512m        #視環境而調

-Xmx512m        #視環境而調


#root用戶

sysctl -w vm.max_map_count=262144

sysctl -a|grep vm.max_map_count


sudo vi /path/elasticsearch/bin/elasticsearch

sudo vi /path/elasticsearch/bin/elasticsearch-plugin


##elasticsearch必須在java1.8及以上,在多個java版本的情況下可在配置文件下指定java版本

export JAVA_HOME=/path/jdk1.8

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/*.jar

export PATH=.:$JAVA_HOME/bin:$PATH

export ES_HOME=/path/elasticsearch


啓動:/path/elasticsearch/bin/elasticsearch -d


問題總結:

    1、啓動 elasticsearch 如出現異常  can not run elasticsearch as root  

解決方法:創建ES 賬戶,修改文件夾 文件 所屬用戶 組

2、啓動異常:ERROR: bootstrap checks failed

system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

問題原因:因爲Centos6不支持SecComp,而ES5.2.1默認bootstrap.system_call_filter爲true進行檢測,所以導致檢測失敗,失敗後直接導致ES不能啓動。詳見 :https://github.com/elastic/elasticsearch/issues/22899

解決方法:在elasticsearch.yml中配置bootstrap.system_call_filter爲false,注意要在Memory下面:

bootstrap.memory_lock: false

bootstrap.system_call_filter: false

3、啓動後,如果只有本地可以訪問,嘗試修改配置文件 elasticsearch.yml

中network.host(注意配置文件格式不是以 # 開頭的要空一格, : 後要空一格)

爲 network.host: 0.0.0.0

默認端口是 9200

注意:關閉防火牆 或者開放9200端口

4、ERROR: bootstrap checks failed

max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

max number of threads [1024] for user [lishang] likely too low, increase to at least [2048]


解決方法:切換到root用戶,編輯limits.conf 添加類似如下內容

vi /etc/security/limits.conf 

添加如下內容:

* soft nofile 65536

* hard nofile 131072

* soft nproc 2048

* hard nproc 4096

5、max number of threads [1024] for user [lish] likely too low, increase to at least [2048]

解決:切換到root用戶,進入limits.d目錄下修改配置文件。

vi /etc/security/limits.d/90-nproc.conf 

修改如下內容:

* soft nproc 1024

#修改爲

* soft nproc 2048

6、max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

解決:切換到root用戶修改配置sysctl.conf

vi /etc/sysctl.conf 

添加下面配置:

vm.max_map_count=655360

並執行命令:

sysctl -p

然後,重新啓動elasticsearch,即可啓動成功。


Elasticsearch交互(CLI交互):

    curl -i -XGET 'http://172.16.64.94:52333/_count?pretty' -d '

    {

        "query":{

            "match_all":{}

        }

    }

    '


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