前言
以前瞭解了Elasticsearch
的基本概念。將spring boot + ElasticSearch + head插件 搞通以後。緊接着對es進行下一步的探索:集羣。查閱資料的過程當中,找到了一篇超雞詳細的博客~~轉載以方便往後查閱。親自實踐能更快理解哦。css
二話不說,先貼上轉載地址,QAQ: 博客出處(博主):Thinkgamer博客 博客原文地址:Elasticsearch5.2.1集羣搭建,動態加入節點,並添加監控診斷插件 html
還有一篇es安裝head教程,一併貼上地址:ElasticSearch-5.0安裝head插件 node
注:如下均爲轉載博客內容linux
寫在前面的話
以前寫過一篇文章是: 如何使用一個IP搭建ES集羣——Docker如你所願 ,在該篇文章中說明了Elasticsearch集羣的單播和多播的概念和差異,以及在生產環境中的利與弊。其實在裏邊也寫了怎麼搭建集羣,可是整個流程走下來是有不少bug的,那麼這篇文章就好好聊一下如何搭建一個完整的Elasticsearch集羣,並靈活添加節點。git
環境準備
1:Elasticsearch 5.2.1 ZIP包下載:點擊下載 2:Ubuntu 16.04 3:Java 1.8 4:解壓包到/opt/elk/目錄下,生成兩個Elasticsearch文件夾,以下github
>ls /opt/elk
elasticsearch-5.2.1_1 elasticsearch-5.2.1_2
5:賦予權限,不然在啓動的過程當中會報錯(可選,根據本身的狀況而定)web
sudo chown -R master;master elasticsearch-5.2.1_*
配置說明
注意:如下配置過程當中可能會出現權限錯誤,因爲我是在/opt/elk目錄下進行的,因此有權限問題spring
1:Elasticsearch集羣中的三種角色
master node:master幾點主要用於元數據(metadata)的處理,好比索引的新增、刪除、分片分配等。
data node:data 節點上保存了數據分片。它負責數據相關操做,好比分片的 CRUD,以及搜索和整合操做。這些操做都比較消耗 CPU、內存和 I/O 資源;
client node:client 節點起到路由請求的做用,實際上能夠看作負載均衡器。
其對應的高性能集羣拓撲結構模式爲:npm
# 配置文件中給出了三種配置高性能集羣拓撲結構的模式,以下:
# 1. 若是你想讓節點從不選舉爲主節點,只用來存儲數據,可做爲負載器
# node.master: false
# node.data: true
# 2. 若是想讓節點成爲主節點,且不存儲任何數據,並保有空閒資源,可做爲協調器
# node.master: true
# node.data: false
# 3. 若是想讓節點既不稱爲主節點,又不成爲數據節點,那麼可將他做爲搜索器,從節點中獲取數據,生成搜索結果等
# node.master: false
# node.data: false
2:config/elasticsearch.ymal中配置項說明
cluster_name 集羣名稱,默認爲elasticsearch,這裏咱們設置爲es5.2.1Cluster
node.name配置節點名,用來區分節點
network.host 是配置能夠訪問本節點的路由地址
http.port 路由地址端口
transport.tcp.port TCP協議轉發地址端口
node.master 是否做爲集羣的主結點 ,值爲true或true
node.data 是否存儲數據,值爲true或true
discovery.zen.ping.unicast.hosts 用來配置全部用來組建集羣的機器的IP地址,因爲5.2.1新版本是不支持多播的,所以這個值須要提早設定好,當集羣須要擴展的時候,該值都要作改變,增長新機器的IP地址,若是是在一個ip上,要把TCP協議轉發端口寫上
discovery.zen.minimum_master_nodes 用來配置主節點數量的最少值,若是主節點數量低於該值,閉包範圍內的集羣將會中止服務,之因此加粗體,是由於暫時還沒有認證,下面配置爲1方便集羣更容易造成,即便只有一個主節點,也能夠構建集羣
gateway.* 網關的相關配置
script.* indices.* 根據需求添加的配置(可選)
3:elasticsearch-5.2.1_1中的yaml文件
該結點做爲master-node運行bootstrap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cluster.name: es5
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 2
gateway.recover_after_time: 5m
gateway.expected_nodes: 1
script.engine.groovy.inline.search: on
script.engine.groovy.inline.aggs: on
indices.recovery.max_bytes_per_sec: 20mb
4:elasticsearch-5.2.1_2中的yaml文件
該結點做爲data-node運行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cluster.name: es5
node.name: node-2
network.host: 0.0.0.0
http.port: 9201
transport.tcp.port: 9301
node.master: false
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 2
gateway.recover_after_time: 5m
gateway.expected_nodes: 1
script.engine.groovy.inline.search: on
script.engine.groovy.inline.aggs: on
indices.recovery.max_bytes_per_sec: 20mb
5:elasticsearch-5.2.1_3中的yaml文件
該結點做爲client-node運行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cluster.name: es5
node.name: node-3
network.host: 0.0.0.0
http.port: 9202
transport.tcp.port: 9302
node.master: false
node.data: false
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"]
discovery.zen.minimum_master_nodes: 2
gateway.recover_after_nodes: 2
gateway.recover_after_time: 5m
gateway.expected_nodes: 1
script.engine.groovy.inline.search: on
script.engine.groovy.inline.aggs: on
indices.recovery.max_bytes_per_sec: 20mb
啓動三個結點,打開http://localhost:9200/
查看 http://localhost:9200/_cluster/health?pretty=true 出現錯誤:
no known master node, scheduling a retry
緣由是:咱們設置的主節點只有一個而
discovery.zen.minimum_master_nodes: 2
因此這裏改成1便可,而後此時還可能會遇到一個問題就是node2和node3不能加入到集羣,報的錯以下:
[node-2] failed to send join request to master [{node-1}{WbcP0pC_T32jWpYvu5is1A}{2_LCVHx1QEaBZYZ7XQEkMg}{10.10.11.200}{10.10.11.200:9300}], reason [RemoteTransportException[[node-1][10.10.11.200:9300][internal:discovery/zen/join]]; nested: IllegalArgumentException[can't add node {node-2}{WbcP0pC_T32jWpYvu5is1A}{p-HCgFLvSFaTynjKSeqXyA}{10.10.11.200}{10.10.11.200:9301}, found existing node {node-1}{WbcP0pC_T32jWpYvu5is1A}{2_LCVHx1QEaBZYZ7XQEkMg}{10.10.11.200}{10.10.11.200:9300} with the same id but is a different node instance]; ]
緣由是:是由於複製的elasticsearch文件夾下包含了data文件中示例一的節點數據,須要把示例二data文件下的文件清空。 而後在查看集羣狀態:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"cluster_name" : "es5",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 2,
"active_primary_shards" : 22,
"active_shards" : 22,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 21,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 51.162790697674424
}
6:配置head插件
克隆到本地:
git clone git://github.com/mobz/elasticsearch-head.git
進入到文件夾,並安裝
cd elasticsearch-head
npm install
在elasticsearch.ymal文件中添加:
http.cors.enabled: true
http.cors.allow-origin: "*"
運行
npm install -g grunt
grunt server
查看http://localhost:9100/
配置logstash解析rsyslog文件
配置rsyslog參考:http://blog.csdn.net/gamer_gyt/article/details/54025857 編寫相應的jx_syslog.conf 解析文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
input {
tcp{
port => 5000
type => syslog
}
udp{
port => 5000
type => syslog
}
}
filter {
if [type] == 'syslog'{
grok {
match => { 'message' => '%{SYSLOGTIMESTAMP:syslog_timestamp} %{HOSTNAME:hostname} %{WORD:program}%{GREEDYDATA:msgsplit}'
}
}
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
target => "syslog_timestamp"
timezone => "UTC"
}
# processing repeated messages
if [msgsplit] =~ "message repeated " {
grok { match => [ "msgsplit", "\[%{BASE10NUM:pid}\]: message repeated %{BASE10NUM:ntimes} times: \[ Failed password for %{NOTSPACE:user} from %{IP:src_ip} port %{BASE10NUM:src_port} %{WORD:protocol}\]" ]
tag_on_failure => ["parsefailure", "ssh_failed_login", "ssh_repeat_message" ]
add_tag => [ "ssh_repeat_message", "grokked", "ssh_failed_login" ]
}
}
# SSH successful login
else if [msgsplit] =~ "Accepted password for" {
mutate {
replace => { type => "success_syslog" }
}
grok {
match => [ "msgsplit", "\[%{BASE10NUM:pid}\]: Accepted password for %{NOTSPACE:user} from %{IP:src_ip} port %{BASE10NUM:src_port} %{WORD:protocol}" ]
tag_on_failure => ["parsefailure", "ssh_successful_login" ]
add_tag => [ "ssh_successful_login", "grokked" ]
}
}
# SSH Brute force attemp
else if [msgsplit] =~ "Failed password for invalid user" {
mutate {
replace => { type => "brute_syslog" }
}
grok {
match => [ "msgsplit", "\[%{BASE10NUM:pid}\]: Failed password for invalid user %{NOTSPACE:user} from %{IP:src_ip} port %{BASE10NUM:src_port} %{WORD:protocol}" ]
add_tag => [ "ssh_brute_force", "grokked" ]
tag_on_failure => ["parsefailure", "ssh_brute_force" ]
}
}
# SSH failed login
else if [msgsplit] =~ "Failed password for" {
mutate {
replace => { type => "fail_syslog" }
}
grok { match => [ "msgsplit", "\[%{BASE10NUM:pid}\]: Failed password for %{NOTSPACE:user} from %{IP:src_ip} port %{BASE10NUM:src_port} %{WORD:protocol}" ]
add_tag => [ "ssh_failed_login", "grokked" ]
tag_on_failure => ["parsefailure", "ssh_failed_login" ]
}
}
else {
drop { }
}
}
}
output {
if [type] in ['success_syslog', 'brute_syslog', 'fail_syslog'] {
elasticsearch {
hosts => ["http://localhost:9200"]
#index => "ssh_login-%{+YYYY.MM.dd}"
index => "%{type}-%{+YYYY.MM.dd}"
}
}
}
運行logstash: bin/logstash -f conf/jx_syslog.conf ssh 模擬登陸 查看es集羣 node-1是master結點,node-2是data結點,node-3不存儲數據,做爲負載均衡使用
踩過的坑
1:我是在虛擬機中進行的,因爲硬盤內存不足,在es集羣正常啓動以後,logstash往es集羣寫數據時不能正常寫入
2:複製elasticsearch文件夾時,若是原來的es文件夾下存在node數據,那麼es集羣也不能正常啓動
3:配置master結點個數,因爲我是三臺機器,一個master node,一個data node,一個client node,而後設置 discovery.zen.minimum_master_nodes: 2,es集羣也不能正常啓動,建議這裏設置爲1
elasticsearch.ymal配置文件說明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
上邊已經對我配置es集羣設置的參數有了簡單的說明,可是其實還有許多參數沒有設置和說明
修改配置 /etc/elasticsearch/elasticsearch.yml 如下對相關字段以註釋方式進行解析.
##################### Elasticsearch Configuration Example #####################
# 我只是挑些重要的配置選項進行註釋,其實自帶的已經有很是細緻的英文註釋了.有理解誤差的地方請以英文原版解釋爲準.
################################### Cluster ###################################
# 表明一個集羣,集羣中有多個節點,其中有一個爲主節點,這個主節點是能夠經過選舉產生的,主從節點是對於集羣內部來講的.
# es的一個概念就是去中心化,字面上理解就是無中心節點,這是對於集羣外部來講的,由於從外部來看es集羣,在邏輯上是個總體,你與任何一個節點的通訊和與整個es集羣通訊是等價的。
# cluster.name能夠肯定你的集羣名稱,當你的elasticsearch集羣在同一個網段中elasticsearch會自動的找到具備相同cluster.name的elasticsearch服務.
# 因此當同一個網段具備多個elasticsearch集羣時cluster.name就成爲同一個集羣的標識.
#cluster.name: elasticsearch
#################################### Node #####################################
# 節點名稱同理,可自動生成也可手動配置.
#node.name: "Franz Kafka"
# 容許一個節點是否能夠成爲一個master節點,es是默認集羣中的第一臺機器爲master,若是這臺機器中止就會從新選舉master.
#node.master: true
# 容許該節點存儲數據(默認開啓)
#node.data: true
# 配置文件中給出了三種配置高性能集羣拓撲結構的模式,以下:
# 1. 若是你想讓節點從不選舉爲主節點,只用來存儲數據,可做爲負載器
# node.master: false
# node.data: true
#
# 2. 若是想讓節點成爲主節點,且不存儲任何數據,並保有空閒資源,可做爲協調器
# node.master: true
# node.data: false
#
# 3. 若是想讓節點既不稱爲主節點,又不成爲數據節點,那麼可將他做爲搜索器,從節點中獲取數據,生成搜索結果等
# node.master: false
# node.data: false
# 監控集羣狀態有一下插件和API可使用:
# Use the Cluster Health API [http://localhost:9200/_cluster/health], the
# Node Info API [http://localhost:9200/_nodes] or GUI tools
# such as <http://www.elasticsearch.org/overview/marvel/>,
# <http://github.com/karmi/elasticsearch-paramedic>,
# <http://github.com/lukas-vlcek/bigdesk> and
# <http://mobz.github.com/elasticsearch-head> to inspect the cluster state.
# A node can have generic attributes associated with it, which can later be used
# for customized shard allocation filtering, or allocation awareness. An attribute
# is a simple key value pair, similar to node.key: value, here is an example:
#
#node.rack: rack314
# By default, multiple nodes are allowed to start from the same installation location
# to disable it, set the following:
#node.max_local_storage_nodes: 1
#################################### Index ####################################
# 設置索引的分片數,默認爲5
#index.number_of_shards: 5
# 設置索引的副本數,默認爲1:
#index.number_of_replicas: 1
# 配置文件中提到的最佳實踐是,若是服務器夠多,能夠將分片提升,儘可能將數據平均分佈到大集羣中去
# 同時,若是增長副本數量能夠有效的提升搜索性能
# 須要注意的是,"number_of_shards" 是索引建立後一次生成的,後續不可更改設置
# "number_of_replicas" 是能夠經過API去實時修改設置的
#################################### Paths ####################################
# 配置文件存儲位置
#path.conf: /path/to/conf
# 數據存儲位置(單個目錄設置)
#path.data: /path/to/data
# 多個數據存儲位置,有利於性能提高
#path.data: /path/to/data1,/path/to/data2
# 臨時文件的路徑
#path.work: /path/to/work
# 日誌文件的路徑
#path.logs: /path/to/logs
# 插件安裝路徑
#path.plugins: /path/to/plugins
#################################### Plugin ###################################
# 設置插件做爲啓動條件,若是一下插件沒有安裝,則該節點服務不會啓動
#plugin.mandatory: mapper-attachments,lang-groovy
################################### Memory ####################################
# 當JVM開始寫入交換空間時(swapping)ElasticSearch性能會低下,你應該保證它不會寫入交換空間
# 設置這個屬性爲true來鎖定內存,同時也要容許elasticsearch的進程能夠鎖住內存,linux下能夠經過 `ulimit -l unlimited` 命令
#bootstrap.mlockall: true
# 確保 ES_MIN_MEM 和 ES_MAX_MEM 環境變量設置爲相同的值,以及機器有足夠的內存分配給Elasticsearch
# 注意:內存也不是越大越好,通常64位機器,最大分配內存別才超過32G
############################## Network And HTTP ###############################
# 設置綁定的ip地址,能夠是ipv4或ipv6的,默認爲0.0.0.0
#network.bind_host: 192.168.0.1
# 設置其它節點和該節點交互的ip地址,若是不設置它會自動設置,值必須是個真實的ip地址
#network.publish_host: 192.168.0.1
# 同時設置bind_host和publish_host上面兩個參數
#network.host: 192.168.0.1
# 設置節點間交互的tcp端口,默認是9300
#transport.tcp.port: 9300
# 設置是否壓縮tcp傳輸時的數據,默認爲false,不壓縮
#transport.tcp.compress: true
# 設置對外服務的http端口,默認爲9200
#http.port: 9200
# 設置請求內容的最大容量,默認100mb
#http.max_content_length: 100mb
# 使用http協議對外提供服務,默認爲true,開啓
#http.enabled: false
################################### Gateway ###################################
# gateway的類型,默認爲local即爲本地文件系統,能夠設置爲本地文件系統
#gateway.type: local
# 下面的配置控制怎樣以及什麼時候啓動一整個集羣重啓的初始化恢復過程
# (當使用shard gateway時,是爲了儘量的重用local data(本地數據))
# 一個集羣中的N個節點啓動後,才容許進行恢復處理
#gateway.recover_after_nodes: 1
# 設置初始化恢復過程的超時時間,超時時間從上一個配置中配置的N個節點啓動後算起
#gateway.recover_after_time: 5m
# 設置這個集羣中指望有多少個節點.一旦這N個節點啓動(而且recover_after_nodes也符合),
# 當即開始恢復過程(不等待recover_after_time超時)
#gateway.expected_nodes: 2
############################# Recovery Throttling #############################
# 下面這些配置容許在初始化恢復,副本分配,再平衡,或者添加和刪除節點時控制節點間的分片分配
# 設置一個節點的並行恢復數
# 1.初始化數據恢復時,併發恢復線程的個數,默認爲4
#cluster.routing.allocation.node_initial_primaries_recoveries: 4
#
# 2.添加刪除節點或負載均衡時併發恢復線程的個數,默認爲2
#cluster.routing.allocation.node_concurrent_recoveries: 2
# 設置恢復時的吞吐量(例如:100mb,默認爲0無限制.若是機器還有其餘業務在跑的話仍是限制一下的好)
#indices.recovery.max_bytes_per_sec: 20mb
# 設置來限制從其它分片恢復數據時最大同時打開併發流的個數,默認爲5
#indices.recovery.concurrent_streams: 5
# 注意: 合理的設置以上參數能有效的提升集羣節點的數據恢復以及初始化速度
################################## Discovery ##################################
# 設置這個參數來保證集羣中的節點能夠知道其它N個有master資格的節點.默認爲1,對於大的集羣來講,能夠設置大一點的值(2-4)
#discovery.zen.minimum_master_nodes: 1
# 探查的超時時間,默認3秒,提升一點以應對網絡很差的時候,防止腦裂
#discovery.zen.ping.timeout: 3s
# For more information, see
# <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html>
# 設置是否打開多播發現節點.默認是true.
# 當多播不可用或者集羣跨網段的時候集羣通訊仍是用單播吧
#discovery.zen.ping.multicast.enabled: false
# 這是一個集羣中的主節點的初始列表,當節點(主節點或者數據節點)啓動時使用這個列表進行探測
#discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
# Slow Log部分與GC log部分略,不過能夠經過相關日誌優化搜索查詢速度
############## Memory(重點須要調優的部分) ################
# Cache部分:
# es有不少種方式來緩存其內部與索引有關的數據.其中包括filter cache
# filter cache部分:
# filter cache是用來緩存filters的結果的.默認的cache type是node type.node type的機制是全部的索引內部的分片共享filter cache.node type採用的方式是LRU方式.即:當緩存達到了某個臨界值以後,es會將最近沒有使用的數據清除出filter cache.使讓新的數據進入es.
# 這個臨界值的設置方法以下:indices.cache.filter.size 值類型:eg.:512mb 20%。默認的值是10%。
# out of memory錯誤避免過於頻繁的查詢時集羣假死
# 1.設置es的緩存類型爲Soft Reference,它的主要特色是據有較強的引用功能.只有當內存不夠的時候,才進行回收這類內存,所以在內存足夠的時候,它們一般不被回收.另外,這些引用對象還能保證在Java拋出OutOfMemory異常以前,被設置爲null.它能夠用於實現一些經常使用圖片的緩存,實現Cache的功能,保證最大限度的使用內存而不引發OutOfMemory.在es的配置文件加上index.cache.field.type: soft便可.
# 2.設置es最大緩存數據條數和緩存失效時間,經過設置index.cache.field.max_size: 50000來把緩存field的最大值設置爲50000,設置index.cache.field.expire: 10m把過時時間設置成10分鐘.
#index.cache.field.max_size: 50000
#index.cache.field.expire: 10m
#index.cache.field.type: soft
# field data部分&&circuit breaker部分:
# 用於field data 緩存的內存數量,主要用於當使用排序,faceting操做時,elasticsearch會將一些熱點數據加載到內存中來提供給客戶端訪問,可是這種緩存是比較珍貴的,因此對它進行合理的設置.
# 可使用值:eg:50mb 或者 30%(節點 node heap內存量),默認是:unbounded
#indices.fielddata.cache.size: unbounded
# field的超時時間.默認是-1,能夠設置的值類型: 5m
#indices.fielddata.cache.expire: -1
# circuit breaker部分:
# 斷路器是elasticsearch爲了防止內存溢出的一種操做,每一種circuit breaker均可以指定一個內存界限觸發此操做,這種circuit breaker的設定有一個最高級別的設定:indices.breaker.total.limit 默認值是JVM heap的70%.當內存達到這個數量的時候會觸發內存回收
# 另外還有兩組子設置:
#indices.breaker.fielddata.limit:當系統發現fielddata的數量達到必定數量時會觸發內存回收.默認值是JVM heap的70%
#indices.breaker.fielddata.overhead:在系統要加載fielddata時會進行預先估計,當系統發現要加載進內存的值超過limit * overhead時會進行進行內存回收.默認是1.03
#indices.breaker.request.limit:這種斷路器是elasticsearch爲了防止OOM(內存溢出),在每次請求數據時設定了一個固定的內存數量.默認值是40%
#indices.breaker.request.overhead:同上,也是elasticsearch在發送請求時設定的一個預估係數,用來防止內存溢出.默認值是1
# Translog部分:
# 每個分片(shard)都有一個transaction log或者是與它有關的預寫日誌,(write log),在es進行索引(index)或者刪除(delete)操做時會將沒有提交的數據記錄在translog之中,當進行flush 操做的時候會將tranlog中的數據發送給Lucene進行相關的操做.一次flush操做的發生基於以下的幾個配置
#index.translog.flush_threshold_ops:當發生多少次操做時進行一次flush.默認是 unlimited
#index.translog.flush_threshold_size:當translog的大小達到此值時會進行一次flush操做.默認是512mb
#index.translog.flush_threshold_period:在指定的時間間隔內若是沒有進行flush操做,會進行一次強制flush操做.默認是30m
#index.translog.interval:多少時間間隔內會檢查一次translog,來進行一次flush操做.es會隨機的在這個值到這個值的2倍大小之間進行一次操做,默認是5s
#index.gateway.local.sync:多少時間進行一次的寫磁盤操做,默認是5s
# 以上的translog配置均可以經過API進行動態的設置
如何動態的加入結點
上邊咱們已經部署了三個結點的es集羣,加入如今咱們要另外加入一個data node,咱們該怎麼辦?
1:copy 一個elasticsearch文件夾,做爲第四個結點
sudo cp -r elasticsearch-5.2.1_2 elasticsearch-5.2.1_4
2:修改es4 中的yaml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cluster.name: es5
node.name: node-4
network.host: 0.0.0.0
http.port: 9203
transport.tcp.port: 9303
node.master: false
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302", "0.0.0.0:9302"]
discovery.zen.minimum_master_nodes: 1
gateway.recover_after_nodes: 2
gateway.recover_after_time: 5m
gateway.expected_nodes: 1
script.engine.groovy.inline.search: on
script.engine.groovy.inline.aggs: on
indices.recovery.max_bytes_per_sec: 20mb
3:修改另外三個結點的yaml文件
修改discovery.zen.ping.unicast.hosts: 配置項爲:
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302", "0.0.0.0:9302"]
4:重啓es集羣
前三個結點啓動完畢,啓動第四個結點時報錯以下:
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x000000008a660000, 1973026816, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1973026816 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /tmp/hs_err_pid9963.log
這個錯誤的意思是JVM運行內存不足,解決辦法是增長虛擬機內存,同時刪除es4目錄下data目錄下的數據 而後重啓elasticsearch集羣,重啓logstash:
歐了,到這裏靈活的添加結點咱們也完成了
ES集羣的監控
網上查看資料相應的插件有
bigdesk:https://github.com/hlstudio/bigdesk
paramedic:https://github.com/karmi/elasticsearch-paramedic
kopf:https://github.com/lmenezes/elasticsearch-kopf
因爲大部分插件只支持es2.x,因此這裏採用bigdesk
1:下載
git clone https://github.com/hlstudio/bigdesk.git
2:進入該目錄,在瀏覽器中打開index.html
效果圖以下,能夠進行刷新時間設置,查看不一樣結點狀況
結束
吾之初心,永世不忘
「請問祖安怎麼走?」 「順着這條金屬小道,一直走就是了。」 「請問諾克薩斯怎麼走?」 「沿着這條沾滿鮮血的道路,一直走就是了。」 「請問德瑪西亞怎麼走?」 「德瑪西亞,沒有走的方法,德瑪西亞就在你內心,若是你有一顆德瑪西亞人的心,有草叢的地方,就是德瑪西亞了。」