Easticsearch 是一个分布式的搜索和分析引擎,广泛应用于日志分析、全文检索、实时数据分析等场景。为了满足高可用性和高性能的需求,Elasticsearch 通常以集群的方式部署。部署 Elasticsearch 集群时,可以选择两种主要方式:原生 Linux 部署和 Docker 部署。每种方式都有其独特的优势和适用场景。

  1. 原生 Linux 部署集群:
    学习如何在纯 Linux 环境中手动部署 Elasticsearch 集群。
    掌握 Elasticsearch 集群的基础配置(如主节点、数据节点和协调节点的设置)。
    理解 Elasticsearch 的集群原理,包括分片、路由和数据高可用性。

  2. Docker 部署集群:
    体验通过容器化快速部署和运行 Elasticsearch 集群。
    掌握使用 Docker Compose 编排多个节点服务的技巧。

  • 原生 Linux 部署:直接在物理机或虚拟机上安装和配置 Elasticsearch 节点,适合对性能要求高、资源充足的环境。
  • Docker 部署:使用容器化技术部署 Elasticsearch 节点,适合快速部署、资源隔离和易于扩展的场景。

(一)原生 Linux 部署集群

配置多节点环境(主节点、数据节点等),手动修改配置文件,验证集群状态,并测试数据高可用性。Centos上两个节点node1(10.0.0.11)、node2(10.0.0.13)

原生 Linux 部署集群

1. 特点
  • 直接运行在操作系统上:Elasticsearch 节点直接安装在 Linux 服务器上,性能更高。
  • 灵活性高:可以根据需求自定义配置和优化。
  • 复杂性高:需要手动安装和配置每个节点,适合有经验的运维团队。
  • 资源独占:每个节点独占服务器资源,适合对性能要求高的场景。
2. 部署步骤
  1. 准备服务器
    • 准备多台 Linux 服务器,分别用于 Elasticsearch 节点。
  2. 安装 Java 环境
    • 在每台服务器上安装 Java 运行时环境(JRE 或 JDK)。
  3. 安装 Elasticsearch
    • 下载并安装 Elasticsearch 软件包。
  4. 配置集群
    • 修改 Elasticsearch 配置文件(elasticsearch.yml),设置集群名称、节点名称、网络绑定地址等。
    • 配置节点发现机制(如使用 discovery.seed_hosts)。
  5. 启动服务
    • 启动 Elasticsearch 服务,并确保所有节点加入同一个集群。
  6. 验证集群
    • 使用 curl 或 Kibana 检查集群状态,确保所有节点正常运行。
3. 适用场景
  • 对性能要求高的生产环境。
  • 需要深度定制和优化的场景。
  • 已有成熟的运维团队和基础设施。

1. 在node1部署es

上传elasticsearch-7.6.2-linux-x86_64.tar.gz、kibana-7.6.2-linux-x86_64.tar.gz
解压缩到/usr/local/目录下

tar -xzvf elasticsearch-7.6.2-linux-x86_64.tar.gz -C /usr/local
tar -xzvf kibana-7.6.2-linux-x86_64.tar.gz -C /usr/local
cd /usr/local

添加用户elastic并设置密码,chown -R elastic:elastic elasticsearch-7.6.2/

useradd elastic
passwd elastic
chown -R elastic:elastic elasticsearch-7.6.2/

2. 编辑配置文件

  1. 编辑elasticsearch.yml

让es可以远程连接,进入elasticsearch目录的config目录下:vim elasticsearch.yml,增加以下内容

cluster.name: my-es-cluster
node.name: node1
network.host: 10.0.0.11
discovery.seed_hosts: ["10.0.0.11"]
cluster.initial_master_nodes: ["node1"]
  1. 升级垃圾回收器
    建议使用G1垃圾回收器(Garbage-First Garbage Collector),它是Java 9及以后版本的默认垃圾回收器。你可以通过以下选项启用G1:-XX:+UseG1GC

编辑vim jvm.options,
将8-13:-XX:+UseConcMarkSweepGC注释
添加 -XX:+UseG1GC

  1. 增加文件描述符限制
    vim /etc/security/limits.d/20-nproc.conf

Elasticsearch 要求文件描述符的最大数量至少为 65535。

  1. 增加线程数限制
    Elasticsearch 要求用户的最大线程数至少为 4096。
elastic	-	nofile	65535
elastic	-	nproc	4096
  1. 增加虚拟内存限制
    Elasticsearch 要求 vm.max_map_count 至少为 262144。

解决方法:
临时修改(重启后失效):
sudo sysctl -w vm.max_map_count=262144
永久修改:

编辑 /etc/sysctl.conf 文件:
sudo vi /etc/sysctl.conf
在文件末尾添加以下内容:
vm.max_map_count=262144
使配置生效:
sudo sysctl -p
验证虚拟内存限制:
sysctl vm.max_map_count
输出应为 vm.max_map_count = 262144。

  1. java环境

确保安装了 Java 11 或更高版本。
echo $JAVA_HOME
确保 JAVA_HOME 环境变量正确设置。
如果没有输出或输出不正确,请设置 JAVA_HOME:

设置 JAVA_HOME 环境变量:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
echo "export JAVA_HOME=/usr/lib/jvm/java-11-openjdk" >> /home/elasticsearch/.bashrc
source /home/elasticsearch/.bashrc

配置完成切换elastic用户,启动./elsaticsearch -d

测试curl -X GET “10.0.0.11:9200”
在这里插入图片描述

输入10.0.0.11:9200
在这里插入图片描述

3. 在node1上部署kibana

[root@localhost ~]# cd /usr/local/kibana-7.6.2-linux-x86_64/
[root@localhost kibana-7.6.2-linux-x86_64]# ls
bin  built_assets  config  data  LICENSE.txt  node  node_modules  NOTICE.txt  optimize  package.json  plugins  README.txt  src  webpackShims  x-pack
[root@localhost kibana-7.6.2-linux-x86_64]# cd config/
[root@localhost config]# vim kibana.yml
server.port: 5601
server.host: “10.0.0.11”
server.name: kibana-server
elasticsearch.hosts: [“http://10.0.0.11:9200/”]

配置完后进入bin目录./kibana --allow-root
输入网址:10.0.0.11:5601

在这里插入图片描述

4. 根据node1克隆一台node2

修改node2

vim kibana.yml
server.port: 5601
server.host: “10.0.0.13”
server.name: kibana-server
elasticsearch.hosts: [“http://10.0.0.13:9200/”,“http://10.0.0.11:9200/”]

修改node2

vim elasticsearch.yml
cluster.name: my-es-cluster
node.name: node1
network.host: 10.0.0.11
discovery.seed_hosts: ["10.0.0.11","10.0.0.13"]
cluster.initial_master_nodes: ["node1","node2"]

修改node1,增加node2节点

vim kibana.yml
server.port: 5601
server.host: “10.0.0.11”
server.name: kibana-server
elasticsearch.hosts: [“http://10.0.0.11:9200/”,“http://10.0.0.13:9200/”]

修改node21
vim elasticsearch.yml
cluster.name: my-es-cluster
node.name: node1
network.host: 10.0.0.11
discovery.seed_hosts: ["10.0.0.11","10.0.0.13"]
cluster.initial_master_nodes: ["node1","node2"]

启动两台node的kibana和es

(二)Docker 部署 Elasticsearch 集群

Docker 部署集群

1. 特点
  • 容器化运行:Elasticsearch 节点运行在 Docker 容器中,实现资源隔离和快速部署。
  • 易于扩展:通过 Docker Compose 或 Kubernetes 可以快速扩展集群。
  • 资源占用低:容器共享操作系统内核,资源利用率更高。
  • 部署简单:使用 Docker Compose 可以一键部署整个集群。
2. 适用场景
  • 快速部署和测试环境。
  • 资源有限或需要高密度部署的场景。
  • 需要快速扩展和缩容的场景。

1. Es安装

创建yml文件

services:
  elasticsearch:
    image: elasticsearch:6.5.4
    restart: always
    container_name: elasticsearch
    ports:
      - 9200:9200
    environment:
      - JAVA_OPTS=--Xms256m -Xmx1024m
  kibana:
    image: kibana:6.5.4
    restart: always
    container_name: kibana
    ports:
      - 5601:5601
    environment:
      - elasticsearch_url=http://10.0.0.11:9200
    depends_on:
      - elasticsearch
docker compose up -d
docker ps

如果我们的es报: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
需要在:/etc/sysctl.conf 添加上:vm.max_map_count=262144
最后启动配置:sysctl -w vm.max_map_count=262144

10.0.0.11:5601

2. 安装IK分词器

./elasticsearch-plugin install http://43.136.108.62:8080/elasticsearch-analysis-ik-6.5.4.zip
重启ES的容器,让IK分词器生效。
POST _analyze
{
  "analyzer": "ik_max_word",
  "text":"欢迎来到中国湖南"
}

(三)索引增删改查

  1. 索引创建
    操作:创建索引
json
PUT /my_index
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  }
}
使用以下命令检查索引是否存在,如果索引创建成功,输出类似以下内容:

[root@localhost ~]# curl -X GET "http://10.0.0.11:9200/_cat/indices/my_index?v"
health status index    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   my_index D1F9luEuTwKIIKyYC7pwuQ   1   1          0            0       230b           230b

[root@localhost ~]# curl -X GET "http://10.0.0.13:9200/my_index"
{"my_index":{"aliases":{},"mappings":{},"settings":{"index":{"creation_date":"1742522852813","number_of_shards":"1","number_of_replicas":"1","uuid":"ahSMlKcZSSS4xGZeA48arw","version":{"created":"7060299"},"provided_name":"my_index"}}}
  1. 文档插入
    操作:插入文档
POST /my_index/_doc/1
{
  "name": "John Doe",
  "age": 30
}
使用以下命令检查文档是否存在:GET /my_index/_doc/1
[root@localhost ~]# curl -X GET "http://10.0.0.11:9200/my_index/_doc/1"
{"_index":"my_index","_type":"_doc","_id":"1","_version":3,"_seq_no":2,"_primary_term":1,"found":true,"_source":{
  "name": "John Doe",
  "age": 30
}
  1. 文档删除
    操作:删除文档
DELETE /my_index/_doc/1
使用以下命令检查文档是否已删除:
GET /my_index/_doc/1
  1. d.索引删除
    操作:删除索引
DELETE /my_index
使用以下命令检查索引是否存在:
GET /_cat/indices/my_index?v
如果索引已删除,输出中不会显示 my_index。

(四)总结

原生 Linux 部署 vs Docker 部署
特性 原生 Linux 部署 Docker 部署
性能 更高,无容器化开销 稍低,有容器化开销
部署复杂度 高,需手动安装和配置 低,使用 Docker Compose 一键部署
资源利用率 较低,每个节点独占资源 较高,容器共享操作系统内核
扩展性 较复杂,需手动扩展 简单,支持快速扩展和缩容
适用场景 生产环境,对性能要求高 测试环境、资源有限或需要快速部署的场景
维护成本 较高,需专业运维团队 较低,容器化技术简化维护
选择建议
  • 如果您的环境对性能要求高,且拥有成熟的运维团队,可以选择 原生 Linux 部署
  • 如果您需要快速部署、资源隔离和易于扩展,或者资源有限,可以选择 Docker 部署

最终总结
无论是原生 Linux 部署还是 Docker 部署,Elasticsearch 集群的部署都需要根据实际需求和环境特点进行选择。原生部署适合对性能和控制力要求高的场景,而 Docker 部署则更适合快速迭代和资源优化的场景。选择合适的部署方式,可以最大化 Elasticsearch 的性能和可用性,满足业务需求。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐