1. 概述
近期使用到Elasticsearch作为数据的存储与检索引擎,初期安装了2.4.0版本,找对应版本的插件还着实费了些时间。后由于引入spark的版本和Elasticsearch 2.4.0版本不匹配,所以决定将Elasticsearch 升级到5.5.0版本。
升级之后的Elasticsearch感觉在各方面都便捷很多:
- 首先Elastic帮我们把各个组件的版本进行了统一,也把原来比较分散的组件进行了集成,比如在5.x之前各种单独的组件(Shield, Watcher, Marvel, Graph, Reporting)现在都集成到X-Pack中,Sense也集成进了Kibana中。
- 其次是数据类型做了部分改变,Elasticsearch5.0率先集成了Lucene6版本,性能得到很大的提升。据说与之前版本相比,磁盘空间少一半;索引时间少一半;查询性能提升25%;IPV6也支持了。
- ELK(Elasticsearch、Logstash、Kibana)组合中又新增一个开源项目Beats, 从此可以改名:ELKB
2. 部署规划
部署环境此处我使用的windows,但整个部署过程也同样适用于Linux。
2.1 Elasticsearch节点类型介绍
当我们启动Elasticsearch的实例,就会启动至少一个节点。相同集群名的多个节点的连接就组成了一个集群。
在默认情况下,集群中的每个节点都可以处理http请求和集群节点间的数据传输,集群中所有的节点都知道集群中其他所有的节点,可以将客户端请求转发到适当的节点。
节点有以下几个类型:
主(master)节点
node.master设置为True(默认)的时候,它有资格被选作为主节点,控制整个集群。数据(data)节点
在一个节点上node.data设置为True(默认)的时候。该节点保存数据和执行数据相关的操作,如增删改查,搜索,和聚合。客户端(client)节点
当一个节点的node.master和node.data都设置为false的时候,它既不能保持数据也不能成为主节点,该节点可以作为客户端节点,可以响应用户的情况,把相关操作发送到其他节点。部落(tribe)节点
当一个节点配置tribe.*
的时候,它是一个特殊的客户端,它可以连接多个集群,在所有连接的集群上执行搜索和其他操作。
Elasticsearch的data node除了放数据以外,也可以兼任master和client的角色,对于一个规模较大,用户较多的集群,master和client在一些极端使用情况下可能会有性能瓶颈甚至内存溢出,从而使得共存的data node故障。data node的故障恢复涉及到数据的迁移,对集群资源有一定消耗,容易造成数据写入延迟或者查询减慢。
如果将master和client独立出来,一旦出现问题,重启后几乎是瞬间就恢复的,对用户几乎没有任何影响。另外将这些角色独立出来的以后,也将对应的计算资源消耗从data node剥离出来,更容易掌握data node资源消耗与写入量和查询量之间的联系,便于做容量管理和规划。
2.1.1 主(master)节点说明
主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。
默认情况下任何一个集群中的节点都有可能被选为主节点。索引数据和搜索查询等操作会占用大量的cpu,内存,io资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。虽然主节点也可以协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽可能做尽量少的工作。
创建一个独立的主节点只需在配置文件中添加如下内容:
node.master: true
node.data: false
为了防止数据丢失,配置discovery.zen.minimum_master_nodes设置是至关重要的(默认为1),每个主节点应该知道形成一个集群的最小数量的主资格节点的数量。
discovery.zen.minimum_master_nodes解释如下:
该处解释的即通常我们所说的脑裂问题。假设我们有一个集群,有3个主资格节点,当网络发生故障的时候,就有可能其中一个节点不能和其他节点进行通信了。这个时候,当discovery.zen.minimum_master_nodes设置为1的时候,就会分成两个小的独立集群,当网络好的时候,就会出现数据错误或者丢失数据的情况。当discovery.zen.minimum_master_nodes设置为2的时候,一个网络中有两个主资格节点,可以继续工作,另一部分,由于只有一个主资格节点,则不会形成一个独立的集群,这个时候当网络恢复的时候,节点又会重新加入集群。
设置这个值的原则是:
(master_eligible_nodes / 2)+ 1
这个参数也可以动态设置:
PUT localhost:9200/_cluster/settings
{
“transient”: {
“discovery.zen.minimum_master_nodes”: 2
}
}
2.1.2 数据(data)节点说明
数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对cpu,内存,io要求较高,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。数据节点的配置如下:
node.master: false
node.data: true
数据节点路径设置,每一个主节点和数据节点都需要知道分片,索引,元数据的物理存储位置,path.data默认位为 $ES_HOME/data,可以通过配置文件 elasticsearch.yml进行修改,例如:
path.data: /data/es/data/
这个设置也可以在命令行上执行,例如:
./bin/elasticsearch –path.data /data/es/data
这个路径最好进行单独配置,这样Elasticsearch的目录和数据的目录就会分开。当删除了Elasticsearch主目录的时候,不会影响到数据。通过rpm安装默认是分开的。
数据目录可以被多个节点共享,甚至可以属于不同的集群,为了防止多个节点共享相同的数据路径,可以在配置文件elasticsearch.yml中添加:
node.max_local_storage_nodes: 1
注意:在相同的数据目录不要运行不同类型的节点(例如:master, data, client)这很容易导致意外的数据丢失。
2.1.3 客户端(client)节点说明
当主节点和数据节点配置都设置为false的时候,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。
警告:添加太多的客户端节点对集群是一种负担,因为主节点必须等待每一个节点集群状态的更新确认!客户节点的作用不应被夸大,数据节点也可以起到类似的作用。配置如下:
node.master: false
node.data: false
2.1.4 部落(tribe)节点说明
部落节点可以跨越多个集群,它可以接收每个集群的状态,然后合并成一个全局集群的状态,它可以读写所有节点上的数据,部落节点在elasticsearch.yml中的配置如下:
tribe:
t1:
cluster.name: cluster_one
t2:
cluster.name: cluster_two
T1和T2是任意的名字代表连接到每个集群。上面的示例配置两集群连接,名称分别是T1和T2。默认情况下部落节点通过广播可以做为客户端连接每一个集群。大多数情况下,部落节点可以像单节点一样对集群进行操作。
注意:以下操作将和单节点操作不同,如果两个集群的名称相同,部落节点只会连接其中一个。由于没有主节点,当设置local为true事,主节点的读操作会被自动的执行,例如:集群统计,集群健康度。主节点级别的写操作将被拒绝,这些应该是在一个集群进行。部落节点可以通过块(block)设置所有的写操作和所有的元数据操作,例如:
tribe:
blocks:
write: true
metadata: true
部落节点可以也可以在选中的索引块中进行配置,例如:
tribe:
blocks:
write.indices: hk*,ldn*
metadata.indices: hk*,ldn*
当多个集群有相同的索引名的时候,默认情况下,部落的节点将选择其中一个。这可以通过tribe.on_conflict setting进行配置,可以设置排除那些索引或者指定固定的部落名称。
2.2 其他组件介绍
以上对Elasticsearch各节点的作用了解以后,下面对其他需要安装的组件做简单介绍。
2.2.1 Kibana
Kibana 是一个开源的分析和可视化平台,旨在与 Elasticsearch 合作。Kibana 提供搜索、查看和与存储在 Elasticsearch 索引中的数据进行交互的功能。开发者或运维人员可以轻松地执行高级数据分析,并在各种图表、表格和地图中可视化数据。
Kibana可以安装在任意一个节点上,也可每个节点都进行安装。不过一般建议是安装在客户端(client)节点之上,对Elasticsearch进行监控和操作。
2.2.2 X-Pack
X-Pack是一个Elastic Stack的扩展,将安全,警报,监视,报告和图形功能包含在一个易于安装的软件包中。在Elasticsearch 5.0.0之前,您必须安装单独的Shield,Watcher和Marvel插件才能获得在X-Pack中所有的功能。在Elasticsearch 5版本之后,一般情况下只需要安装一个官方推荐的X-pack扩展包即可。
注意:必须在集群中的所有节点安装X-Pack插件。
2.2.3 Head
Head是Elasticsearch的一个前端插件,可以很方便的查看ES的运行状态和数据。
Head插件建议安装在客户端节点上。
2.3 节点规划
测试环境选择了4个节点,1个主(master)节点,2个数据(data)节点,1个客户端(client)节点。
如果你的是多master节点,只需要增加master节点,修改下discovery.zen.minimum_master_nodes参数即可。
节点 | IP | 角色 | 安装组件 |
---|---|---|---|
node1 | 192.168.1.91 | master-1 | es(含x-pack) |
node2 | 192.168.1.92 | data-1 | es(含x-pack) |
node3 | 192.168.1.93 | data-2 | es(含x-pack) |
node4 | 192.168.1.94 | client-1 | es(含x-pack)、kibana(含x-pack)、head |
3. Elasticsearch安装
3.1 JDK安装
每个节点都必须安装jdk环境,安装过程略。
3.2 Elasticsearch环境安装
下载Elasticsearch安装包并解压。
修改配置文件 elasticsearch-5.5.0/config/elasticsearch.yml
.
3.2.1 配置master-1
# 集群名称,保证唯一
cluster.name: duoduozb-es
# 节点名称,仅仅是描述名称,用于在日志中区分
node.name: master-1
# 节点描述,可默认
node.attr.rack: r1
# 是否是master节点,master节点存放元数据
node.master: true
# 是否是data数据节点,data数据节点存放数据
node.data: false
# 是否是ingest节点,ingest节点可以在数据真正进入index前,通过配置pipline拦截器对数据ETL
node.ingest: false
# 数据的存放路径,可挂载多个盘
path.data: C:/bigdata/elasticsearch/es-data/data
# 日志的存放路径
path.logs: C:/bigdata/elasticsearch/es-data/logs
# 当前节点绑定ip
network.host: 0.0.0.0
# 对外提供服务的端口
http.port: 9200
# 集群间通讯端口
transport.tcp.port: 9300
# 设置集群自动发现机器IP集合
discovery.zen.ping.unicast.hosts: ["192.168.1.91:9300", "192.168.1.92:9300", "192.168.1.93:9300", "192.168.1.94:9300"]
# 为了避免脑裂,集群节点数量最少为候选主节点数量 半数+1
discovery.zen.minimum_master_nodes: 1
3.2.2 配置data-1
# 集群名称,保证唯一
cluster.name: duoduozb-es
# 节点名称,仅仅是描述名称,用于在日志中区分
node.name: data-1
# 节点描述,可默认
node.attr.rack: r2
# 是否是master节点,master节点存放元数据
node.master: false
# 是否是data数据节点,data数据节点存放数据
node.data: true
# 是否是ingest节点,ingest节点可以在数据真正进入index前,通过配置pipline拦截器对数据ETL
node.ingest: true
# 数据的存放路径,可挂载多个盘
path.data: C:/bigdata/elasticsearch/es-data/data
# 日志的存放路径
path.logs: C:/bigdata/elasticsearch/es-data/logs
# 当前节点绑定ip
network.host: 0.0.0.0
# 对外提供服务的端口
http.port: 9200
# 集群间通讯端口
transport.tcp.port: 9300
# 设置集群自动发现机器IP集合
discovery.zen.ping.unicast.hosts: ["192.168.1.91:9300", "192.168.1.92:9300", "192.168.1.93:9300", "192.168.1.94:9300"]
# 为了避免脑裂,集群节点数量最少为候选主节点数量 半数+1
discovery.zen.minimum_master_nodes: 1
3.2.3 配置data-2
# 集群名称,保证唯一
cluster.name: duoduozb-es
# 节点名称,仅仅是描述名称,用于在日志中区分
node.name: data-2
# 节点描述,可默认
node.attr.rack: r3
# 是否是master节点,master节点存放元数据
node.master: false
# 是否是data数据节点,data数据节点存放数据
node.data: true
# 是否是ingest节点,ingest节点可以在数据真正进入index前,通过配置pipline拦截器对数据ETL
node.ingest: true
# 数据的存放路径,可挂载多个盘
path.data: C:/bigdata/elasticsearch/es-data/data
# 日志的存放路径
path.logs: C:/bigdata/elasticsearch/es-data/logs
# 当前节点绑定ip
network.host: 0.0.0.0
# 对外提供服务的端口
http.port: 9200
# 集群间通讯端口
transport.tcp.port: 9300
# 设置集群自动发现机器IP集合
discovery.zen.ping.unicast.hosts: ["192.168.1.91:9300", "192.168.1.92:9300", "192.168.1.93:9300", "192.168.1.94:9300"]
# 为了避免脑裂,集群节点数量最少为候选主节点数量 半数+1
discovery.zen.minimum_master_nodes: 1
3.2.4 配置client-1
# 集群名称,保证唯一
cluster.name: duoduozb-es
# 节点名称,仅仅是描述名称,用于在日志中区分
node.name: client-1
# 节点描述,可默认
node.attr.rack: r4
# 是否是master节点,master节点存放元数据
node.master: false
# 是否是data数据节点,data数据节点存放数据
node.data: false
# 是否是ingest节点,ingest节点可以在数据真正进入index前,通过配置pipline拦截器对数据ETL
node.ingest: false
# 数据的存放路径,可挂载多个盘
path.data: C:/bigdata/elasticsearch/es-data/data
# 日志的存放路径
path.logs: C:/bigdata/elasticsearch/es-data/logs
# 当前节点绑定ip
network.host: 0.0.0.0
# 对外提供服务的端口
http.port: 9200
# 集群间通讯端口
transport.tcp.port: 9300
# 设置集群自动发现机器IP集合
discovery.zen.ping.unicast.hosts: ["192.168.1.91:9300", "192.168.1.92:9300", "192.168.1.93:9300", "192.168.1.94:9300"]
# 为了避免脑裂,集群节点数量最少为候选主节点数量 半数+1
discovery.zen.minimum_master_nodes: 1
3.3 浏览器查看
依次启动各节点Elasticsearch服务:
elasticsearch-5.5.0/bin/elasticsearch
使用地址 http://192.168.1.94:9200/ 进行集群访问。显示信息如下:
{
"name" : "client-1",
"cluster_name" : "duoduozb-es",
"cluster_uuid" : "blJJr58QRa2L3YWJ7twkRg",
"version" : {
"number" : "5.5.0",
"build_hash" : "260387d",
"build_date" : "2017-06-30T23:16:05.735Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
4. Kibana安装
4.1 Kibana安装配置
下载Kibana安装包并解压。
修改配置文件 config/kibana.yml
.
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.1.94:9200"
kibana.index: ".kibana"
4.2 浏览器查看
启动Kibana服务:
bin/kibana
使用地址 http://192.168.1.94:5601/ 进行访问。
5. X-Pack安装
5.1 Elasticsearch安装X-Pack
为所有节点的Elasticsearch安装X-Pack插件。
bin/elasticsearch-plugin install x-pack
注意:中途会让你输入两次 Y 表示确认安装。
如果卸载,请执行:
bin/elasticsearch-plugin remove x-pack
5.2 Kibana安装X-Pack
为客户端节点的Kibana安装X-Pack插件。
bin/kibana-plugin install x-pack
如果卸载,请执行:
bin/kibana-plugin remove x-pack
5.3 自定义密码
安装完成X-Pack之后重启Elasticsearch和Kibana。再次登陆Elasticsearch和Kibana,会提示需要输入用户名和密码。
默认用户名:elastic
默认密码:changeme
其中内置了三个账号,分别是:
username | role | 权限 |
---|---|---|
elastic | superuser | 内置的超级用户 |
kibana | kibana_system | 用户kibana用来连接elasticsearch并与之通信。Kibana服务器以该用户身份提交请求以访问集群监视API和 .kibana索引。不能访问index。 |
logstash_system | logstash_system | 用户Logstash在Elasticsearch中存储监控信息时使用 |
可通过以下操作自定义设置各个账号的密码:
./bin/x-pack/setup-passwords interactive
也可通过以下操作进行自动生成密码:
./bin/x-pack/setup-passwords auto
注意:以上设置适用于linux,我在windows安装发现没有上述命令。
在windows上,可以通过登录Kibana进行密码的修改。
注意:设置完Kibana账号密码以后,需要重新启动Kibana服务。
启动Kibana服务之前,还有一项重要的工作,修改kibana.yml,设置连接elasticsearch的用户名和密码,否则如果你已经修改了elasticsearch的默认用户名和密码,启动kibana服务时会提示连接不上elasticsearch的错误。
elasticsearch.username: "elastic"
elasticsearch.password: "elastic"
5.4 启用禁用X-Pack
默认情况下,所有X-Pack功能都被启用;通过修改elasticsearch.yml, kibana.yml以及logstash.yml配置文件;您可以启用或禁用特定的X-Pack功能。
设置 | 描述 |
---|---|
xpack.graph.enabled | 设置为false禁用X-Pack图形功能 |
xpack.ml.enabled | 设置为false禁用X-Pack机器学习功能 |
xpack.monitoring.enabled | 设置为false禁用X-Pack监视功能 |
xpack.reporting.enabled | 设置为false禁用X-Pack报告功能 |
xpack.security.enabled | 设置为false禁用X-Pack安全功能 |
xpack.watcher.enabled | 设置false为禁用观察器 |
6. Head安装
Head主要是可以用比较直观的方式来查看Elasticsearch的所有索引和内容,在5.x中这部分功能被集成在x-pack里,官方已经不太推荐使用,所以如果安装了x-pack,就没必要再次安装head了。如果不想安装x-pack,需要单独安装head插件,在此记录下安装步骤。
6.1 官方介绍
elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序,可以通过插件把它集成到es,很方便对es进行各种操作的客户端。
github地址:https://github.com/mobz/elasticsearch-head
6.2 安装步骤
elasticsearch5.0以上版本不支持直接安装head插件,需要启动一个服务。
因为head插件本质上还是一个nodejs的工程,因此需要安装node,使用npm来安装依赖的包。
(1) 下载nodejs: https://nodejs.org/en/download/ 此处选择v8.12.0版本。
nodejs安装完成后,npm会被自动安装。可以使用 node -v
和 npm -v
查看版本。
(2) 使用npm安装grunt:
npm install -g grunt-cli
(3) 在elasticsearch-head-master目录下,运行命令:
npm install
(4) 编辑elasticsearch-5.5.0/config/elasticsearch.yml,加入以下内容:
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
(6) 在elasticsearch-head-master/目录下,运行启动命令:
grunt server
(7) 浏览器访问:
如果elasticsearch未安装x-pack,是不需要步骤(4)的,以上步骤完成以后,在浏览器输入以下地址访问:
但是前面我们安装了x-pack,并重新设置了密码。此时必须有步骤(4),并且浏览器中访问形式如下:
http://192.168.1.94:9100/?auth_user=elastic&auth_password=elastic
7. 其他插件安装
7.1 IK分词插件
7.1.1 介绍
IK分词插件是我们较常用的中文分词插件。
github地址:https://github.com/medcl/elasticsearch-analysis-ik
7.1.2 安装
版本选择与elasticsearch对应的版本。比如我的elasticsearch版本为5.5.0,选择的ik的版本也是5.5.0.
(1) 下载安装包并解压到 elasticsearch-5.5.0plugins
目录下,重命名为 analysis-ik
.
拷贝analysis-ik下的config文件夹到 elasticsearch-2.4.0config
目录下,并重命名为 ik
。
重启ES.
所有节点均需以上安装操作。
7.2 pinyin插件
7.2.1 介绍
有时在淘宝搜索商品的时候,会发现使用汉字,拼音,或者拼音混合汉字都会出来想要的效果,该功能就是通过拼音搜索插件实现的。
github地址:https://github.com/medcl/elasticsearch-analysis-pinyin
7.2.2 安装
在地址 https://github.com/medcl/elasticsearch-analysis-pinyin/releases 选择对应的版本下载。
将安装包解压到 elasticsearch-5.5.0plugins
目录下,并重命名为 'pinyin'.
重启ES.
所有节点均需以上安装操作。
8. 总结
以上内容也参考了很多其他大神的总结,此处就不一一列出博客地址了。在此对你们的付出表示感谢。