最近对新版本的ES进行测试,现在整理一下。
一、Elasticsearch 7.x 特性
ES 7.0是2019年4月份发布的,底层是Lucence 8.0。其新特性有:
1、废除单个索引下多Type的支持
2、彻底废弃_all字段支持,为提升性能默认不再支持全文检索
3、新增应用程序主动检测功能,搭配对应版本的kibana,用户可监测应用服务的健康状态,并在出现问题后及时发出通知
4、取消Query结果中的Hits Count的支持(聚合查询除外),使得查询性能大幅提升。这就意味着,每次查询后将不能得到精确的结果集数量
5、完整的High Level REST Client,对于java编程,建议采用该方式操作ES集群
6、新增间隔查询(Intervals Queries),用户可设置多字符串在文档中出现的先后顺序进行检索
7、新增Script Score Query,通过此操作,用户可以精确控制返回结果的score分值
8、引入新的集群协调子系统,缩减配置项提升稳定性。时间戳纳秒级支持,提升数据精度
9、自带jdk,所以在安装ES时不再需要单独下载和配置JAVA_HOME。
10、不会再有OOM的情况,JVM引入了新的circuit breaker(熔断)机制,当查询或聚合的数据量超过单机处理的最大内存限制时会被截断,并抛出异常。
11、默认Primary Shard数从5到1,避免Over Sharding;
12、TOP-K检索更快,即查询相关性速度优化,采用Weak-AND算法,核心原理:取TOP N结果集,估算命中记录数。
一般我们在计算文本相关性的时候,会通过倒排索引的方式进行查询,通过倒排索引要比全量遍历节约大量时间,但有时仍然很慢。原因时很多时候我们其实只是想要top n个结果,一些结果明显较差的也进行了复杂的相关性计算,而weak-and算法通过计算每个词的贡献上限来估计文档的相关性上限,从而建立一个阈值对倒排中的结果进行剪枝,从而得到提速的效果。
二、Elasticsearch7.3.2安装步骤
下载地址:https://www.elastic.co/cn/downloads/elasticsearch
如上图,下载对应需要的 ES,ES 支持 Docker 方式启动。ES 7.x 不需要本地 JDK 环境支持:
ES 5,安装需要 JDK 8 以上;ES 6.5,安装需要 JDK 11 以上;ES 7.3.2,内置了 JDK 12
1、解压(我用的是linux,下载的elasticsearch-7.3.2-linux-x86_64.tar.gz)
tar -xzf elasticsearch-7.3.2-linux-x86_64.tar.gz
cd elasticsearch-7.3.2/
目录结构说明:
bin :脚本文件,包括 ES 启动 & 安装插件等等
config : elasticsearch.yml(ES 配置文件)、jvm.options(JVM 配置文件)、日志配置文件等等
JDK : 内置的 JDK,JAVA_VERSION=“12.0.2”
lib : 类库
logs : 日志文件
modules : ES 所有模块,包括 X-pack 等
plugins : ES 已经安装的插件。默认没有插件
JVM堆内存大小的设置,请参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/heap-sizing.html
2、启动 Elasticsearch
启动方式很简单,进入bin目录,直接./elasticsearch
刚开始我是用的root用户启动的,报如下错误:
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
[2019-09-17T19:47:26,884][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [iZ2zednnrz8j330kpcso5eZ] 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.3.2.jar:7.3.2]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) ~[elasticsearch-7.3.2.jar:7.3.2]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.3.2.jar:7.3.2]
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-7.3.2.jar:7.3.2]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.3.2.jar:7.3.2]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:115) ~[elasticsearch-7.3.2.jar:7.3.2]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.3.2.jar:7.3.2]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:105) ~[elasticsearch-7.3.2.jar:7.3.2]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:172) ~[elasticsearch-7.3.2.jar:7.3.2]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[elasticsearch-7.3.2.jar:7.3.2]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) ~[elasticsearch-7.3.2.jar:7.3.2]
... 6 more
ES提示在root用户下是不能启动的,所以就需要增加一个用户es。
#添加用户
adduser es
#设置密码
passwd es
---------------
#授权,root用户下
chmod -v u+w /etc/sudoers
#编辑
vim /etc/sudoers
#文件中插入,在root用户的下面(NOPASSWD:ALL,使用sudo时不用输密码)
es ALL=(ALL) NOPASSWD:ALL
#收回权限
chmod -v u-w /etc/sudoers
---------------
#添加分组
groupadd testgroup
usermod -G testgroup es
#修改es目录的访问权限
chown -R es:testgroup *
用户es创建完成后,直接启动。然而启动又报错了,如下:
查看了下资料发现,是我linux版本的问题导致的。
因为Centos6不支持SecComp,而ES默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动解决:修改elasticsearch.yml 添加一下内容 :
#bootstrap.memory_lock: true
bootstrap.system_call_filter: false
然后保存后,就ok了。
1、报max_map_count错误:
解决办法:
修改配置sysctl.conf
sudo vi /etc/sysctl.conf
添加下面配置:vm.max_map_count=655360,并执行命令:sysctl -p
2、报max file descriptors错误:
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
解决办法:
编辑 /etc/security/limits.conf,追加以下内容(*为所有用户,可指定用户):
* soft nofile 65536
* hard nofile 65536
此文件修改后需要重新登录用户,才会生效
如果让ES在后台保持运行,可以使用:nohup ./elasticsearch >es.log 2>&1 &
nohup ./elasticsearch 1>/dev/null 2>&1 &
打开新的窗口访问一下:curl ‘127.0.0.1:9200’,返回如下内容,说明单节点的ES已经启动成功了。
name : 默认启动的时候指定了 ES 实例名称
cluster_name : 默认名为 elasticsearch
version :版本信息
可以通过curl ‘127.0.0.1:9200/_cat/nodes/v’ ,可以看到当前节点的信息,如下:
#健康检查
curl '127.0.0.1:9200/_cat/health?v'
#查询es中所有索引,所有已存在的索引
curl '127.0.0.1:9200/_cat/indices?v'
#创建新的索引【索引要求是全小写字符,可以有下划线隔开】
curl -XPUT 127.0.0.1:9200/my_new_index?pretty
在给索引添加数据时,需要注意,由于7.x不再支持创建type,但实际上并未彻底去掉type,而是提供了默认值“_doc”。
执行添加文档:
curl -XPUT 127.0.0.1:9200/my_new_index/_doc/1pretty -d ‘{“name”:“zhangsan”,“age”:“33”}’
结果报错了。。。
{“error” : “Content-Type header [application/x-www-form-urlencoded] is not supported”,“status” : 406}
找到问题后,执行下面的命令就可以了。
curl -H “Content-Type: application/json” -XPUT 127.0.0.1:9200/my_new_index/_doc/1pretty -d ‘{“name”:“张三”,“age”:“33”}’
查看数据
curl -XGET 127.0.0.1:9200/my_new_index/_doc/1pretty
**补充:**官方给的消息是从6.8 和 7.1 开始默认提供安全插件,已经不需要付费购买了,配置起来也很简单。
第一步:切换到elastsearch的目录下,使用下列命令生成证书
bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass ""
第二步:打开config/elasticsearch.yaml,在尾部添加下面一行代码:
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
第三步:自动生成好几个默认用户和密码
启动elasticsearch,新打开一个终端,使用cd命令切换到elasticsearch目录,然后使用bin/elasticsearch-setup-passwords auto 命令自动生成好几个默认用户和密码。
三、ES集群的配置
直接把elasticsearch.yml的配置贴出来:
# ---------------------------------- Cluster -----------------------------------
# Use a descriptive name for your cluster:
cluster.name: intellis-7.4.2
# ------------------------------------ Node ------------------------------------
# Use a descriptive name for the node:
node.name: node-2
# Path to directory where to store the data (separate multiple locations by comma):
path.data: /data/apps/middle/es/elasticsearch-7.4.2/data
# Path to log files:
path.logs: /data/apps/middle/es/elasticsearch-7.4.2/logs
# Set the bind address to a specific IP (IPv4 or IPv6)
network.host: 172.59.30.254
# Set a custom port for HTTP:
http.port: 9202
#集群服务的端口,默认为9300
transport.tcp.port: 9300
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
discovery.seed_hosts: ["172.59.30.51:9300","172.59.30.254:9300","172.59.30.99:9300"]
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
cluster.initial_master_nodes: ["node-1","node-2","node-3"]
#此处我使用了sql插件,所以需要禁用ES默认sql插件
xpack.sql.enabled: false
安全认证是在7.6上操作。
1、集群身份认证
在elasticsearch.yml配置文件中加入
xpack.security.enabled: true
2、生成证书
在创建过程中加入密码
./bin/elasticsearch-certutil ca
会生成elastic-stack-ca.p12,将证书copy到config下,命名为elastic-certificates.p12。所有集群节点共用同一个证书文件,将elastic-certificates.p12拷贝到其它节点上。
3、配置elasticsearch.yml文件
#开始加过了,不要重复
#xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.keystore.type: PKCS12
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.type: PKCS12
xpack.security.audit.enabled: true
4、将证书密码加入到你的Elasticsearch keystore中
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
启动每一个节点。所有节点启动完成后,生成用户密码。
5、集群创建用户密码
需要保证存在master节点,在一个节点上创建就可以了。
#手动创建密码
./bin/elasticsearch-setup-passwords interactive
#自动创建密码
./bin/elasticsearch-setup-passwords auto