Elasticsearch叢集伺服器配置
一、安裝
Elasticsearch是基於Lence的,而Lence是用Java編寫的開源庫,需要依賴Java的運行環境。現在使用的ELasticSearch版本是1.6,它需要jdk1.7或以上的版本。
本文使用的是linux系統,安裝配置好Java環境,把download下來,解壓後直接執行啟動就可以了。
1.安裝啟動elasticsearch:
cd到elasticsearch-1.6.0.tar.gz 放置的目錄,
解壓 tar -xvf elasticsearch-1.6.0.tar.gz
啟動 ./elasticsearch-1.6.0/bin/elasticsearch,查看啟動資訊,會提到http的預設連接埠是9200,transport的預設連接埠是9300,這個非常重要。
接下來可以在Terminal輸入一下命令,查看一些基本資料
查看叢集
curl 'localhost:9200/_cat/health?v'
查看節點
curl 'localhost:9200/_cat/nodes?v'
查看索引
curl 'localhost:9200/_cat/indices?v'
以上這些資訊均可在安裝head外掛程式後,在http://localhost:9200/_plugin/head/中查看
2. 安裝head外掛程式
cd到elasticsearch-1.6.0/bin目錄,運行./plugin -install mobz/elasticsearch-head,
安裝並啟動elasticsearch後,在瀏覽器開啟http://localhost:9200/_plugin/head/,即可看到es的叢集、節點、索引、資料等等的資訊。
二、啟動
1.內建指令碼啟動
1)bin/elasticsearch,不太任何參數,預設在前端啟動
2)bin/elasticsearch-d,帶參-d,表示在後台作為服務線程啟動
還可以設定更多的參數:bin/elasticsearch-Xmx2g-Xms2g-Des.index.store.type=memory--node.name=my-node
注意:如果是在區域網路中運行elasticsearch叢集也是很簡單的,只要cluster.name設定一致,並且機器在同一網段下,啟動的es會自動探索對方,組成叢集。
2.elasticsearch-servicewrapper
1)安裝
到github,https://github.com/elastic/elasticsearch-servicewrapper下載,把service拷貝到ES_HOME/bin目錄下。
2)使用
ES_HOME/bin/service/elasticsearch + console/start/stop...
Parameter |
Description |
console |
Runthe elasticsearch in the foreground. |
start |
Runelasticsearch in the background. |
stop |
Stopselasticsearch if its running. |
install |
Installelasticsearch to run on system startup (init.d / service). |
remove |
Removeselasticsearch from system startup (init.d / service). |
在service目錄下有個elasticsearch.conf設定檔,主要是設定一些java運行環境參數,其中比較重要的是下面的
參數:
#es的home路徑,不用用預設值就可以
set.default.ES_HOME=<Pathto Elasticsearch Home>
#分配給es的記憶體大小
set.default.ES_HEAP_SIZE=1024
#啟動等待逾時時間(以秒為單位)
wrapper.startup.timeout=300
#關閉等待逾時時間(以秒為單位)
wrapper.shutdown.timeout=300
#ping逾時時間(以秒為單位)
wrapper.ping.timeout=300
三、配置淺涉
elasticsearch的config檔案夾裡面有兩個設定檔:elasticsearch.yml和logging.yml,第一個是es的基本設定檔,第二個是日誌設定檔,es也是使用log4j來記錄日誌的,所以logging.yml裡的設定按普通log4j設定檔來設定就行了。下面主要講解下elasticsearch.yml這個檔案中可配置的東西。
cluster.name:elasticsearch
配置es的叢集名稱,預設是elasticsearch,es會自動探索在同一網段下的es,如果在同一網段下有多個叢集,就可以用這個屬性來區分不同的叢集。
node.name:"FranzKafka"
節點名,預設隨機指定一個name列表中名字,該列表在es的jar包中config檔案夾裡name.txt檔案中,其中有很多作者添加的有趣名字。
node.master:true
指定該節點是否有資格被選舉成為node,預設是true,es是預設叢集中的第一台機器為master,如果這台機掛了就會重新選舉master。
node.data:true
指定該節點是否儲存索引資料,預設為true。
index.number_of_shards:5
設定預設索引分區個數,預設為5片。
index.number_of_replicas:1
設定預設索引複本個數,預設為1個副本。
path.conf:/path/to/conf
設定設定檔的儲存路徑,預設是es根目錄下的config檔案夾。
path.data:/path/to/data
設定索引資料的儲存路徑,預設是es根目錄下的data檔案夾,可以設定多個儲存路徑,用逗號隔開,例:
path.data:/path/to/data1,/path/to/data2
path.work:/path/to/work
設定臨時檔案的儲存路徑,預設是es根目錄下的work檔案夾。
path.logs:/path/to/logs
設定記錄檔的儲存路徑,預設是es根目錄下的logs檔案夾
path.plugins:/path/to/plugins
設定外掛程式的存放路徑,預設是es根目錄下的plugins檔案夾
bootstrap.mlockall:true
設定為true來鎖住記憶體。因為當jvm開始swapping時es的效率會降低,所以要保證它不swap,可以把ES_MIN_MEM和ES_MAX_MEM兩個環境變數設定成同一個值,並且保證機器有足夠的記憶體配置給es。同時也要允許elasticsearch的進程可以鎖住記憶體,linux下可以通過`ulimit-l unlimited`命令。
network.bind_host:192.168.0.1
設定綁定的ip地址,可以是ipv4或ipv6的,預設為0.0.0.0。
network.publish_host:192.168.0.1
設定其它節點和該節點互動的ip地址,如果不設定它會自動判斷,值必須是個真實的ip地址。
network.host:192.168.0.1
這個參數是用來同時設定bind_host和publish_host上面兩個參數。
transport.tcp.port:9300
設定節點間互動的tcp連接埠,預設是9300。
transport.tcp.compress:true
設定是否壓縮tcp傳輸時的資料,預設為false,不壓縮。
http.port:9200
設定對外服務的http連接埠,預設為9200。
http.max_content_length:100mb
設定內容的最大容量,預設100mb
http.enabled:false
是否使用http協議對外提供服務,預設為true,開啟。
gateway.type:local
gateway的類型,預設為local即為本地檔案系統,可以設定為本地檔案系統,Distributed File System,hadoop的HDFS,和amazon的s3伺服器,其它檔案系統的設定方法下次再詳細說。
gateway.recover_after_nodes:1
設定叢集中N個節點啟動時進行資料恢複,預設為1。
gateway.recover_after_time:5m
設定初始化資料恢複進程的逾時時間,預設是5分鐘。
gateway.expected_nodes:2
設定這個叢集中節點的數量,預設為2,一旦這N個節點啟動,就會立即進行資料恢複。
cluster.routing.allocation.node_initial_primaries_recoveries:4
初始化資料恢複時,並發恢複線程的個數,預設為4。
cluster.routing.allocation.node_concurrent_recoveries:2
添加刪除節點或負載平衡時並發恢複線程的個數,預設為4。
indices.recovery.max_size_per_sec:0
設定資料恢複時限制的頻寬,如入100mb,預設為0,即無限制。
indices.recovery.concurrent_streams:5
設定這個參數來限制從其它分區恢複資料時最大同時開啟並發流的個數,預設為5。
discovery.zen.minimum_master_nodes:1
設定這個參數來保證叢集中的節點可以知道其它N個有master資格的節點。預設為1,對於大的叢集來說,可以設定大一點的值(2-4)
discovery.zen.ping.timeout:3s
設定叢集中自動探索其它節點時ping連線逾時時間,預設為3秒,對於比較差的網路環境可以高點的值來防止自動探索時出錯。
discovery.zen.ping.multicast.enabled:false
設定是否開啟多點傳送探索節點,預設是true。
discovery.zen.ping.unicast.hosts:["host1", "host2:port","host3[portX-portY]"]
設定叢集中master節點的初始列表,可以通過這些節點來自動探索新加入叢集的節點
四、叢集配置多個節點
1.概述
本例子的叢集將部署4個節點:
10.0.0.11 es1
10.0.0.209 es2
10.0.0.206 es3
10.0.0.208 es4
2.叢集配置
上文提到過,只要叢集名相同,且機器處於同一區域網路同一網段,es會自動去發現其他的節點。
2.1es2的配置
vimES_HOME/config/elasticsearch.yml
在檔案尾部添加一下內容:
cluster.name:elasticsearch #叢集的名稱,同一個叢集該值必須設定成相同的
node.name:"es2" #該節點的名字
node.master:true #該節點有機會成為master節點
node.data:true #該節點可以儲存資料
node.rack:rack2 #該節點所屬的機架
index.number_of_shards:5 #shard的數目
index.number_of_replicas:3 #資料副本的數目
network.bind_host:0.0.0.0 #設定綁定的IP地址,可以是IPV4或者IPV6
network.publish_host:10.0.0.209 #設定其他節點與該節點互動的IP地址
network.host:10.0.0.209 #該參數用於同時設定bind_host和publish_host
transport.tcp.port:9300 #設定節點之間互動的連接埠號碼
transport.tcp.compress:true #設定是否壓縮tcp上互動傳輸的資料
http.port:9200 #設定對外服務的http連接埠號碼
http.max_content_length:100mb #設定http內容的最大大小
http.enabled:true #是否開啟http服務對外提供服務
discovery.zen.minimum_master_nodes:2 #設定這個參數來保證叢集中的節點可以知道其它N個有master資格的節點。預設為1,對於大的叢集來說,可以設定大一點的值(2-4)
discovery.zen.ping.timeout:120s #設定叢集中自動探索其他節點時ping串連的逾時時間
discovery.zen.ping.multicast.enabled:true #設定是否開啟多點傳送探索節點
discovery.zen.ping.unicast.hosts:["10.0.0.209:9300","10.0.0.206:9300","10.0.0.208:9300"] #設定叢集中的Master節點的初始列表,可以通過這些節點來自動探索其他新加入叢集的節點
2.2es3的配置
相似地,在206的機子上
vimES_HOME/config/elasticsearch.yml
在檔案尾部添加一下內容:
cluster.name:elasticsearch #叢集的名稱,同一個叢集該值必須設定成相同的
node.name:"es3" #該節點的名字
node.master:true #該節點有機會成為master節點
node.data:true #該節點可以儲存資料
node.rack:rack3 #該節點所屬的機架
index.number_of_shards:5 #shard的數目
index.number_of_replicas:3 #資料副本的數目
network.bind_host:0.0.0.0 #設定綁定的IP地址,可以是IPV4或者IPV6
network.publish_host:10.0.0.206 #設定其他節點與該節點互動的IP地址
network.host:10.0.0.206 #該參數用於同時設定bind_host和publish_host
transport.tcp.port:9300 #設定節點之間互動的連接埠號碼
transport.tcp.compress:true #設定是否壓縮tcp上互動傳輸的資料
http.port:9200 #設定對外服務的http連接埠號碼
http.max_content_length:100mb #設定http內容的最大大小
http.enabled:true #是否開啟http服務對外提供服務
discovery.zen.minimum_master_nodes:2 #設定這個參數來保證叢集中的節點可以知道其它N個有master資格的節點。預設為1,對於大的叢集來說,可以設定大一點的值(2-4)
discovery.zen.ping.timeout:120s #設定叢集中自動探索其他節點時ping串連的逾時時間
discovery.zen.ping.multicast.enabled:true #設定是否開啟多點傳送探索節點
discovery.zen.ping.unicast.hosts:["10.0.0.209:9300","10.0.0.206:9300","10.0.0.208:9300"] #設定叢集中的Master節點的初始列表,可以通過這些節點來自動探索其他新加入叢集的節點
2.3 208的機子上的es配置就參考上面兩個節點的
2.4驗證結果
啟動節點:
ES_HOME/bin/service/elasticsearchstart
成功啟動各個節點後,瀏覽器開啟http://10.0.0.209:9200/_plugin/head/,介面會列出各個節點的資訊。
3.節點添加和刪除
3.1添加節點非常簡單,幾乎與上面設定節點的步驟一致。
在10.0.0.11機子上,vimES_HOME/config/elasticsearch.yml
cluster.name:elasticsearch #叢集的名稱,同一個叢集該值必須設定成相同的
node.name:"es5" #該節點的名字
node.master:false #該節點有機會成為master節點
node.data:true #該節點可以儲存資料
node.rack:rack5 #該節點所屬的機架
index.number_of_shards:5 #shard的數目
index.number_of_replicas:3 #資料副本的數目
network.bind_host:0.0.0.0 #設定綁定的IP地址,可以是IPV4或者IPV6
network.publish_host:10.0.0.11 #設定其他節點與該節點互動的IP地址
network.host:10.0.0.11 #該參數用於同時設定bind_host和publish_host
transport.tcp.port:9300 #設定節點之間互動的連接埠號碼
transport.tcp.compress:true #設定是否壓縮tcp上互動傳輸的資料
http.port:9200 #設定對外服務的http連接埠號碼
http.max_content_length:100mb #設定http內容的最大大小
http.enabled:true #是否開啟http服務對外提供服務
discovery.zen.minimum_master_nodes:2 #設定這個參數來保證叢集中的節點可以知道其它N個有master資格的節點。預設為1,對於大的叢集來說,可以設定大一點的值(2-4)
discovery.zen.ping.timeout:120s #設定叢集中自動探索其他節點時ping串連的逾時時間
discovery.zen.ping.multicast.enabled:true #設定是否開啟多點傳送探索節點
discovery.zen.ping.unicast.hosts:["10.0.0.209:9300","10.0.0.206:9300","10.0.0.208:9300"] #設定叢集中的Master節點的初始列表,可以通過這些節點來自動探索其他新加入叢集的節點
寫好配置,啟動此es節點。
查看叢集的狀態:
http://10.0.0.11:9200/_nodes
elasticsearch採用廣播的方式自動探索節點,需要等待一段時間才能發現新的節點:
耐心等待...最後可以在此介面看到各個節點的資訊。
3.2節點刪除
在想要刪除節點的機子上,運行ES_HOME/bin/service/elasticsearchstop,等待一會後,查看叢集狀態,會發現該節點沒有了。
Elasticsearch叢集管理
ES通過設定【節點的名字】和【叢集的名字】,就能自動的組織相同叢集名字的節點加入到叢集中,並使很多的技術對使用者透明化。
如果使用者想要管理查看叢集的狀態,可以通過一些REST API來實現。
其他的ES文檔翻譯參考:Elasticsearch文檔總結
REST API用途
ES提供了很多全面的API,大致可以分成如下幾種:
1 檢查叢集、節點、索引的健康情況
2 管理叢集、節點,索引資料、中繼資料
3 執行CRUD,建立、讀取、更新、刪除 以及 查詢
4 執行進階的查詢操作,比如分頁、排序、指令碼、彙總等
查看叢集狀態
可以通過CURL命令發送REST命令,查詢叢集的健康狀態:
curl 'localhost:9200/_cat/health?v'
Localhost是主機的地址,9200是監聽的連接埠號碼,ES預設監聽的連接埠號碼就是9200.
這裡需要注意的是,windows下安裝的CURL有可能不支援單引號,如果有報錯,還請改成雙引號,內部使用逸出字元轉義。
得到的相應結果:
epoch timestamp cluster status node.total node.data shards pri relo init unassign
1394735289 14:28:09 elasticsearch green 1 1 0 0 0 0 0
可以看到叢集的名字是預設的"elasticsearch",叢集的狀態時"green"。這個顏色之前也有說過:
1 綠色,最健康的狀態,代表所有的分區包括備份都可用
2 黃色,基本的分區可用,但是備份不可用(也可能是沒有備份)
3 紅色,部分的分區可用,表明分區有一部分損壞。此時執行查詢部分資料仍然可以查到,遇到這種情況,還是趕快解決比較好。
上面的結果還可以看到,目前有一個節點,但是沒有分區,這是因為我們的ES中還沒有資料,一次也就沒有分區。
當使用elasticsearch作為叢集名字時,會使用單播,查詢本機上是否還運行著其他的節點。如果有,則組成一個叢集。
(如果使用其他的名字作為叢集名字,那麼就可能採用多播了!這個在工作中,經常會遇到,大家使用的是一個叢集名字,分區總是被搞在一起,導致有人的機器下線後,自己的也無法使用)
通過下面的命令,可以查詢節點的列表:
curl 'localhost:9200/_cat/nodes?v'
得到的結果如下:
curl 'localhost:9200/_cat/nodes?v'
host ip heap.percent ram.percent load node.role master name
mwubuntu1 127.0.1.1 8 4 0.00 d * New Goblin
查看所有的索引
在ES中索引有兩個意思:
1 動詞的索引,表示把資料存放區到ES中,提供搜尋的過程;這期間可能正在執行一個建立搜尋的過程。
2 名字的索引,它是ES中的一個儲存類型,與資料庫類似,內部包含type欄位,type中包含各種文檔。
通過下面的命令可以查看所有的索引:
curl 'localhost:9200/_cat/indices?v'
得到的結果如下:
curl 'localhost:9200/_cat/indices?v'
health index pri rep docs.count docs.deleted store.size pri.store.size
由於叢集中沒有任何的資料,上面的結果中也就只包含列的資訊了。
建立索引
下面是建立索引,以及查詢索引的例子:
curl -XPUT 'localhost:9200/customer?pretty'
{
"acknowledged" : true
}
curl 'localhost:9200/_cat/indices?v'
health index pri rep docs.count docs.deleted store.size pri.store.size
yellow customer 5 1 0 0 495b 495b
上面的結果中,customer索引的狀態是yellow,這是因為此時雖然有5個主分區和一個備份。但是由於只是單個節點,我們的分區還在運行中,無法動態修改。因此當有其他的節點加入到叢集中,備份的節點會被拷貝到另一個節點中,狀態就會變成green。
索引和搜尋文檔
之前說過,索引裡面還有類型的概念,在索引文檔之前要先設定類型type。
執行的命令如下:
curl -XPUT 'localhost:9200/customer/external/1?pretty' -d '
{
"name": "John Doe"
}'
執行成功後會得到如下的資訊:
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"created" : true
}
注意2.0版本的ES在同一索引下,不同的類型,相同的欄位名字,是不允許欄位類型不一致的。
上面的例子中,為我們建立了一個文檔,並且id自動化佈建為1.
ES不需要再索引文檔前,不需要明確的建立索引,如果執行上面的命令,索引不存在,也會自動的建立索引。
執行下面的命令查詢,返回資訊也如下:
curl -XGET 'localhost:9200/customer/external/1?pretty'
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"found" : true, "_source" : { "name": "John Doe" }
}
這裡會新增兩個欄位:
1 found 描述了請求資訊
2 _source 為之前索引時的資料
刪除索引
執行下面的命令就可以刪除索引:
curl -XDELETE 'localhost:9200/customer?pretty'
返回結果:
{
"acknowledged": true
}
總結
總結上面涉及到的命令大致如下:
curl -XPUT 'localhost:9200/customer'//建立索引
//插入資料
curl -XPUT 'localhost:9200/customer/external/1'-d '
{
"name": "John Doe"
}'
curl 'localhost:9200/customer/external/1'//查詢資料
curl -XDELETE 'localhost:9200/customer'//刪除索引