天天看點

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下面:

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

#修改為

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":{}

        }

    }

    '

繼續閱讀