0%

ElasticSearch 6.6.1 CentOS7 安装与配置

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
2
-Xms31g
-Xmx31g

G1 GC

根据官方文档,开启 G1 GC,只要取消 G1 的注释即可:

这样操作以后,启动的时候会有两个警告。提示 CMS GC 将被弃用。

对于这段注释,很容易让人产生歧义,ES 的做法是如果是 Java 10 以上,ES 会自动忽略 CMS GC,如果不想要警告,可以把 CMS GC 都注释掉。

最终调整后的配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
## GC configuration
#-XX:+UseConcMarkSweepGC
#-XX:CMSInitiatingOccupancyFraction=75
#-XX:+UseCMSInitiatingOccupancyOnly

## G1GC Configuration
# NOTE: G1GC is only supported on JDK version 10 or later.
# To use G1GC uncomment the lines below.
# 10-:-XX:-UseConcMarkSweepGC
# 10-:-XX:-UseCMSInitiatingOccupancyOnly
10-:-XX:+UseG1GC
10-:-XX:InitiatingHeapOccupancyPercent=75

配置文件变更

修改 ElasticSearch 配置文件(/etc/elasticsearch/elasticsearch.yml),注意新版本(对比 2.X)有以下调整:

  • index 的相关配置(如:index.refresh_interval)现在不允许出现在配置文件中

升级Tips

  • string 类型,现在被拆分成 text 类型与 keyword 类型,keyword 类型比较适合做过滤,排序,聚合,但是只能做精确搜索。
  • X-Pack 会被默认安装。并且自动获得 Basic License
  • 动态模板语法的变更。

优化

索引分片与副本

对索引进行手动分割(比如按日期),与对一个索引设置多个分片查询起来几乎是等同的。但是对索引进行手动分割后,可以让你定时的方便清理历史数据。

在执行查询的时候,在结果中可以看到,当前查询操作了多少个分片:

1
2
3
4
5
6
"_shards" : {
"total" : 15,
"successful" : 15,
"skipped" : 0,
"failed" : 0
},

分片是分布式的基础,在老版本(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
######## Start Search Guard Demo Configuration ########
# WARNING: revise all the lines below before you go into production
searchguard.ssl.transport.pemcert_filepath: esnode.pem
searchguard.ssl.transport.pemkey_filepath: esnode-key.pem
searchguard.ssl.transport.pemtrustedcas_filepath: root-ca.pem
searchguard.ssl.transport.enforce_hostname_verification: false
searchguard.ssl.http.enabled: false
searchguard.ssl.http.pemcert_filepath: esnode.pem
searchguard.ssl.http.pemkey_filepath: esnode-key.pem
searchguard.ssl.http.pemtrustedcas_filepath: root-ca.pem
searchguard.allow_unsafe_democertificates: true
searchguard.allow_default_init_sgindex: true
searchguard.authcz.admin_dn:
- CN=kirk,OU=client,O=client,L=test, C=de

searchguard.audit.type: internal_elasticsearch
searchguard.enable_snapshot_restore_privilege: true
searchguard.check_snapshot_restore_write_privileges: true
searchguard.restapi.roles_enabled: ["sg_all_access"]
cluster.routing.allocation.disk.threshold_enabled: false
node.max_local_storage_nodes: 3
searchguard.enterprise_modules_enabled: false
######## End 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
2
3
4
5
6
# 内部用户定义
search-guard-6/sgconfig/sg_internal_users.yml
# 角色权限定义
search-guard-6/sgconfig/sg_roles.yml
# 角色关系映射
search-guard-6/sgconfig/sg_roles_mapping.yml

通过 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
2
3
#!/bin/bash
sudo "/usr/share/elasticsearch/plugins/search-guard-6/tools/sgadmin.sh" -cn "cluster" -cd "/usr/share/elasticsearch/plugins/search-guard-6/sgconfig" -key "/etc/elasticsearch/kirk-key.pem" -cert "/etc/elasticsearch/kirk.pem" -cacert
"/etc/elasticsearch/root-ca.pem" -nhnv