ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是第二流行的企業搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。java
elasticsearch是一個近似實時的搜索平臺,從索引文檔到可搜索有些延遲,一般爲1秒。node
集羣就是一個或多個節點存儲數據,其中一個節點爲主節點,這個主節點是能夠經過選舉產生的,並提供跨節點的聯合索引和搜索的功能。集羣有一個惟一性標示的名字,默認是elasticsearch,集羣名字很重要,每一個節點是基於集羣名字加入到其集羣中的。所以,確保在不一樣環境中使用不一樣的集羣名字。一個集羣能夠只有一個節點。強烈建議在配置elasticsearch時,配置成集羣模式。linux
節點就是一臺單一的服務器,是集羣的一部分,存儲數據並參與集羣的索引和搜索功能。像集羣同樣,節點也是經過名字來標識,默認是在節點啓動時隨機分配的字符名。固然啦,你能夠本身定義。該名字也蠻重要的,在集羣中用於識別服務器對應的節點。
節點能夠經過指定集羣名字來加入到集羣中。默認狀況下,每一個節點被設置成加入到elasticsearch集羣。若是啓動了多個節點,假設能自動發現對方,他們將會自動組建一個名爲elasticsearch的集羣。nginx
索引是有幾分類似屬性的一系列文檔的集合。如nginx日誌索引、syslog索引等等。索引是由名字標識,名字必須所有小寫。這個名字用來進行索引、搜索、更新和刪除文檔的操做。
索引相對於關係型數據庫的庫。git
在一個索引中,能夠定義一個或多個類型。類型是一個邏輯類別仍是分區徹底取決於你。一般狀況下,一個類型被定於成具備一組共同字段的文檔。如ttlsa運維生成時間全部的數據存入在一個單一的名爲logstash-ttlsa的索引中,同時,定義了用戶數據類型,帖子數據類型和評論類型。
類型相對於關係型數據庫的表。github
文檔是信息的基本單元,能夠被索引的。文檔是以JSON格式表現的。
在類型中,能夠根據需求存儲多個文檔。
雖然一個文檔在物理上位於一個索引,實際上一個文檔必須在一個索引內被索引和分配一個類型。
文檔相對於關係型數據庫的列。web
分片和副本數據庫
在實際狀況下,索引存儲的數據可能超過單個節點的硬件限制。如一個十億文檔需1TB空間可能不適合存儲在單個節點的磁盤上,或者從單個節點搜索請求太慢了。爲了解決這個問題,elasticsearch提供將索引分紅多個分片的功能。當在建立索引時,能夠定義想要分片的數量。每個分片就是一個全功能的獨立的索引,能夠位於集羣中任何節點上。
分片的兩個最主要緣由:
a、水平分割擴展,增大存儲量
b、分佈式並行跨分片操做,提升性能和吞吐量
分佈式分片的機制和搜索請求的文檔如何彙總徹底是有elasticsearch控制的,這些對用戶而言是透明的。
網絡問題等等其它問題能夠在任什麼時候候不期而至,爲了健壯性,強烈建議要有一個故障切換機制,不管何種故障以防止分片或者節點不可用。
爲此,elasticsearch讓咱們將索引分片複製一份或多份,稱之爲分片副本或副本。
副本也有兩個最主要緣由:
高可用性,以應對分片或者節點故障。出於這個緣由,分片副本要在不一樣的節點上。
提供性能,增大吞吐量,搜索能夠並行在全部副本上執行。
總之,每個索引能夠被分紅多個分片。索引也能夠有0個或多個副本。複製後,每一個索引都有主分片(母分片)和複製分片(複製於母分片)。分片和副本數量能夠在每一個索引被建立時定義。索引建立後,能夠在任什麼時候候動態的更改副本數量,可是,不能改變分片數。
默認狀況下,elasticsearch爲每一個索引分片5個主分片和1個副本,這就意味着集羣至少須要2個節點。索引將會有5個主分片和5個副本(1個完整副本),每一個索引總共有10個分片。
每一個elasticsearch分片是一個Lucene索引。一個單個Lucene索引有最大的文檔數LUCENE-5843, 文檔數限制爲2147483519(MAX_VALUE – 128)。 可經過_cat/shards來監控分片大小。bootstrap
LogStash由JRuby語言編寫,基於消息(message-based)的簡單架構,並運行在Java虛擬機(JVM)上。不一樣於分離的代理端(agent)或主機端(server),LogStash可配置單一的代理端(agent)與其它開源軟件結合,以實現不一樣的功能。vim
Shipper:發送事件(events)至LogStash;一般,遠程代理端(agent)只須要運行這個組件便可;
Broker and Indexer:接收並索引化事件;
Search and Storage:容許對事件進行搜索和存儲;
Web Interface:基於Web的展現界面
正是因爲以上組件在LogStash架構中可獨立部署,才提供了更好的集羣擴展性。
Kibana 也是一個開源和免費的工具,他能夠幫助您彙總、分析和搜索重要數據日誌並提供友好的web界面。他能夠爲 Logstash 和 ElasticSearch 提供的日誌分析的 Web 界面
準備兩臺機器,如下是其中一臺作爲master的機器
[root@linux-node1 ~]# cat /etc/redhat-release CentOS Linux release 7.0.1406 (Core) [root@linux-node1 ~]# uname -a Linux linux-node1.example.com 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux [root@linux-node1 ~]# tail -2 /etc/hosts 192.168.230.128 linux-node1 linux-node1.example.com 192.168.230.129 linux-node2 linux-node2.example.com [root@linux-node1 ~]# ifconfig eth0|awk -F '[ :]+' 'NR==2{print $3}' 192.168.230.128 [root@linux-node1~]# systemctl stop firewalld [root@linux-node1~]# getenforce 0 Disabled [root@linux-node1~ /]# systemctl disable firewalld.service
時間同步
echo "#time sync by zsq at $(date +%F)" >> /var/spool/cron/root echo "*/5 * * * * /usr/sbin/ntpdate time.nist.gov &>/dev/null" >>/var/spool/cron/root
重啓crond
/sbin/service crond restart
理想實踐是給2G內存,我這裏給1.5G,elasticsearch作集羣還須要一臺相同的配置
[root@linux-node1 ~]# free -m total used free shared buffers cached Mem:146751894880142
最佳實踐cpu給2顆
[root@linux-node1 ~]# cat /proc/cpuinfo |grep"physical id"|sort|uniq|wc -l 2
須要有java環境
[root@linux-node1 ~]# yum -y install java [root@linux-node1 ~]# java -version openjdk version "1.8.0_111" OpenJDK Runtime Environment (build 1.8.0_111-b15) OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)
配置epel yum源
下載並安裝EPEL
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
下載並安裝GPG key
[root@linux-node2 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
添加yum倉庫
[root@linux-node1 ~]# vim /etc/yum.repos.d/elasticsearch.repo [elasticsearch-2.x] name=Elasticsearch repository for 2.x packages baseurl=http://packages.elastic.co/elasticsearch/2.x/centos gpgcheck=1 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch enabled=1
安裝elasticsearch
yum install -y elasticsearch
安裝太慢直接用rpm包
root@linux-node1 ~]# rpm -ivh elasticsearch-2.4.3.rpm Preparing... ################################# [100%] Creating elasticsearch group... OK Creating elasticsearch user... OK Updating / installing... 1:elasticsearch-2.4.3-1 ################################# [100%] ### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd sudo systemctl daemon-reload sudo systemctl enable elasticsearch.service ### You can start elasticsearch service by executing sudo systemctl start elasticsearch.service
再執行開機啓動
systemctl daemon-reload
systemctl enable elasticsearch.service
啓動
systemctl start elasticsearch.service
修改elasticsearch配置文件,並受權
[root@linux-node1 ~]# grep -n '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 17:cluster.name: check-cluster #集羣節點 23:node.name: linux-node1 #節點名字 33:path.data: /data/es-data #數據路徑 37:path.logs: /var/log/elasticsearch/ #自身log 43:bootstrap.memory_lock: true #是否鎖定內存 54:network.host: 0.0.0.0 #默認是全部網段 58:http.port: 9200 #端口 [root@linux-node1 ~]# mkdir -p /data/es-data [root@linux-node1 ~]# chown elasticsearch.elasticsearch /data/es-data/
啓動elasticsearch
[root@linux-node1 ~]# systemctl start elasticsearch
檢查
[root@linux-node1 ~]# netstat -ntpl|grep 9200 tcp6 0 0 :::9200 :::* LISTEN 2042/java
訪問:
1.安裝Elasticsearch集羣管理插件
[root@linux-node1 ~]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head -> Installing mobz/elasticsearch-head... Trying https://github.com/mobz/elasticsearch-head/archive/master.zip ... Downloading ..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................DONE Verifying https://github.com/mobz/elasticsearch-head/archive/master.zip checksums if available ... NOTE: Unable to verify checksum for downloaded plugin (unable to find .sha1 or .md5 file to verify) Installed head into /usr/share/elasticsearch/plugins/head
訪問head集羣插件:http://ES_IP:9200/_plugin/head/
寫點數據, 寫一個/index-demo/test的索引,方法post,點擊提交請求
{ "user": "oldboy", "mesg": "hello world" }
get提交id,id就是右邊提示的_id信息,查詢到_soure裏的內容
若是刪除用delete刪除
部署第二臺,集羣部署
[root@linux-node2 /]# java -version openjdk version "1.8.0_111" OpenJDK Runtime Environment (build 1.8.0_111-b15) OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode) [root@linux-node2 /]# rz -E rz waiting to receive. [root@linux-node2 /]# rpm -ivh elasticsearch-2.4.3.rpm warning: elasticsearch-2.4.3.rpm: Header V4 RSA/SHA1 Signature, key ID d88e42b4: NOKEY Preparing... ################################# [100%] Creating elasticsearch group... OK Creating elasticsearch user... OK Updating / installing... 1:elasticsearch-2.4.3-1 ################################# [100%] ### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd sudo systemctl daemon-reload sudo systemctl enable elasticsearch.service ### You can start elasticsearch service by executing sudo systemctl start elasticsearch.service [root@linux-node2 /]# systemctl daemon-reload [root@linux-node2 /]# systemctl enable elasticsearch.service Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service. [root@linux-node2 /]# systemctl start elasticsearch.service [root@linux-node2 /]# netstat -ntpl|grep "9200" tcp6 0 0 127.0.0.1:9200 :::* LISTEN 2546/java tcp6 0 0 ::1:9200 :::* LISTEN 2546/java [root@linux-node2 data]# grep -n '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 17:cluster.name: check-cluster 23:node.name: linux-node2 33:path.data: /data/es-data 37:path.logs: /var/log/elasticsearch/ 43:bootstrap.memory_lock: true 54:network.host: 0.0.0.0 58:http.port: 9200 [root@linux-node2 ~]# mkdir -p /data/es-data [root@linux-node2 ~]# chown elasticsearch.elasticsearch /data/es-data/
啓動elasticsearch
[root@linux-node2 ~]# systemctl start elasticsearch
檢查
[root@linux-node2 ~]# netstat -ntpl|grep 9200 tcp6 0 0 :::9200 :::* LISTEN 2042/java
瀏覽器訪問
查看日誌,/etc/security/limits.conf,配置文件須要追加內容# allow user 'elasticsearch' mlockall
下的兩行
[2017-01-03 20:56:02,486][WARN ][bootstrap ] These can be adjusted by modifying /etc/security/limits.conf, for example: # allow user 'elasticsearch' mlockall elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited
瀏覽器下訪問,點擊概覽,已經有一臺集羣節點,要稍微等會,添加另一臺
經過組播進行通訊,會經過cluster進行查找,若是沒法經過組播查詢,修改爲單播便可,配置文件中指定,圖中的有*號表明主節點
# Pass an initial list of hosts to perform discovery when new node is started: # The default list of hosts is ["127.0.0.1", "[::1]"] discovery.zen.ping.unicast.hosts: ["192.168.230.128", "192.168.230.129"]#把同一集羣的節點添加到這裏,方便它們互相認識
在瀏覽器中查看分片信息,一個索引默認被分紅了5個分片,每份數據被分紅了五個分片(能夠調節分片數量),外圍帶綠色框的爲主分片,不帶框的爲副本分片,主分片丟失,副本分片會複製一份成爲主分片,起到了高可用的做用,主副分片也可使用負載均衡加快查詢速度,可是若是主副本分片都丟失,則索引就是完全丟失。
[root@linux-node1 /]# /usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf
訪問kopf監控插件:http://ES_IP:9200/_plugin/kopf
從下圖能夠看出節點的負載,cpu適應狀況,java對內存的使用(heap usage),磁盤使用,啓動時間
另外一個監控插件bigdesk很強大,可是bigdesk目前還不支持2.1!!!安裝bigdesk的方法以下
/usr/share/elasticsearch/bin/plugin install lukas-vlcek/bigdesk
當第一個節點啓動,它會組播發現其餘節點,發現集羣名字同樣的時候,就會自動加入集羣。隨便一個節點都是能夠鏈接的,並非主節點才能夠鏈接,鏈接的節點起到的做用只是彙總信息展現
最初能夠自定義設置分片的個數,分片一旦設置好,就不能夠改變。主分片和副本分片都丟失,數據即丟失,沒法恢復,能夠將無用索引刪除。有些老索引或者不經常使用的索引須要按期刪除,不然會致使es資源剩餘有限,佔用磁盤大,搜索慢等。若是暫時不想刪除有些索引,能夠在插件中關閉索引,就不會佔用內存了。