7.7.1
elasticsearch-7.7.1-x86_64.rpm
和 elasticsearch-7.7.1-aarch64.rpm
集群中共有3个节点,分别为:ecs12
、ecs13
、ecs14
。对应的 hosts 表如下:
ecs12 192.168.11.12
ecs13 192.168.11.13
ecs14 192.168.11.14
Elasticsearch 的数据目录定为:/data/elasticsearch
。
在每个节点上解压安装并配置环境变量
rpm -ivh elasticsearch-7.7.1-x86_64.rpm
# 设置环境变量
export PATH=$PATH:/usr/share/elasticsearch/bin
建议将环境变量配置到 /etc/profile
中永久生效。
在集群的一个节点上配置即可,当前在 ecs12
上生成 CA:
# 在 ecs12 上生成 CA
cd /usr/share/elasticsearch
elasticsearch-certutil ca
然后生成证书以及私钥:
elasticsearch-certutil cert --ca elastic-stack-ca.p12
执行完后会在当前目录下会生成 elastic-certificates.p12
文件。
将生成的 CA 移动到 Elasticsearch 的证书目录:
# 创建 Elasticsearch 证书目录
mkdir /etc/elasticsearch/cert
mv elastic-stack-ca.p12 elastic-certificates.p12 /etc/elasticsearch/cert
最后将 CA 和证书文件远程发送到其他的节点:
scp -r /etc/elasticsearch/cert ecs13:/etc/elasticsearch
scp -r /etc/elasticsearch/cert ecs14:/etc/elasticsearch
在每台机器上设置权限:
# 所有机器都需要执行
chown -R elasticsearch:elasticsearch /etc/elasticsearch/cert
由于 Elasticsearch 各个节点上的配置文件基本上是一致的,所以建议先在其中一个节点上进行配置,最后再一块同步至其他节点进行修改,我们下面以 ecs12
为例进行配置。
首先在 ecs12
上编辑 JVM 配置文件 /etc/elasticsearch/jvm.options
修改其中 JVM 堆的大小,默认只有 1GB 可用:
-Xms1g
-Xmx1g
这个值的设置一定不要超过机器总内存的一半,另外需要将相当大部分的内存留给文件缓存以及系统本身的使用,同时还应该避免堆内存配置过大导致长时间的 GC,根据经验最大不要超过 26GB。假设当前机器只运行 Elasticsearch 而没有其他服务,假设机器总内存大小为 M(单位为 GB),我们推荐按照下面的公式设置:
对于计算结果直接取整即可,根据上面公式,可以总结出下表:
服务器内存 | JVM 堆内存 |
---|---|
4GB | 1GB |
8GB | 3GB |
16GB | 6GB |
32GB | 12GB |
64GB | 25GB |
128GB | 26GB |
256GB | 26GB |
在实际配置时可以参考上表来进行配置,通常情况下推荐独立部署,但假如存在与其他软件混合部署的情况下应该按照实际的可用内存进行配置。
同时 -Xms
和 -Xmx
要配置成相同的值,避免内存的频繁创建和回收。
假如我们当前设置为 8GB,则配置如下:
-Xms8g
-Xmx8g
配置完成后保存。
然后继续在 ecs12
上修改配置文件 /etc/elasticsearch/elasticsearch.yaml
# 集群名称, 所有节点必须配置相同名称
cluster.name: es7-cluster
# 节点名称, 每个节点唯一,配置为主机名即可
node.name: ecs12
# 数据存放目录
path.data: /data/elasticsearch
# 日志存放目录 默认即可
path.logs: /var/log/elasticsearch
# 开启内存锁定 避免换出
bootstrap.memory_lock: true
# 该节点的 IP 地址
network.host: 192.168.11.12
# HTTP 端口号
http.port: 9200
# 集群发现节点配置
discovery.seed_hosts: ["192.168.11.12:9300", "192.168.11.13:9300","192.168.11.14:9300"]
# 参与选举的节点名称
cluster.initial_master_nodes: ["ecs12","ecs13","ecs14"]
# 开启 X-PACK 安全
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/cert/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/cert/elastic-certificates.p12
然后将配置文件远程发送到其他节点:
# 在ecs12上执行
cd /etc/elasticsearch
scp jvm.options elasticsearch.yml ecs13:`pwd`
scp jvm.options elasticsearch.yml ecs14:`pwd`
其他节点修改配置文件只需要修改 node.name
和 network.host
项,其他配置项无需修改。
然后在每个节点上编辑服务文件:
systemctl edit elasticsearch.service
输入如下内容:
[Service]
LimitMEMLOCK=infinity
注意编辑器不是 vim,直接输入即可,然后按 Ctrl + X 快捷键,然后输入 Y 直接回车即可保存,保存后查看文件确认:
cat /etc/systemd/system/elasticsearch.service.d/override.conf
没问题然后就可以刷新服务文件:
systemctl daemon-reload
在所有节点创建数据目录并设置权限:
# 在所有节点执行
mkdir /data/elasticsearch
chown -R elasticsearch:elasticsearch /data/elasticsearch/
在所有节点启动服务:
systemctl start elasticsearch.service
# 查看服务状态
systemctl status elasticsearch.service
启动可能比较慢,耐心等待启动成功。如果启动失败可以查看状态或输出:
journalctl -u elasticsearch.service
在其中一台机器上比如 ecs12
上初始化用户的密码:
# auto 表示自动生成密码,也可以用 interactive 自己依次设置密码
elasticsearch-setup-passwords auto
执行完此命令后,自动生成的密码会打印在控制台上:
这些密码可以保存一下,如果需要修改 elastic
用户的密码可以执行:
# <password> 部分使用新的密码替换即可
curl -XPOST -u elastic "192.168.11.12:9200/_security/user/elastic/_password" -H 'Content-Type: application/json' -d'{"password" : "<password>"}'
执行完后会提示输入原密码,把上面自动生成的 elastic 用户的密码输入即可修改。
请求任意一个节点查看集群状态和节点情况:
# <password> 替换为密码
curl -u 'elastic:<password>' "ecs12:9200"
返回内容如下:
{
"name" : "ecs12",
"cluster_name" : "es7-cluster",
"cluster_uuid" : "hfPAkzLGThO6NFc8c82TMg",
"version" : {
"number" : "7.7.1",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
"build_date" : "2020-05-28T16:30:01.040088Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
查看节点情况:
curl -u 'elastic:<password>' ecs12:9200/_cat/nodes?v
返回如下:
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.11.12 52 98 7 1.45 2.08 2.24 dilmrt - ecs12
192.168.11.14 39 97 6 1.22 0.92 0.98 dilmrt - ecs14
192.168.11.13 36 99 7 2.41 1.48 1.44 dilmrt * ecs13
当前在配置过程中同时开启了 xpack.security.enabled
和 xpack.security.transport.ssl.enabled
,Elasticsearch 对于所有的非试用集群要求如果开启 xpack.security.enabled
则必须要开启 xpack.security.transport.ssl.enabled
,否则将会报错无法启动。
/etc/elasticsearch
配置文件目录下默认的 CA 会生成到 /usr/share/elasticsearch
下,无论原始目录有没有权限,最终仍然需要放到 /etc/elasticsearch/cert
下,否则会报错如下:
ElasticsearchSecurityException[failed to load SSL configuration [xpack.security.transport.ssl]]; nested: ElasticsearchException[failed to initialize SSL TrustManager - access to read truststore file [/usr/share/elasticsearch/elastic-certificates.p12] is blocked; SSL resources should be placed in the [/etc/elasticsearch] directory]; nested: AccessControlException[access denied ("java.io.FilePermission" "/usr/share/elasticsearch/elastic-certificates.p12" "read")];
Nov 21 17:21:02 ecs12 systemd-entrypoint[2960025]: Likely root cause: java.security.AccessControlException: access denied ("java.io.FilePermission" "/usr/share/elasticsearch/elastic-certificates.p12" "read")
这个是 Elasticsearch 对证书位置的要求,一定要放到正确的目录下才可以。
上面在执行命令:elasticsearch-certutil cert --ca elastic-stack-ca.p12
时如果报错 No such file or directory
,那么原因是程序的工作目录是在 /usr/share/elasticsearch
而用户当前没有在此目录下,所以需要进入目录:
cd /usr/share/elasticsearch
进入目录后再次生成即可,或者时指定 elastic-stack-ca.p12
使用绝对路径也是可以的。