Ubuntu 24.04.3 LTS系统中Elasticsearch 8.14.0+kibana 8.14.0集群部署搭建

1、服务器配置:

三台服务器,IP地址分别为:192.168.1.100、192.168.1.101、192.168.1.102

配置均为:

内存:64GB

CPU:32核

磁盘:1T

操作系统:Ubuntu 24.04.3 LTS

2、前提:已安装Nginx、docker、docker compose

3、服务器节点计划:

序号 IP地址 角色及用途
1 192.168.1.100 elasticsearch、kibana | master、data
2 192.168.1.101 elasticsearch | master、data
3 192.168.1.102 elasticsearch | master、data

部署目录规划:

1)/data/elasticsearch/

ES目录(所有节点)

sudo mkdir -p /data/elasticsearch/{data,logs,config}

2)/data/kibana/

Kibana目录(仅100节点)

sudo mkdir -p /data/kibana/{config,logs}

3)授权

授权(容器内ES UID=1000,Kibana UID=1000)

sudo chown -R 1000:1000 /data/elasticsearch /data/kibana

sudo chmod -R 755 /data/elasticsearch /data/kibana

4、Nginx配置nginx.conf:

user www-data;

worker_processes auto; # 自动匹配CPU核心数

worker_cpu_affinity auto; # 自动绑定工作进程到CPU核心(多核优化)

worker_rlimit_nofile 1000000; # 每个worker进程的最大文件描述符数

pid /run/nginx.pid;

error_log /var/log/nginx/error.log;

include /etc/nginx/modules-enabled/*.conf;

events {

worker_connections 65535;

multi_accept on;

use epoll;

}

http {

Basic Settings

sendfile on; # 启用零拷贝(减少磁盘IO)

send_timeout 30s;

tcp_nopush on; # 配合sendfile,一次性发送数据

tcp_nodelay on; # 禁用Nagle算法(低延迟)

types_hash_max_size 2048;

server_tokens off;

server_names_hash_bucket_size 64;

server_name_in_redirect off;

include /etc/nginx/mime.types;

default_type application/octet-stream;

SSL Settings

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE

ssl_prefer_server_ciphers on;

Logging Settings

日志优化(减少IO)

log_format main 'remote_addr - remote_user [time_local\] "request" '

'status body_bytes_sent "$http_referer" '

'"http_user_agent" "http_x_forwarded_for"';

access_log /var/log/nginx/access.log main buffer=32k flush=5s; # 缓冲日志,5s刷盘

open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m; # 日志文件缓存

keepalive_timeout 65;

keepalive_requests 10000; # 单个长连接最大请求数(默认100)

client_body_in_file_only clean;

client_body_buffer_size 32K;

client_max_body_size 100M;

client_header_timeout 15s; # 客户端请求头读取超时

client_body_timeout 15s; # 客户端请求体读取超时

Gzip Settings

gzip on;

#限流(可选,防过载)

limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;

limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;

limit_conn conn_limit_per_ip 100; # 单IP最大并发连接

limit_req zone=req_limit_per_ip burst=20 nodelay; # 单IP限流(10r/s,突发20)

es 集群后端节点池(所有数据节点)

upstream es-node-list {
server 192.168.1.100:9200;
server 192.168.1.101:9200;
server 192.168.1.102:9200;

ip_hash; # IP哈希

least_conn; # 最少连接

啥也不也就是轮询

}

server {

listen 80 default_server;

listen [::]:80 default_server;

root /var/www/html;

index index.html index.htm index.nginx-debian.html;

server_name 192.168.1.100;

location / {

First attempt to serve request as file, then

as directory, then fall back to displaying a 404.

try_files uri uri/ =404;

}

#查看nginx的状态

location /status {

stub_status on;

allow 127.0.0.1;

allow 192.168.1.10;

deny all;

}

es集群配置

location /es-cluster {
proxy_pass http://es-node-list/;
proxy_ssl_verify off; # 忽略ES的SSL证书验证(生产需配置CA证书)
proxy_set_header Host host; proxy_set_header X-Real-IP remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass_request_headers on;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;

支持流式调用

proxy_http_version 1.1;
chunked_transfer_encoding off;
proxy_buffering off;
proxy_cache off;
}

}

}

5、生产环境配置准备建议:

1. 调整虚拟内存(ES必需,永久生效)

sudo sysctl -w vm.max_map_count=262144

echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf

2. 提升文件句柄/线程数限制(永久生效)

echo "* soft nofile 65535" | sudo tee -a /etc/security/limits.conf

echo "* hard nofile 65535" | sudo tee -a /etc/security/limits.conf

echo "* soft nproc 65535" | sudo tee -a /etc/security/limits.conf

echo "* hard nproc 65535" | sudo tee -a /etc/security/limits.conf

3. 禁用SWAP(ES性能杀手,永久禁用)

sudo swapoff -a

sudo sed -i '/swap/s/^/#/' /etc/fstab

4. 放行端口(Ubuntu 24.04用ufw,替代firewalld)

启动防火墙:sudo ufw enable

禁用防火墙:sudo ufw disable

查看配置规则:sudo ufw status verbose

100上多开放 80和5601,其他都是:22、9200、9300

sudo ufw allow 80/tcp

sudo ufw allow 22/tcp

sudo ufw allow 9200/tcp

sudo ufw allow 9300/tcp

sudo ufw allow 5601/tcp

sudo ufw reload

5. 关闭AppArmor(避免拦截ES目录权限,可选但推荐)

sudo systemctl stop apparmor

sudo systemctl disable apparmor

6、192.168.1.100 节点1

1)/data/elasticsearch/docker-compose.yml

version: '3.8'

services:

es-node-100:

image: docker.elastic.co/elasticsearch/elasticsearch:8.14.0

container_name: es-node-100

privileged: true

restart: always

资源最大化限制(匹配32核/64G内存,Ubuntu cgroup v2适配)

deploy:

resources:

limits:

cpus: '32'

memory: 60G

reservations:

cpus: '32'

memory: 60G

#ports:

- "9200:9200"

- "9300:9300"

volumes:

  • ./data:/usr/share/elasticsearch/data

  • ./logs:/usr/share/elasticsearch/logs

  • ./config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

  • ./config/jvm.options:/usr/share/elasticsearch/config/jvm.options

  • /etc/localtime:/etc/localtime:ro

environment:

  • TZ=Asia/Shanghai

  • ES_JAVA_OPTS=-Xms31g -Xmx31g

  • MAX_LOCKED_MEMORY=unlimited

主机网络(Ubuntu下规避端口映射性能损耗)

network_mode: host

资源限制(匹配Ubuntu ulimits)

ulimits:

memlock:

soft: -1

hard: -1

nofile:

soft: 655350

hard: 655350

Ubuntu下禁用apparmor(避免权限拦截)

security_opt:

  • apparmor:unconfined

Kibana(仅100节点部署)

kibana-node-100:

image: docker.elastic.co/kibana/kibana:8.14.0

container_name: kibana-node-100

privileged: true

restart: always

deploy:

resources:

limits:

cpus: '4' # 分配4核足够,不抢占ES资源

memory: 8G # 8G内存满足高并发可视化

reservations:

cpus: '2'

memory: 4G

volumes:

  • /data/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml

  • /data/kibana/logs:/usr/share/kibana/logs

  • /etc/localtime:/etc/localtime:ro

Host网络,Kibana默认端口5601

network_mode: host

environment:

  • TZ=Asia/Shanghai

  • NODE_OPTIONS=--max-old-space-size=8192 # 匹配内存限制

depends_on:

  • es-node-100 # 依赖ES节点启动

security_opt:

  • apparmor:unconfined

2)/data/elasticsearch/config/elasticsearch.yml

集群基础配置

cluster.name: es-cluster-prod

node.name: es-node-100

network.host: 0.0.0.0

http.port: 9200

transport.port: 9300

discovery.seed_hosts: ["192.168.1.100:9300", "192.168.1.101:9300", "192.168.1.102:9300"]

cluster.initial_master_nodes: ["es-node-100", "es-node-101", "es-node-102"]

性能最大化核心配置(Ubuntu 24.04适配)

bootstrap.memory_lock: true # 锁定内存,禁用swap

http.max_content_length: 100mb # 支持大请求体

action.destructive_requires_name: true # 禁止通配符删除索引

内存缓存优化(最大化利用31G堆内存)

indices.memory.index_buffer_size: 30% # 索引缓冲区(默认10%)

indices.fielddata.cache.size: 25% # fielddata缓存

线程池优化(匹配32核CPU,Ubuntu调度更高效)

thread_pool.write:

size: 32 # 写线程池=CPU核心数

queue_size: 1000

thread_pool.search:

size: 64 # 搜索线程池=2*CPU核心数

queue_size: 1000

thread_pool.analyze:

size: 16

queue_size: 100

磁盘水位(适配1T磁盘)

cluster.routing.allocation.disk.watermark.low: 85%

cluster.routing.allocation.disk.watermark.high: 90%

cluster.routing.allocation.disk.watermark.flood_stage: 95%

查询优化

indices.query.bool.max_clause_count: 4096

压缩优化(降低网络/磁盘IO)

http.compression: true

transport.compress: true

禁用安全认证(核心)

xpack.security.enabled: false

xpack.security.enrollment.enabled: false

xpack.security.http.ssl.enabled: false

xpack.security.transport.ssl.enabled: false

3)/data/elasticsearch/config/jvm.options

堆内存:64G物理内存设31G(规避32G Compressed Oops失效)

-Xms31g

-Xmx31g

G1GC优化(适配Ubuntu 24.04内核,降低GC停顿)

-XX:+UseG1GC

-XX:G1ReservePercent=20

-XX:G1HeapRegionSize=16m

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/usr/share/elasticsearch/logs/heapdump.hprof

-XX:+DisableExplicitGC

-XX:+AlwaysPreTouch

Ubuntu 24.04专属JVM优化

-server

-Xss1m

-Djava.awt.headless=true

-Dfile.encoding=UTF-8

-Djna.nosys=true

-Dio.netty.noUnsafe=true

-Dio.netty.noKeySetOptimization=true

-Dio.netty.recycler.maxCapacityPerThread=0

-Dlog4j.shutdownHookEnabled=false

-Dlog4j2.disable.jmx=true

4)/data/kibana/config/kibana.yml

集群名称

server.name: kibana-node-100

绑定地址(Host网络下0.0.0.0)

server.host: 0.0.0.0

连接ES集群(多个节点提高容错)

elasticsearch.hosts: ["http://192.168.1.100:9200", "http://192.168.1.101:9200", "http://192.168.1.102:9200"]

禁用安全认证

xpack.security.enabled: false

性能优化

elasticsearch.requestTimeout: 300000 # 长查询超时(5分钟)

elasticsearch.shardTimeout: 300000

====== 8.14.0标准日志配置 ======

logging:

日志输出类型:file(文件)+ console(控制台)

appenders:

file:

type: file

fileName: /usr/share/kibana/logs/kibana.log # 日志文件路径

layout:

type: json

console:

type: console

layout:

type: json

#pattern: "%d [%t] %-5p %c - %m%n"

日志级别

root:

level: info # 生产环境用info,调试用debug

appenders: [file, console]

7、192.168.1.101 节点2

/data/elasticsearch/docker-compose.yml ,仅修改container_name=es-node-101,删除kibana相关配置,其余和节点 1 一致;

/data/elasticsearch/config/elasticsearch.yml,仅修改node.name=es-node-101,其余和节点1一致;

/data/elasticsearch/config/jvm.options和节点1一致;

8、192.168.1.102 节点3

/data/elasticsearch/docker-compose.yml ,仅修改container_name=es-node-102,删除kibana相关配置,其余和节点 1 一致;

/data/elasticsearch/config/elasticsearch.yml,仅修改node.name=es-node-102,其余和节点1一致;

/data/elasticsearch/config/jvm.options和节点1一致;

9、启动集群(所有节点执行)

1)先启动 节点1:cd /data/elasticsearch/ && docker-compose up -d

bash 复制代码
(base) root@arp:/data/elasticsearch# docker compose up -d
WARN[0000] /data/elasticsearch/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] up 2/2
 ✔ Container es-node-100     Created                                                                                                                                             0.0s 
 ✔ Container kibana-node-100 Created                                                                                                                                             0.1s 
(base) root@arp:/data/elasticsearch#

2)等节点1启动完成后,启动另外两个节点2、节点3:

cd /data/elasticsearch/ && docker-compose up -d

101:

bash 复制代码
(base) root@arp:/data/elasticsearch# docker compose up -d
WARN[0000] /data/elasticsearch/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] up 1/1
 ✔ Container es-node-101 Created                                                                                                                                                 0.1s 
(base) root@arp:/data/elasticsearch# 

102:

bash 复制代码
(base) root@arp:/data/elasticsearch# docker compose up -d
WARN[0000] /data/elasticsearch/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] up 1/1
 ✔ Container es-node-102 Created                                                                                                                                                 0.1s 
(base) root@arp:/data/elasticsearch# 

10、相关访问地址:

1)Nginx访问地址:http://192.168.1.100/es-cluster

2)elasticsearch访问地址(其他节点类似):192.168.1.100:9200

http://192.168.1.100:9200/_cluster/health?pretty

3)kibana访问地址:http://192.168.1.100:5601/app/management/data/index_management/indices

相关推荐
建群新人小猿2 小时前
陀螺匠企业助手 运行环境
java·大数据·人工智能·docker·php
容智信息3 小时前
容智信息加入大模型产业联盟,Hyper Agent推动企业级智能体规模化落地
大数据·人工智能·自然语言处理·自动驾驶
xiaoshujiaa3 小时前
微服务与大数据场景下的Java面试实录:从Spring Cloud到Flink的层层拷问
大数据·spring cloud·微服务·flink·kubernetes·java面试·resilience4j
风静雪冷3 小时前
在Ubuntu上安装docker(docker engine)和docker compose
linux·ubuntu·docker
半壶清水3 小时前
ubuntu中mysql升级指南
mysql·ubuntu·adb
天远Date Lab3 小时前
构建金融级信贷审批系统:Java Spring Boot 集成天远借贷行为验证 API 全指南
java·大数据·spring boot·金融
-拟墨画扇-3 小时前
Git | 文件修改操作
大数据·git·gitee·github·gitcode
-拟墨画扇-3 小时前
Git | 版本控制操作
大数据·git·gitee·github
LJ97951114 小时前
智能连接:Infoseek如何重新定义媒体发布效率
大数据·人工智能