Elasticsearch 部署

Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。

Elasticsearch 基于 Java 语言实现。

https://www.elastic.co/guide/en/elastic-stack/index.html
https://www.elastic.co/guide/en/elasticsearch/reference/master/install-elasticsearch.html

部署方式

  • 包安装
  • 二进制安装
  • Docker 部署
  • Ansible 批量部署

ES支持操作系统版本和 Java 版本官方说明

https://www.elastic.co/cn/support/matrix

1、安装前准备

安装前环境初始化

CPU 2C 内存4G或更多
操作系统: Ubuntu20.04,Ubuntu18.04,Rocky8.X,Centos 7.X
操作系统盘50G
主机名设置规则为es-nodeX.test.com
生产环境建议准备单独的数据磁盘

关闭防火墙和SELinux

# RHEL系列的系统执行下以下配置
# systemctl disable firewalld
# systemctl disable NetworkManager
# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
# reboot

各服务器配置本地域名解析

# vim /etc/hosts
192.168.1.101 es-node1.test.com
192.168.1.102 es-node2.test.com
192.168.1.103 es-node3.test.com

修改内核参数

内核参数 vm.max_map_count 用于限制一个进程可以拥有的VMA(虚拟内存区域)的数量

使用默认系统配置,二进制安装时会提示下面错误,包安装会自动修改此配置

图片[1]-Elasticsearch 部署-李佳程的个人主页
# 查看默认值
# sysctl -a |grep vm.max_map_count
vm.max_map_count = 65530

# 修改配置
# echo "vm.max_map_count = 262144" >> /etc/sysctl.conf
# echo "fs.file-max = 1000000" >> /etc/sysctl.conf
# sysctl -p
vm.max_map_count = 262144

# Ubuntu 基于包安装后会自动修改文件
# cat /usr/lib/sysctl.d/elasticsearch.conf
vm.max_map_count=262144

修改资源限制配置

# vi /etc/security/limits.conf
*               soft   core           unlimited
*               hard   core           unlimited
*               soft   nproc           1000000
*               hard   nproc           1000000
*               soft   nofile          1000000
*               hard   nofile          1000000
*               soft   memlock         32000
*               hard   memlock         32000
*               soft   msgqueue        8192000
*               hard   msgqueue        8192000

安装JAVA环境(可以直接使用带JAVA的es安装包,省去单独安装JAVA的步骤)

2、Elasticsearch 安装

安装包有两种: 包含jdk和no-jdk的包

注意:官方提示no-jdk的包将被淘汰,建议使用包含JDK的包

#包含JDK的版本下载
https://www.elastic.co/downloads/elasticsearch
https://mirrors.tuna.tsinghua.edu.cn/elasticstack/
#不包含JDK的版本下载
https://www.elastic.co/cn/downloads/elasticsearch-no-jdk
# 下载包
root@es-node1:~# wget https://mirrors.tuna.tsinghua.edu.cn/elasticstack/7.x/apt/pool/main/e/elasticsearch/elasticsearch-7.17.8-amd64.deb

# 安装包
root@es-node1:~# dpkg -i elasticsearch-7.17.8-amd64.deb
root@es-node1:~# systemctl daemon-reload
root@es-node1:~# systemctl enable --now elasticsearch.service

root@es-node1:~# pstree -p | grep java
           |-java(2872)-+-controller(3082)-+-{controller}(3084)
           |            |-{java}(3060)
           |            |-{java}(3061)
           |            |-{java}(3062)
           |            |-{java}(3063)

root@es-node1:~# ss -ntlp | grep java
LISTEN   0        4096       [::ffff:127.0.0.1]:9200                   *:*       users:(("java",pid=2872,fd=293))
LISTEN   0        4096                    [::1]:9200                [::]:*       users:(("java",pid=2872,fd=292))
LISTEN   0        4096       [::ffff:127.0.0.1]:9300                   *:*       users:(("java",pid=2872,fd=290))
LISTEN   0        4096                    [::1]:9300                [::]:*       users:(("java",pid=2872,fd=289))

root@es-node1:~# curl 127.0.0.1:9200
{
  "name" : "es-node1.test.com",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "2fJUnFk_SB6pB1WRT383sw",
  "version" : {
    "number" : "7.17.8",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "120eabe1c8a0cb2ae87cffc109a5b65d213e9df1",
    "build_date" : "2022-12-02T17:33:09.727072865Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

3、编辑服务配置文件

# 配置文件说明

[root@es-node1 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
# ELK集群名称,同一个集群内每个节点的此项必须相同,新加集群的节点此项和其它节点相同即可加入集群,而无需再验证
cluster.name: ELK-Cluster

# 当前节点在集群内的节点名称,同一集群中每个节点要确保此名称唯一
node.name: es-node1

# ES 数据保存目录
path.data: /data/es-data


# ES 日志保存目录
path.logs: /data/es-logs

# 服务启动的时候立即分配(锁定)足够的内存,防止数据写入swap,提高启动速度
bootstrap.memory_lock: true

# 指定监听IP,如果绑定了错误的IP,可将此修改为指定IP
network.host: 0.0.0.0

# 监听端口
http.port: 9200

# 发现集群的node节点列表,可以添加部分或全部节点IP
# 在新增节点到集群时,此处需指定至少一个已经在集群中的节点地址
discovery.seed_hosts: ["192.168.1.101","192.168.1.102","192.168.1.103"]

# 集群初始化时指定希望哪些节点可以被选举为 master,只在初始化时使用,新加节点到已有集群时此项可不配置
cluster.initial_master_nodes: ["192.168.1.101","192.168.1.102","192.168.1.103"]

# 一个集群中的 N 个节点启动后,才允许进行数据恢复处理,默认是1,一般设为为所有节点的一半以上,防止出现脑裂现象
# 当集群无法启动时,可以将之修改为1,或者将下面行注释掉,实现快速恢复启动
gateway.recover_after_nodes: 2

# 设置是否可以通过正则表达式或者_all匹配索引库进行删除或者关闭索引库,默认true表示必须需要明确指定索引库名称,不能使用正则表达式和_all,生产环境建议设置为 true,防止误删索引库。
action.destructive_requires_name: true

# 不参与主节点选举
node.master: false

# 存储数据,此值为false则不存储数据而成为一个路由节点
# 如果将true改为false,需要先执行/usr/share/elasticsearch/bin/elasticsearch-node
repurpose 清理数据
node.data: true

# 7.x以后版本下面指令已废弃,在2.x 5.x 6.x 版本中用于配置节点发现列表
discovery.zen.ping.unicast.hosts: ["192.168.1.101","192.168.1.102","192.168.1.103"]
# 单节点配置
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
node.name: node-1
network.host: 0.0.0.0
discovery.seed_hosts: ["192.168.1.101"]
cluster.initial_master_nodes: ["node-1"]
# 集群配置
root@es-node1:~# cat /etc/elasticsearch/elasticsearch.yml
cluster.name: es-cluster
node.name: node-1
path.data: /data/es-data
path.logs: /data/es-logs
bootstrap.memory_lock: true
network.host: 0.0.0.0
discovery.seed_hosts: ["192.168.1.101","192.168.1.102","192.168.1.103"]
cluster.initial_master_nodes: ["192.168.1.101","192.168.1.102","192.168.1.103"]
gateway.recover_after_nodes: 2
action.destructive_requires_name: true

root@es-node1:~# chown -R elasticsearch.elasticsearch /data/ 
图片[2]-Elasticsearch 部署-李佳程的个人主页

4、优化 ELK 资源配置

推荐使用宿主机物理内存的一半,ES的heap内存最大不超过30G,26G是比较安全的。

堆大小应基于可用 RAM:

将 Xms 和 Xmx 设置为不超过总内存的 50%。 Elasticsearch 需要内存用于 JVM 堆以外的用途。 例如,Elasticsearch 使用堆外缓冲区来实现高效的网络通信,并依靠操作系统的文件系统缓存来高效地访问文件。 JVM 本身也需要一些内存。 Elasticsearch 使用比 Xmx 设置配置的限制更多的内存是正常的。

在容器(例如 Docker)中运行时,总内存定义为容器可见的内存量,而不是主机上的总系统内存。

将 Xms 和 Xmx 设置为不超过压缩普通对象指针 (oops) 的阈值。 确切的阈值会有所不同,但在大多数系统上 26GB 是安全的,在某些系统上可能高达 30GB。 要验证您是否低于阈值,请检查 Elasticsearch日志中的条目。

为了保证性能,每个ES节点的JVM内存设置具体要根据 node 要存储的数据量来估算,建议符合下面约定:

  • 在内存和数据量有一个建议的比例:对于一般日志类文件,1G 内存能存储48G~96GB数据
  • JVM 堆内存最大不要超过30GB
  • 对于主分片的数量,单个分片控制在30-50GB
假设总数据量为1TB,3个node节点,1个副本;那么实际要存储的大小为2TB
每个节点需要存储的数据量为:2TB / 3 = 700GB,然后每个节点需要预留20%的空间,意味着每个node要存储大约 875GB 的数据;按照内存与存储数据的比率计算:875GB/48GB=18,即需要JVM内存为18GB,小于30GB
因为要尽量控制主分片的大小为30GB;875GB/30GB=30个主分片,即最多30个主分片

范例:指定heap内存最小和最大内存限制

# 建议将heap内存设置为物理内存的一半且最小和最大设置一样大,但最大不能超过30G
root@es-node1:~# vim /etc/elasticsearch/jvm.options
-Xms2g
-Xmx2g

# 每天1TB左右的数据量的建议服务器配置
16C 64G 6T硬盘 共3台服务器

范例:修改service文件,做优化配置

root@es-node1:~# vim /usr/lib/systemd/system/elasticsearch.service
LimitNOFILE=1000000   # 修改最大打开的文件数,默认值为65535
LimitNPROC=65535      # 修改打开最大的进程数,默认值为4096
LimitMEMLOCK=infinity # 无限制使用内存,以前旧版需要修改,否则无法启动服务,当前版本无需修改

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享