1、ElasticSearch简介
ElasticSearch 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch 是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch 来解决所有这些问题以及可能出现的更多其它问题。
2、部署准备
2.1、环境准备
-
可用的yum源
-
可联网的Linux环境一台(不安装插件则不需要)
2.2、节点配置信息
IP地址 | 主机名 |
192.168.23.1 | risen01 |
192.168.23.2 | risen02 |
192.168.23.3 | risen03 |
2.3、节点资源配置信息
IP地址 | 角色 |
192.168.23.1 | 候选主节点(master node) |
192.168.23.2 | 数据节点(data node) |
192.168.23.3 | 数据节点(data node) |
3、集群配置与启动
3.1安装包上传与解压
操作节点:risen01
操作用户:root
1. 上传安装包elasticsearch-5.4.3.tar.gz和jdk-8u161-linux-x64.tar.gz 到 risen01节点下的~/packages目录下,结果如图所示:
2. 解压JDK安装包和elasticsearch安装包到/usr/local下
操作节点:risen01
操作用户:root
解压JDK命令:
tar -zxvf ~/packeages/jdk-8u161-linux-x64.tar.gz -C /usr/local
解压es命令:
tar -zxvf ~/packages/elasticsearch-5.4.3.tar.gz -C /usr/local
3.2、启动前准备
操作节点:risen01,risen02,risen03
操作用户:root
1. 在/data目录下新建立elasticsearch目录用来存放es数据
2. 在/log目录下新建立elasticsearch目录用来存放es日志
3.3、修改配置文件
3.3.1. 为es5指定JDK1.8
操作节点:risen01
操作用户:bigdata
修改/usr/local/elasticsearch-5.4.3/bin下的elasticsearch启动文件,在#!/bin/bash下新添加下面一行代码:
export JAVA_HOME=/usr/local/jdk1.8.0_161
3.3.2. 修改es5配置文件
操作节点:risen01
操作用户:bigdata
注意:严格遵守配置文件中的缩进空格,并且属性值不支持大写字母,同时在ES5和ES2版本之间很多配置项存在很大的变动,具体合理的配置还是要根据集群整体资源,业务需求以及数据量等多因素综合考虑的。
修改/usr/local/elasticsearch-5.4.3/config目录下的elasticsearch.yml配置文件,下面我们详细介绍一下集群的具体配置:
#集群名称
cluster.name:risen-cluster
#节点名称
node.name: master
#这里我们选择risen01只作为master并不作为数据存储节点
node.master: true
node.data: false
# 设置es的日志目录
path.logs: /log/elasticsearch
# 设置es的数据目录
path.data: /data/elasticsearch
# 当JVM开始写入交换空间时(swapping)ElasticSearch性能会低下,你应该保证它不会写入交换空间
# 设置这个属性为true来锁定内存,同时也要允许elasticsearch的进程可以锁住内存
bootstrap.memory_lock: false
#Centos6不支持SecComp,而默认为true会进行检测导致启动失败
bootstrap.system_call_filter: false
#同时设置bind_host和publish_host上面两个参数
network.host: 192.168.23.1
#设置节点间交互的tcp端口,默认是9300
transport.tcp.port: 9300
#设置是否压缩tcp传输时的数据,默认为false,不压缩
transport.tcp.compress: true
#设置对外服务的http端口,默认为9200
http.port: 9200
#使用http协议对外提供服务,默认为true,开启
http.enabled: false
# 使用head等插件监控集群信息,需要打开以下配置项
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-credentials: true
#一个集群中的N个节点启动后,才允许进行恢复处理
gateway.recover_after_nodes: 1
#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
# 注意: 合理的设置以上参数能有效的提高集群节点的数据恢复以及初始化速度
#Discovery
# 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点.默认为1,对于大的集群来说,可以设置大一点的值(2-4)
discovery.zen.minimum_master_nodes: 1
# 这是一个集群中的主节点的初始列表,当节点(主节点或者数据节点)启动时使用这个列表进行探测
discovery.zen.ping.unicast.hosts:["risen01:9300","risen02:9300","rien03:9300"]
# es保护机制是否允许删除索引或者正则
action.destructive_requires_name: true
action.auto_create_index: false
3.3.3. 分发其他节点机器
操作节点:risen01
操作用户:root
执行命令:
scp -r /usr/local/elasticsearch-5.4.3/ root@risen02:/usr/local/
scp -r /usr/local/elasticsearch-5.4.3/ root@risen03:/usr/local/
3.3.4. 修改data node权限
操作节点:risen02,risen03
操作用户:root
执行命令:
chown -R bigdata.bigdata /usr/local/elasticsearch-5.4.3
新建data node日志目录和数据目录并修改权限:
结果如图所示:
3.3.5. 修改data node配置文件
操作节点:risen02,risen03
操作用户:bigdata
(1) 修改risen02 ElasticSearch 配置文件
vim /usr/local/elasticsearch-5.4.3/config/elasticsearch.yml,修改内容:
node.name: slave1
node.master: false
node.data: true
network.host: 192.168.23.2
(2) 修改risen03 ElasticSearch 配置文件
vim /usr/local/elasticsearch-5.4.3/config/elasticsearch.yml,修改内容:
node.name: slave2
node.master: false
node.data: true
network.host: 192.168.23.3
其它内容保持不变即可后面可根据实际需求再次调整集群配置以提高性能。
3.3.6. 修改权限
操作节点:risen01,risen02,risen03
操作用户:root
说明:elasticsearch启动不支持root启动故需要其他用户启动,这里我们用开始创建好的bigdata用户(每台机器已提前创建bigdata用户完毕),并赋权给bigdata用户
chown -R bigdata.bigdata /log/elasticsearch
chown -R bigdata.bigdata /data/elasticsearch
chown -R bigdata.bigdata /usr/lcoal/elasticsearch-5.4.3
chown -R bigdata.bigdata /usr/lcoal/jdk1.8.0_161
3.4、启动集群
1. 启动步骤
操作节点:risen01,risen02,risen03
操作用户:bigdata
说明:第一次启动可能出现环境的问题,请查看最后【报错和警告问题】解决方案是否能有所帮助
risen01操作:进入到/usr/local/elasticsearch-5.4.3执行:bin/elasticsearch,结果如图所示:
risen02操作:进入到/usr/local/elasticsearch-5.4.3执行:bin/elasticsearch,结果如图所示:
此时会发现risen01启动界面出现了下图所示情况:
这就说明已经将新的risen02节点加入到了集群中,而risen01已经自动检测到。risen03操作:进入到/usr/local/elasticsearch-5.4.3,执行:bin/elasticsearch,结果如图所示:
同样此时会发现risen01启动界面出现上面添加节点的信息,如果启动成功risen01会自动检测。
2. 后台运行,到此我们所有的节点都已启动完毕,在各个节点启动成功后再启动命令后面加上-d即可后台运行,命令:
bin/elasticsearch -d
3. 然后在任意节点执行查看节点信息命令:
curl risen01:9200/_cat/nodes?v
结果如图所示:
可以看出我们的节点配置情况符合预期。
4、可视化插件安装
4.1、head插件安装
说明:由于es5的head插件服务需要grunt启动,而安装grunt必须要安装npm和node命令
4.1.1、安装前准备
- Elasticsearch-head插件
-
可用的yum源
4.1.2、安装编译环境
操作节点:联网机器和risen01
操作用户:root
执行命令:
yum install -y gcc gcc-c++ make
4.1.3、安装npm和node
操作节点:risen01
操作用户:root
说明:因为我这里联网机器已经安装自带npm和node命令故现在在risen01上演示一下如何安装
(1)解压node-v6.11.0-linux-x64.tar.xz包,命令:
xz -d ~/packages/node-v6.11.0-linux-x64.tar.xz
此时会生成一个/node-v6.11.0-linux-x64.tar的压缩包。
(2)解压/node-v6.11.0-linux-x64.tar包,命令:
tar -xvf node-v6.11.0-linux-x64.tar -C /usr/local/node/
(3)环境变量设置
修改/etc/profile文件,修改内容如下图所示:
然后执行命令:
source /etc/profile
验证环境变量是否添加成功
出现上图所示则表示安装成功。
4.1.4、安装grunt
操作节点:联网机器
操作用户:root
(1)将下载下来的elasticsearch-head插件上传至联网机器的任意目录,然后解压并重命名为head
(2)进入head目录执行命令:
npm install -g grunt --registry=https://registry.npm.taobao.org
结果如图下所示:
(3)将/root/.nvm/versions/node/v9.5.0/lib/下node_modules目录拷贝到head目录下
(4)修改head目录下的Gruntfile.js文件,在connect出新增属性:
hostname:’192.168.23.1’,
保存并退出
说明:这里的端口9100是访问head的端口,为了避免端口冲突,可进行修改
结果如图所示:
(5)打包elasticsearch-head插件,执行命令:
zip -q -r head.zip head/*
(6)将联网机器上打包好的head.zip插件下载到本地,并上传至risen01的/usr/local/elasticsearch-5.4.3目录下并解压即可(不要放在plugins目录下,es5和es2之间有很大的改动)
(7)进入到/usr/local/elasticsearch-5.4.3/head目录执行启动head插件命令:
node_modules/grunt/bin/grunt server
可能出现以下截图报错:
报错原因:缺少很多grunt的依赖
解决:返回到联网机器然后进入到head目录进行逐一安装依赖(命令:
npm install grunt-contrib-clean --registry=https://registry.npm.taobao.org
npm install grunt-contrib-watch --registry=https://registry.npm.taobao.org
npm install grunt-contrib-connect --registry=https://registry.npm.taobao.org
npm install grunt-contrib-copy --registry=https://registry.npm.taobao.org
npm install grunt-contrib-jasmine --registry=https://registry.npm.taobao.org
npm install grunt-contrib-concat --registry=https://registry.npm.taobao.org
),会发现node_modules目录下出现很多新的依赖包,此时却把之前的node_modules目录下grunt这个目录给覆盖了,那么重新执行命令npm install -g grunt --registry=https://registry.npm.taobao.org,然后将两个node_modules进行合并为一个即可。再次打包整个head上传至risen01,并替换之前的head包然后重新启动
结果如图所示:
启动插件成功!
后台运行只需在执行命令后面加上&符号即可
4.1.5、head可视化插件结果
5、报错和警告问题
5.1、内核版本太低
警告内容:
seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER
警告截图:
警告解决:修改elasticsearch.yml中配置在Memory下面添加下面两个属性:
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
5.2、报错整体截图
5.3、无法创建本地文件问题,用户最大可创建文件数太小
报错内容:
[4]ERROR: bootstrap checks failed
[1]max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
报错解决:切换到root用户,编辑limits.conf配置文件, vim /etc/security/limits.conf添加以下内容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
保存并退出即可
5.4、无法创建本地线程问题,用户最大可创建线程数太小
报错内容:
[2]max number of threads [1024] for user [bigdata] likely too low, increase to at least [2048]
报错解决:切换到root用户,进入limits.d目录下,修改90-nproc.conf 配置文件,vi /etc/security/limits.d/90-nproc.conf
找到如下内容:
* soft nproc 1024
修改为
* soft nproc 2048
保存并退出即可
5.5、最大虚拟内存太小
报错内容:[3]max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
报错解决:切换到root用户下,修改配置文件sysctl.conf,vi /etc/sysctl.conf添加下面配置:
vm.max_map_count=655360
保存退出并执行命令即可:
sysctl -p