最近換工作了茬贵,現(xiàn)在需要用到一些大數(shù)據(jù)的東西,例如ES移袍,找了一圈解藻,還是官方文檔最實(shí)在,只不過看起來略有些麻煩葡盗,既然要翻譯螟左,那就記錄一下吧,萬一有人需要呢。
入門簡介
Elasticsearch是一個高度可伸縮的開源全文搜索和分析引擎胶背〕嫔叮可以用它幾近實(shí)時的來存儲、搜索和分析大量的數(shù)據(jù)奄妨。通常,我們使用它作為底層引擎技術(shù)給擁有復(fù)雜搜索功能需求的應(yīng)用賦能苹祟。
下面是Elasticsearch幾個應(yīng)用場景:
- 你運(yùn)營一家可以讓用戶搜索你出售的商品的網(wǎng)上商店砸抛。此時,你可以用ES存儲全部商品的目錄和存貨树枫,然后直焙,給用戶提供搜索和自動填充功能。
- 你想要收集日志或交易數(shù)據(jù)砂轻,用來分析趨勢奔誓、統(tǒng)計(jì)數(shù)據(jù)、概要和異常搔涝。此時厨喂,你可以使用Logstash(Elasticsearch/Logstash/Kibana技術(shù)棧的一部分)來收集,聚合庄呈,解析數(shù)據(jù)蜕煌,然后將其存入ES。一旦數(shù)據(jù)在ES里了诬留,你就可以用搜索和聚合挖掘任何你感興趣的數(shù)據(jù)斜纪。
- 你有一個可以讓懂行的顧客制定類似“我對這個小玩意兒挺感興趣的,當(dāng)這個東西的價格在下個月之前降到X塊錢了通知我”規(guī)則的價格預(yù)警平臺文兑。此時盒刚,你可以抹去賣主的價格,存入ES中绿贞,使用逆向搜索(Percolator)能力因块,根據(jù)用戶的查詢來匹配價格的變動,最終樟蠕,一旦價格匹配贮聂,給用戶推送提醒。
- 你有分析學(xué)和商業(yè)策略的需求寨辩,需要快速的在一大堆數(shù)據(jù)(想象有上十億的記錄)里研究吓懈,分析,做可視化靡狞,作特定的詢問耻警。此時,你可以用ES存儲你的數(shù)據(jù),然后用Kibana(Elasticsearch/Logstash/Kibana技術(shù)棧的一部分)來定制可以讓你的重要數(shù)據(jù)可視化的儀表盤甘穿。不僅如此腮恩,你可以用ES的聚合功能,根據(jù)你的數(shù)據(jù)作復(fù)雜的商業(yè)策略查詢温兼。
這個教程的余下部分秸滴,我逐步會引導(dǎo)你,首先將ES跑起來募判,然后看看ES能做什么荡含,嘗試基礎(chǔ)的索引,搜索届垫,更新數(shù)據(jù)操作释液。在這個教程的最后,你應(yīng)該就知道了ES是個什么玩意兒装处,它怎么工作的误债,希望看到你用ES建造精致的搜索應(yīng)用,或者從數(shù)據(jù)里挖到有用的情報妄迁。
基礎(chǔ)概念
下面是一些ES的核心概念寝蹈。從開始理解這些概念會極大的簡化學(xué)習(xí)進(jìn)程。
幾乎實(shí)時(NRT)
ES是一個幾乎實(shí)時的搜索平臺判族。這意味著從你給一個文檔作索引到這個文檔能被搜索會有一個輕微的延遲(通常一秒)躺盛。
集群
集群是一個或多個節(jié)點(diǎn)(服務(wù)器)的集合,存儲你全部的數(shù)據(jù)形帮,提供在所有節(jié)點(diǎn)間聯(lián)合索引和搜索能力槽惫。一個集群用一個特定的名稱標(biāo)識,默認(rèn)是elasticsearch
辩撑。這個名稱很重要界斜,因?yàn)楣?jié)點(diǎn)只能用這個名字才能成為集群的一部分。
確保你不會在不同的環(huán)境中重用同樣的集群名稱合冀,不然各薇,你可能會讓節(jié)點(diǎn)加入錯誤的集群。例如君躺。你可以用logging-dev
,logging-stage
,logging-prod
代表開發(fā)峭判,預(yù)發(fā)布,生產(chǎn)集群棕叫。
節(jié)點(diǎn)
節(jié)點(diǎn)是集群中的單個服務(wù)器林螃,用來存儲數(shù)據(jù),參與集群的索引和搜索能力俺泣。像集群一樣疗认,節(jié)點(diǎn)也用一個名稱來標(biāo)識完残,默認(rèn)是一個全局唯一標(biāo)識(UUID),在節(jié)點(diǎn)啟動的時候分配横漏。如果不想要默認(rèn)的谨设,你可以隨意設(shè)定。這個名字用于管理集群中哪些服務(wù)器對應(yīng)哪些節(jié)點(diǎn)缎浇。
節(jié)點(diǎn)可以通過集群名稱配置加入一個具體的集群扎拣。默認(rèn)情況下,每一個被設(shè)置加入一個名為elasticsearch
的集群素跺。這意味著鹏秋,如果你在你的網(wǎng)絡(luò)中啟動幾個節(jié)點(diǎn)(假設(shè)他們能發(fā)現(xiàn)彼此),那么他們會自動的組織并加入一個名為elasticsearch
的集群亡笑。
在一個集群中,你可以想配多少節(jié)點(diǎn)就配多少横朋。此外仑乌,如果你的網(wǎng)絡(luò)中沒有其他ES節(jié)點(diǎn)運(yùn)行,那么啟動一個節(jié)點(diǎn)會默認(rèn)組織成一個名為elasticsearch
的單節(jié)點(diǎn)集群琴锭。
索引
譯者注:這里的索引不是通常意味的索引晰甚,可以認(rèn)為是RMDB中的表。
索引是存在幾分類似特征的文檔集合决帖。例如厕九,你可以有一個顧客索引,還有一個商品目錄索引地回,還有其他數(shù)據(jù)的索引扁远。索引通過一個名稱標(biāo)識(必須全是小寫的),這個名稱用于在索引中針對文檔進(jìn)行創(chuàng)建索引刻像,搜索畅买,更新,和刪除操作细睡。
在一個集群中谷羞,索引可任意指定。
類型
在一個索引中溜徙,你可以定義一個或多個類型湃缎。類型是對索引的邏輯區(qū)分,語義完全歸你自己決定蠢壹。通常嗓违,會為一組共同字段的文檔定義一個類型。例如知残,假設(shè)你運(yùn)營一個博客平臺并將所有數(shù)據(jù)存放在單獨(dú)一個索引中靠瞎。在這個索引中比庄,你可以為用戶數(shù)據(jù)定義一個類型,為博客數(shù)據(jù)定義另一個類型乏盐,為評論數(shù)據(jù)定義另一個類型佳窑。
文檔
文檔是可以被索引的基本信息單元。例如父能,你可以有一個存儲單個用戶數(shù)據(jù)的文檔神凑,一個存儲單個產(chǎn)品的文檔,一個存放單個訂單的文檔何吝。文檔用JSON表達(dá)溉委,不必多解釋。
在一個索引/類型中爱榕,只要你想瓣喊,你可以存盡可能多的文檔。注意黔酥,盡管文檔物理上存在于索引之中藻三,但還是必須得分配一個索引中的類型給它。
分片&復(fù)制
索引可以存儲超過單臺節(jié)點(diǎn)硬件限制的數(shù)據(jù)跪者。例如棵帽,一個占用1TB硬盤空間存儲十億文檔的單個索引可能在單個節(jié)點(diǎn)的硬盤上存不下,或者單個節(jié)點(diǎn)相應(yīng)查詢速度太慢渣玲。
為了解決這個問題逗概,ES提供了切分索引為多塊被稱為分片的能力。當(dāng)你創(chuàng)建一個索引忘衍,你可以輕易的指定你需要的分片個數(shù)逾苫。每個分片自己都是一個完整功能且獨(dú)立的“索引”,可以寄宿在集群中的任何一個節(jié)點(diǎn)上枚钓。
分片主要有兩個目的:
- 允許你水平分割/擴(kuò)展你的內(nèi)容容量
- 允許你在分片(潛在地隶垮,位于多個節(jié)點(diǎn)上)之上進(jìn)行分布式的、并行的操作秘噪,進(jìn)而提高性能/吞吐量
分片如何分布狸吞,文檔如何聚集為搜索請求的機(jī)制,全權(quán)由ES負(fù)責(zé)指煎,對用戶透明蹋偏。
在網(wǎng)絡(luò)/云環(huán)境下,出錯難以避免至壤,為了避免一個分片或節(jié)點(diǎn)不明原因突然離線或消失威始,有一個故障轉(zhuǎn)移機(jī)制是非常有用而且非常推薦的。為了達(dá)到這個目的像街,ES允許你創(chuàng)建一個或多個索引分片的拷貝黎棠,可以稱之為復(fù)制分片晋渺,或簡稱復(fù)制。
復(fù)制主要由兩個目的:
- 為避免分片/節(jié)點(diǎn)出錯提供高可用脓斩。為了達(dá)到這點(diǎn)木西,復(fù)制分片和原始分片不要放在同一個節(jié)點(diǎn)上。
- 擴(kuò)展搜索量/吞吐量随静,因?yàn)樗阉骺梢栽谒械膹?fù)制上并行運(yùn)行
總而言之八千,一個索引可以被切分為多個分片。一個索引也可以被復(fù)制零(就是不復(fù)制)或多次燎猛。一旦復(fù)制了恋捆,每個節(jié)點(diǎn)將會有主分片(作為復(fù)制源的原來的分片)和復(fù)制分片(主分片的拷貝)。在索引創(chuàng)建時可以指定分片和復(fù)制的數(shù)量重绷。在索引創(chuàng)建之后沸停,你可以在任何時候動態(tài)的修改復(fù)制的數(shù)量,但你不能修改分片的數(shù)量昭卓。
默認(rèn)情況下星立,ES中每一個索引分配了5個主分片和1個復(fù)制分片,這意味著葬凳,如果你的集群中至少有兩個節(jié)點(diǎn),那么你的索引將會有5個主分片和另外5個復(fù)制分片(1個完整復(fù)制)室奏,一個索引一共有10個分片火焰。
每一個ES分片是一個Lucene索引。在單個Lucenes索引中有個最大文檔限制胧沫,為2,147,483,519 (= Integer.MAX_VALUE - 128) 昌简。你可以用_cat/shards API監(jiān)控分片大小。
這些問題搞清楚之后绒怨,我們就要進(jìn)入好玩的部分了...
安裝
ES要求至少是Java 8纯赎。在這個文章書寫之時,建議使用Oracle JDK version 1.8.0_131南蹂。Java 的安裝在此不多贅述犬金。
使用tar安裝
使用下面的命令下載ES 5.6.2:
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.2.tar.gz
解壓
tar -xvf elasticsearch-5.6.2.tar.gz
運(yùn)行
cd elasticsearch-5.6.2/bin
./elasticsearch
node成功啟動
如果安裝沒問題了,你會看到下面一堆信息:
[2016-09-16T14:17:51,251][INFO ][o.e.n.Node ] [] initializing ...
[2016-09-16T14:17:51,329][INFO ][o.e.e.NodeEnvironment ] [6-bjhwl] using [1] data paths, mounts [[/ (/dev/sda1)]], net usable_space [317.7gb], net total_space [453.6gb], spins? [no], types [ext4]
[2016-09-16T14:17:51,330][INFO ][o.e.e.NodeEnvironment ] [6-bjhwl] heap size [1.9gb], compressed ordinary object pointers [true]
[2016-09-16T14:17:51,333][INFO ][o.e.n.Node ] [6-bjhwl] node name [6-bjhwl] derived from node ID; set [node.name] to override
[2016-09-16T14:17:51,334][INFO ][o.e.n.Node ] [6-bjhwl] version[5.6.2], pid[21261], build[f5daa16/2016-09-16T09:12:24.346Z], OS[Linux/4.4.0-36-generic/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_60/25.60-b23]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService ] [6-bjhwl] loaded module [aggs-matrix-stats]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService ] [6-bjhwl] loaded module [ingest-common]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService ] [6-bjhwl] loaded module [lang-expression]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService ] [6-bjhwl] loaded module [lang-groovy]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService ] [6-bjhwl] loaded module [lang-mustache]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService ] [6-bjhwl] loaded module [lang-painless]
[2016-09-16T14:17:51,967][INFO ][o.e.p.PluginsService ] [6-bjhwl] loaded module [percolator]
[2016-09-16T14:17:51,968][INFO ][o.e.p.PluginsService ] [6-bjhwl] loaded module [reindex]
[2016-09-16T14:17:51,968][INFO ][o.e.p.PluginsService ] [6-bjhwl] loaded module [transport-netty3]
[2016-09-16T14:17:51,968][INFO ][o.e.p.PluginsService ] [6-bjhwl] loaded module [transport-netty4]
[2016-09-16T14:17:51,968][INFO ][o.e.p.PluginsService ] [6-bjhwl] loaded plugin [mapper-murmur3]
[2016-09-16T14:17:53,521][INFO ][o.e.n.Node ] [6-bjhwl] initialized
[2016-09-16T14:17:53,521][INFO ][o.e.n.Node ] [6-bjhwl] starting ...
[2016-09-16T14:17:53,671][INFO ][o.e.t.TransportService ] [6-bjhwl] publish_address {192.168.8.112:9300}, bound_addresses {{192.168.8.112:9300}
[2016-09-16T14:17:53,676][WARN ][o.e.b.BootstrapCheck ] [6-bjhwl] max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
[2016-09-16T14:17:56,731][INFO ][o.e.h.HttpServer ] [6-bjhwl] publish_address {192.168.8.112:9200}, bound_addresses {[::1]:9200}, {192.168.8.112:9200}
[2016-09-16T14:17:56,732][INFO ][o.e.g.GatewayService ] [6-bjhwl] recovered [0] indices into cluster_state
[2016-09-16T14:17:56,748][INFO ][o.e.n.Node ] [6-bjhwl] started
目前不過多解釋六剥,可以看到我們名稱為6-bjhwl
(你運(yùn)行時應(yīng)該不同)的節(jié)點(diǎn)跑起來了晚顷,然后選舉自己為單個集群中的主。先別擔(dān)心不知道主是什么意思疗疟。這里主要關(guān)注该默,我們在一個集群中啟動了一個節(jié)點(diǎn)。
像之前提到的策彤,我們可以覆蓋默認(rèn)的集群和節(jié)點(diǎn)名稱栓袖。這可以通過下面的命令做到:
./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name
也要注意一下有http標(biāo)記的那一行匣摘,它提供了有關(guān)HTTP地址(192.168.8.112)和端口(9200)的信息,通過這個地址和端口我們就可以訪問我們的節(jié)點(diǎn)了裹刮。默認(rèn)情況下音榜,Elasticsearch使用9200來提供對其REST API的訪問。如果有必要必指,這個端口是可以配置的囊咏。