ElasticSearch 6.6.1 发布于 2019-02-20,目前以下已知的新特性:
- 6.5.4 开始支持 Java 11,Java 11 是一个 LTS 版本(发布于2018.9,支持到2026),上一个版本是 Java 8(发布于2014.3,支持到2025)
- 支持 G1 GC
- 基于 Lucense 7.6
- 支持索引生命周期特性
建议 6.x 系列直接使用 6.8.x,因为自 6.8.0 和 7.1.0 开始,
X-PACK
的安全功能免费提供 HTTP Basic 认证与鉴权。
使用官方自带的yum源安装。按照官方文档要求,只要加入 yum 源,即可使用 yum安装(yum源有时候很慢,离线下载使用rpm包是一样的)
安装后的配置目录:/etc/elasticsearch
程序主目录在:/usr/share/elasticsearch
启动脚本: systemctl start elasticsearch
操作系统重要配置
- 配置打开文件数限制为 65536。(重要)
- 关闭和禁用 SWAP。(重要)
- 关闭透明大页面。(重要)
- 虚拟内存大小,调整 vm.max_map_count,如果使用 yum 或 rpm 安装,会自动调整。可通过
sysctl vm.max_map_count
确认,
JVM 配置
为避免潜在风险,可以使用 OpenJDK 11,官网下载解压就可以用。
除了常规设置 JAVA_HOME,环境变量以外,需要创建一个 /usr/bin/java 软连接(ES 默认扫描的位置,OracleJDK 会自动创建):
1 | /usr/bin/java -> /usr/java/jdk-11.0.2/bin/java |
通过修改 jvm.options 配置文件(/etc/elasticsearch/jvm.options
):
堆内存大小
按照官方需求,机器内存最大支持 64G ,一半由 Lucence 和系统占用,一半分配给 ES,保险起见可分配给 ES 31G内存(即使是最新的 6.6.1 虽然支持 G1 GC,但官方仍然不建议分配超过 32G 的大堆)。
1 | -Xms31g |
G1 GC
根据官方文档,开启 G1 GC,只要取消 G1 的注释即可:
这样操作以后,启动的时候会有两个警告。提示 CMS GC 将被弃用。
对于这段注释,很容易让人产生歧义,ES 的做法是如果是 Java 10 以上,ES 会自动忽略 CMS GC,如果不想要警告,可以把 CMS GC 都注释掉。
最终调整后的配置示例:
1 | ## GC configuration |
配置文件变更
修改 ElasticSearch 配置文件(/etc/elasticsearch/elasticsearch.yml
),注意新版本(对比 2.X)有以下调整:
- index 的相关配置(如:
index.refresh_interval
)现在不允许出现在配置文件中
升级Tips
- string 类型,现在被拆分成 text 类型与 keyword 类型,keyword 类型比较适合做过滤,排序,聚合,但是只能做精确搜索。
- X-Pack 会被默认安装。并且自动获得 Basic License
- 动态模板语法的变更。
优化
索引分片与副本
对索引进行手动分割(比如按日期),与对一个索引设置多个分片查询起来几乎是等同的。但是对索引进行手动分割后,可以让你定时的方便清理历史数据。
在执行查询的时候,在结果中可以看到,当前查询操作了多少个分片:
1 | "_shards" : { |
分片是分布式的基础,在老版本(2.x)中分片创建后就无法调整了,只能重建,新版本提供了一定的弹性扩展和收缩的特性。
副本提供故障恢复能力,同时副本对搜索性能有关。
ElasticSearch 推荐最大的 JVM 堆是 30~32G,所以分片容量应该控制在 30G 左右,如果你预估你的数据有 300G,那你应当分配 10 个左右的分片。
另外一个原则,就是根据你的节点数的1.5~3倍来创建分片。如果你只有3个节点,那么你的分片数最好不要超过9个。
IK 中文分词插件
官方地址下载:https://github.com/medcl/elasticsearch-analysis-ik
下载对应的版本,直接放置到插件目录,重新启动即可。
需要注意的是,不同版本的分词结果会有差异(这是当然的)。
Cerebro
以前的 Kopf 插件,换了个马甲,并且现在是一个独立的服务。
提供了一些非常好用的功能,如集群参数配置,索引参数配置,索引管理,索引模板管理,等等。
Cerebro 当前脚本对 java version 的探测有Bug,需要修改下启动脚本,或者这样启动:
1 | nohup /usr/local/cerebro/bin/cerebro -no-version-check & |
SearchGuard
6.6.X 中的 X-pack Basic License 没有提供了安全模块,如果你的 ElasticSearch 需要外网访问,这相当于裸奔。
可以使用 SearchGuard 来提供基础的 Http Basic Auth。
安装
通过 elasticsearch-plugin 安装对应版本的 search-guard:
1 | bin/elasticsearch-plugin install -b com.floragunn:search-guard-6:6.6.1-24.1 |
使用 Demo 证书
SearchGuard 同样需要商业许可。商业许可提供了 Kibana 保护措施,图形化权限管理等等。
因为我们只用来做简单的 ElasticSearch 鉴权保护,所以可以使用生成 Demo 证书
进入 <Elasticsearch directory>/plugins/search-guard-6/tools
目录,执行:
1 | ./install_demo_configuration.sh |
这个命令会自动将相关配置生成到 elasticsearch.yml 配置文件中:
1 | ######## Start Search Guard Demo Configuration ######## |
其中:
- 关闭HTTPS
searchguard.ssl.http.enabled: false
- 关闭企业模块
searchguard.enterprise_modules_enabled: false
并且它会生成额外的配置文件:plugins/search-guard-6/sgconfig
配置文件
配置文件都在:search-guard-6/sgconfig/ 目录下:
1 | # 内部用户定义 |
通过 sg_internal_users.yml 可以看到,默认用户名密码:admin/admin
官方提供了一个密码加密生成工具 search-guard-6/tool/hash.sh
可以用来生成加密字符串。
权限管理
Search Guard配置,如用户,角色和权限,是存储在 ElasticSearch 的索引中的,可以通过两种方式管理配置:
- 使用 Kibana 管理(需要安装 Search Guard Kibana Plugin),只有企业版支持
- 通过 sgadmin 命令行工具
sgadmin 命令行比较复杂,好在官方提供了一个 demo 脚本,稍作修改可以使用:
tools/sgadmin_demo.sh 需要修改去掉 -icl 参数,增加 -cn 参数 “suosi-search”,即增加当前 ES 集群名称
1 | #!/bin/bash |