引言
对于 Elasticsearch 的说明在这里我就不赘述了。
- 我对其的了解也只是停留在可以对文档全文搜索这方面,了解浅薄不再描述。
- 官方文档对它有一个很系统,很权威的说明。
详细了解可查看以下权威:
官方文档
维基百科
正文
安装方式
进入 Elasticsearch 官方的下载页面,可以看到如下图所示的几种下载方式,同时也对应了几种安装方式。
本文中是针对与 LINUX sha asc 方式(Linux解压即用)。
下载
有人可能不太清楚具体去哪里下载,我建议大家通过官网下载(其他技术一样)。
Elasticsearch 官网地址 :https://www.elastic.co/cn/
进入首页,点击导航栏的下载按钮
以上是通过页面下载,而我们安装往往是在服务其操作。虽说这样下载之后将安装包拷贝也是一种方式这未免有些麻烦。
下面将介绍如何通过命令行下载。
#wget下载
wget -c https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.1-linux-x86_64.tar.gz
#curl下载
curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.1-linux-x86_64.tar.gz
以上两种命令都可以下载具体使用按照个人习惯。
关于后面的下载地址获取仍然需要通过页面操作获取,下图是我获取历史版的下载地址方式。
安装
安装 Elasticsearch ,这里称为安装不如称之为解压。
#解压
cd /home
tar -xvf /home/tar/elasticsearch-7.1.1-linux-x86_64.tar.gz
#查看包内容
ll elasticsearch-7.1.1/
总用量 484
drwxr-xr-x. 2 es es 4096 5月 23 22:06 bin
drwxr-xr-x. 2 es es 195 6月 25 14:21 config
drwxrwxr-x. 3 es es 19 6月 22 14:43 data
drwxr-xr-x. 8 es es 96 5月 23 22:06 jdk
drwxr-xr-x. 3 es es 4096 5月 23 22:06 lib
-rw-r--r--. 1 es es 13675 5月 23 22:01 LICENSE.txt
drwxr-xr-x. 2 es es 4096 6月 25 14:30 logs
drwxr-xr-x. 29 es es 4096 5月 23 22:06 modules
-rw-r--r--. 1 es es 447478 5月 23 22:06 NOTICE.txt
drwxr-xr-x. 3 es es 16 6月 22 15:53 plugins
-rw-r--r--. 1 es es 8478 5月 23 22:01 README.textile
启动
启动 Elasticsearch 真的是存在很多的坑,当时我就有点脑瓜疼。具体遇到的坑我将在下面意义描述。
#进入解压路径,以下命令都将在此路径下执行,以后将不再赘述
cd /home/elasticsearch-7.1.1
#启动
./bin/elasticsearch
当你执行完此命令后立刻就来了如下惊喜:
[2019-06-27T11:19:17,622][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [bogon] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-7.1.1.jar:7.1.1]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.1.1.jar:7.1.1]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:102) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:169) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:325) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.1.1.jar:7.1.1]
... 6 more
通过查找发现 Elasticsearch 不能够使用 root 用户启动,惊不惊喜意不意外。解决方式如下:
#添加组
groupadd es
#添加用户,并将用户分配到es组中。前面的es表示组
useradd -g es es
#递归修改文件的所有者
chown -R es /home/elasticsearch-7.1.1
#递归修改文件的所属组
chgrp -R es /home/elasticsearch-7.1.1
#切换用户
su es
#重新启动
./bin/elasticsearch
#验证,在本机测试其他外置测试无效
curl localhost:9200
{
"name" : "bogon",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "DtiWFWRqToqJAkeVvMSu9w",
"version" : {
"number" : "7.1.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "7a013de",
"build_date" : "2019-05-23T14:04:00.380842Z",
"build_snapshot" : false,
"lucene_version" : "8.0.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
到此启动正常,但是这种方式运行独占一个终端使得我们无法在此终端进行其他工作,迫使我们还要开启另一个终端这往往不是我们想要的,如何使 Elasticsearch 后台运行呢?下面给大家介绍两种方式
# Elasticsearch 内置后台运行参数
./bin/elasticsearch -d
#使用nohup + command line + &,运行此命令之后连续回车即可
nohup ./bin/elasticsearch &
停止
Elasticsearch 内部并没有停止的命令,如要停止服务我们需要通过 Linux 命令进行停止。
#kill -9 pid
kill -9 9200
kill -9 : 强制退出
kill -15 : 优雅退出
以上提出的退出方式可能会造成大家存在一个疑问:为什么不使用优雅退出?不是不用,而是不管用。在这里告诉大家:后台运行时使用 kill -15 退出无法结束 Elasticsearch ;前台运行使用 control + z 退出依然无效。若你以上述所说的方式退出之后,在启动 Elasticsearch 日志中将会打印如下错误。
[2019-06-27T11:35:54,052][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [bogon] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: failed to obtain node locks, tried [[/home/module/elasticsearch-7.1.1/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:163) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-7.1.1.jar:7.1.1]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.1.1.jar:7.1.1]
Caused by: java.lang.IllegalStateException: failed to obtain node locks, tried [[/home/module/elasticsearch-7.1.1/data]] with lock id [0]; maybe these locations are not writable or multiple nodes were started without increasing [node.max_local_storage_nodes] (was [1])?
at org.elasticsearch.env.NodeEnvironment.(NodeEnvironment.java:297) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.node.Node.(Node.java:272) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.node.Node.(Node.java:252) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Bootstrap$5.(Bootstrap.java:211) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:211) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:325) ~[elasticsearch-7.1.1.jar:7.1.1]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.1.1.jar:7.1.1]
... 6 more
全程访问
由于本人是在虚拟机上安装 Elasticsearch 我希望能够可以在我本机可以访问,当我在浏览器中敲入 http://192.168.82.92:9200(192.168.82.92本人虚拟机地址)访问出现404的错误。
- 确认是否是防火墙问题
以下命令以 root 用户执行以免操作期间提示无权限
#确认防火墙运行状态
systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 四 2019-06-27 19:10:31 CST; 7h left
Docs: man:firewalld(1)
Main PID: 671 (firewalld)
CGroup: /system.slice/firewalld.service
└─671 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
#防火墙正常运行,确认端口是否开启
firewall-cmd --query-port=9200/tcp
no
解决方案
#关闭防火墙(计算机重启仍然会启动)
systemctl stop firewalld
#禁止防火墙计算机重启重启
systemctl disable firewalld
#启动防火墙,开启端口
firewall-cmd --zone=public --add-port=9200/tcp --permanent
#刷新生效
firewall-cmd --reload
若以开通端口的形式,建议同时开启9200与9300两个端口,便于后期开发免得又出现错误。
9200 端口 : Elasticsearch 在除java之外的其他语言可以使用 RESTful API 通过端口 9200 和 Elasticsearch 进行通信,你可以用你最喜爱的 web 客户端访问 Elasticsearch 。事实上,正如你所看到的,你甚至可以使用 curl 命令来和 Elasticsearch 交互。
9300 端口 : Elasticsearch 的Java 客户端(节点客户端[Node client],传输客户端[Transport client])都是通过 9300 端口并使用 Elasticsearch 的原生传输协议和集群交互。集群中的节点通过端口 9300 彼此通信,如果这个端口没有打开,节点将无法形成一个集群。
继续测试你会发现仍然访问不到。
- 确认配置问题
#查看配置文件
vi config/elasticsearch.yml
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
#network.host: 192.168.0.1
#
# Set a custom port for HTTP:
#
#http.port: 9200
#
# For more information, consult the network module documentation.
修改 Network 相关配置
取消 network.host: 192.168.0.1 并将地址修改 0.0.0.0 或者 192.168.82.92(Elasticsearch 安装服务器IP)
取消 http.port: 9200 行的注解
#重新启动 Elasticsearch
./bin/elasticsearch
#无法启动,并且在日志的最后看到如下信息
ERROR: [3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[3]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
按照其实信息修改。
[1][2]使用 root 用户,[3]使用es
#修复[1]错误 : linux限制进程的最大打开文件数
vi /etc/security/limits.conf
#在末尾添加如下内容保存即可,es为用户名
es - nofile 65536
#修复[2]错误 : ES使用的虚拟内存太小,此处调节为建议最小大小(以下命令在服务器重启后会失效)
sysctl -w vm.max_map_count=262144
#永久修复[2]错误 (在 /etc/sysctl.conf 中添加 vm.max_map_count=262144)
echo "vm.max_map_count=262144" > /etc/sysctl.conf
#查看内容
sysctl -p
#修复[3]错误 : 需要至少配置discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes中的一个,此处配置cluster.initial_master_nodes
vi config/elasticsearch.yml
#取消 #cluster.initial_master_nodes: ["node-1", "node-2"]此行注解,并修改为一下内容,192.168.82.92(Elasticsearch 安装服务器IP)
cluster.initial_master_nodes: ["192.168.82.92"]
重启启动,再次访问 http://192.168.82.92:9200/ ,页面返回如下结果说明OK了。
以上配置是为了让大家熟悉 elasticsearch 的配置异常有助于大家对 elasticsearch 的学习,下面将粘贴我的配置当然也是最简单的配置。
#配置es的集群名称
cluster.name: my-application
#节点名
node.name: node-1
#锁定内存,防止在运行期间内存大小变动影响 elasticsearch 的性能
bootstrap.memory_lock: true
#允许访问的ip,0.0.0.0表示任意ip可以访问。也可直接配置为本机 IP(访问只能使用 IP )
network.host: 0.0.0.0
#对外端口
http.port: 9200
#集群其他节点IP,只有一个节点写本机ip
discovery.zen.ping.unicast.hosts: ["192.168.82.92"]
#集群节点数量
gateway.recover_after_nodes: 1
额外配置请参考配置说明
配置说明(Elasticsearch7)
为了能够更好的配置 elasticsearch 下面将抄录一份中文配置说明,以便于大家更好的配置 elasticsearch 使它在我们所只用的地方发挥更大的作用。
cluster.name: elasticsearch
#配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
node.name: “Franz Kafka”
#节点名,默认随机指定一个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即为本地文件系统,可以设置为本地文件系统,分布式文件系统,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节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。
#下面是一些查询时的慢日志参数设置
index.search.slowlog.level: TRACE
index.search.slowlog.threshold.query.warn: 10s
index.search.slowlog.threshold.query.info: 5s
index.search.slowlog.threshold.query.debug: 2s
index.search.slowlog.threshold.query.trace: 500ms
index.search.slowlog.threshold.fetch.warn: 1s
index.search.slowlog.threshold.fetch.info: 800ms
index.search.slowlog.threshold.fetch.debug:500ms
index.search.slowlog.threshold.fetch.trace: 200ms
参考
Elasticsearch入门(一):CentOS 7.6 安装ES 7.0.0
elastic search报错——“failed to obtain node locks”
Elasticsearch 交互
CentOS7上ElasticSearch安装填坑记
centos7安装elasticsearch7并集成IK中文分词器添加系统服务开机启动