ELK 系列九、elasticsearch扩容(从单机至单机伪集群)

本文详细介绍了如何在单台服务器上搭建Elasticsearch多节点集群,包括配置TLS安全通信、守护进程设置及Logstash日志配置。通过具体步骤和代码示例,读者可以学习如何实现ES集群的扩容升级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、简介

二、升级操作

2.1 es配置

2.2 logstash设置

2.3 守护进程配置

2.4 查看结果


一、简介

单机伪集群是什么概念呢,就是同一台服务器有多个es节点

先介绍一下,原先的环境为在一台服务器192.168.0.15上安装了es、kibana、logstash,通过守护进程来启动

服务,单机单节点。现在升级为单机多节点。

 

二、升级操作

查看服务进程

supervisorctl status

先停止所以服务

supervisorctl stop all

进入es程序目录,复杂一份程序

cd /data

[root@i-iehivbeb data]# cp elasticsearch-6.5.3 elasticsearch-6.5.3-node0 -r

[root@i-iehivbeb data]# ls
elasticsearch-6.5.3  elasticsearch-6.5.3-node0

 

2.1 es配置

开启证书通信验证,生成证书

参考资料:

https://www.elastic.co/guide/en/elasticsearch/reference/6.5/configuring-tls.html#node-certificates

[root@i-iehivbeb data]# cd /data/elasticsearch-6.5.3-node0/

执行以下脚本

#生成ca证书

bin/elasticsearch-certutil ca

第一步回车是指定生成的ca文件名称,第而不是指定该文件的密码,我这边都默认回车,无密码

查看是否已生成

继续基于根证书生成集群通信证书

bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

ok,两个都已生成

elastic-certificates.p12  elastic-stack-ca.p12    

我习惯把这两个文件放到一个目录中存放,elastic-certificates.p12是每个集群节点数据通信的时候要用到的,另外一个暂时没有用了

[root@i-iehivbeb elasticsearch-6.5.3-node0]# mkdir config/certs

[root@i-iehivbeb elasticsearch-6.5.3-node0]# mkdir config/certs
[root@i-iehivbeb elasticsearch-6.5.3-node0]# mv elastic-certificates.p12  config/certs
[root@i-iehivbeb elasticsearch-6.5.3-node0]# mv elastic-stack-ca.p12 config/certs/
[root@i-iehivbeb elasticsearch-6.5.3-node0]# ls config/certs/
elastic-certificates.p12  elastic-stack-ca.p12

我们回过头来看下文件权限,发现还是root权限

给es整个目录赋用户权限

[root@i-iehivbeb data]# chown -R elasticsearch:elasticsearch /data/elasticsearch-6.5.3-node0

 再查看下

原有配置

cat /data/elasticsearch-6.5.3-node0/config/elasticsearch.yml

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
network.host: 0.0.0.0

修改后的配置为:

cluster.name: es-cluster-dev
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate 
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
node.name: node-0
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.0.15:9300", "192.168.0.15:9301", "192.168.0.15:9302"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"

集群中以cluster.name来确定是否同一个,集群如果开启来xpack安全,就需要进行ssl安全验证,

node.name 为节点编号,每个节点都不同

network.host为ip访问白名单,指定哪些客户端ip可以访问该es,0.0.0.0是指all

http.port为被客户端或程序访问的端口

transport.tcp.port 为集群内部通信端口

discovery.zen.ping.unicast.hosts指定集群自动发现的ip集合

discovery.zen.minimum_master_nodes: 集群至少有2个节点才会选举master
http.cors.enabled: 是否开启head
http.cors.allow-origin: "*" head不限制

ok,第一个节点配置完成,继续配置其它两个节点

[root@i-iehivbeb data]# cp elasticsearch-6.5.3-node0 elasticsearch-6.5.3-node1 -r 
[root@i-iehivbeb data]# cp elasticsearch-6.5.3-node0 elasticsearch-6.5.3-node2 -r  

[root@i-iehivbeb data]# ll
total 254000
drwxr-xr-x  9 elasticsearch elasticsearch      4096 Dec 17 09:52 elasticsearch-6.5.3
drwxr-xr-x  9 elasticsearch elasticsearch      4096 May 15 10:25 elasticsearch-6.5.3-node0
drwxr-xr-x  9 root          root               4096 May 15 10:38 elasticsearch-6.5.3-node1
drwxr-xr-x  9 root          root               4096 May 15 10:39 elasticsearch-6.5.3-node2

赋用户权限

[root@i-iehivbeb data]# chown -R elasticsearch:elasticsearch elasticsearch-6.5.3-node0 elasticsearch-6.5.3-node1 elasticsearch-6.5.3-node2

[root@i-iehivbeb data]# ll
total 254000
drwxr-xr-x  9 elasticsearch elasticsearch      4096 Dec 17 09:52 elasticsearch-6.5.3
drwxr-xr-x  9 elasticsearch elasticsearch      4096 May 14 11:23 elasticsearch-6.5.3-node0
drwxr-xr-x  9 elasticsearch elasticsearch      4096 May 14 11:35 elasticsearch-6.5.3-node1
drwxr-xr-x  9 elasticsearch elasticsearch      4096 May 14 11:40 elasticsearch-6.5.3-node2

修改node1和node2的es配置文件内容

[root@i-iehivbeb data]# vim /data/elasticsearch-6.5.3-node1/config/elasticsearch.yml

cluster.name: es-cluster-dev
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate 
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
node.name: node-1
network.host: 0.0.0.0
http.port: 9201
transport.tcp.port: 9301
discovery.zen.ping.unicast.hosts: ["192.168.0.15:9300", "192.168.0.15:9301", "192.168.0.15:9302"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"

[root@i-iehivbeb data]# vim /data/elasticsearch-6.5.3-node2/config/elasticsearch.yml

cluster.name: es-cluster-dev
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate 
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
node.name: node-2
network.host: 0.0.0.0
http.port: 9202
transport.tcp.port: 9302
discovery.zen.ping.unicast.hosts: ["192.168.0.15:9300", "192.168.0.15:9301", "192.168.0.15:9302"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"

注意:这一步很重要,删除节点2和节点3的data数据,不删除会导致elasticsearch 集群无法启动出现如下提示 failed to send join request to master

rm  /data/elasticsearch-6.5.3-node1/data/ -rf

rm  /data/elasticsearch-6.5.3-node2/data/ -rf

 

ok,至此,三个集群节点的配置都已修改完成,下一步,新增守护进程配置,启动es

2.2 logstash设置

因为上面已经设置了es集群,所以我们在日志入库的时候最好也指定多节点的es的http端口

修改hosts参数为hosts => ["192.168.0.15:9200","192.168.0.15:9201","192.168.0.15:9202"]

当然,就算指定某一个节点也是能正常运行的

logstash整个配置我也写下来

# 监听5044端口作为输入
input {
    beats {
        port => "5044"
    }
}
# 数据过滤
filter {
  if [logtype] == "otosaas_app_xingneng" {
    grok {
        match => { "message" => "%{DATA:logDate}\[\|\]%{DATA:requestId}\[\|\]%{DATA:appName}\[\|\]%{DATA:requestMethod}\[\|\]%{DATA:apiName}\[\|\]%{DATA:hostIP}\[\|\]%{DATA:hostPort}\[\|\]%{DATA:sourceIP}\[\|\]%{DATA:costTime}\[\|\]%{DATA:bizCode}\[\|\]" }
    }
    geoip {
        source => "clientip"
    }
  }

  if [logtype] == "otosaas_app_yunxing" {
    grok {
        match => { "message" => "%{DATA:logDate}\[\|\]%{DATA:requestId}\[\|\]%{DATA:appName}\[\|\]%{DATA:apiName}\[\|\]%{DATA:hostIP}\[\|\]%{DATA:sourceIP}\[\|\]%{DATA:requestParams}\[\|\]%{DATA:logType}\[\|\]%{DATA:logContent}\[\|\]" }
    }
    geoip {
        source => "clientip"
    }
  }

  if [logtype] == "otosaas_konglog" {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
    geoip {
        source => "clientip"
    }
  }
    }
  }
  #全链路日志
  if [logtype] == "otosaas_qlllog" {
    grok {
        match => { "message" => '\[%{TIMESTAMP_ISO8601:timestamp}\] %{NUMBER:mesc} %{DATA:httphost} %{IPORHOST:client_ip} \"%{DATA:server_ip}\" %{NUMBER:request_status} %{BASE16FLOAT:request_time} %{NUMBER:bytes_sent} \"(?:HTTP/%{NUMBER:httpversion})\" \"%{WORD:request_method}\" \"%{DATA:request_uri}\" \"%{DATA:http_referer}\" \"(%{DATA:request_body}?|-)\" \"%{DATA:upstream_ip}\" (?:%{NUMBER:upstream_time}|-) %{QS:agent} %{QS:referrer} \"%{WORD:request_id}\" \"%{DATA:http_rid}\" \"%{DATA:http_lbid}\"' }
    }
    mutate{
        convert => {
         "request_time" => "float"
         "request_status" => "integer"
         "bytes_sent" => "integer"
         "httpversion" => "float"
        }
    }
    geoip {
        source => "clientip"
    }
  }
}
# 输出配置为本机的9200端口,这是ElasticSerach服务的监听端口
output {
  if [logtype] == "otosaas_app_xingneng" {
    elasticsearch {
        user => "elastic"
        password => "密码"
        hosts => ["192.168.0.15:9200","192.168.0.15:9201","192.168.0.15:9202"]
        index => "otosaas_app_xingneng-%{+YYYY.MM.dd}"
    }
  }
  if [logtype] == "otosaas_app_yunxing" {
    elasticsearch {
        user => "elastic"
        password => "密码"
        hosts => ["192.168.0.15:9200","192.168.0.15:9201","192.168.0.15:9202"]
        index => "otosaas_app_yunxing-%{+YYYY.MM.dd}"
    }
  }
  if [logtype] == "otosaas_konglog" {
    elasticsearch {
        user => "elastic"
        password => "密码"
        hosts => ["192.168.0.15:9200","192.168.0.15:9201","192.168.0.15:9202"]
        index => "otosaas_konglog-%{+YYYY.MM.dd}"
    }
  }
  if [logtype] == "otosaas_qlllog" {
    elasticsearch {
        user => "elastic"
        password => "密码"
        hosts => ["192.168.0.15:9200","192.168.0.15:9201","192.168.0.15:9202"]
        index => "otosaas_qlllog-%{+YYYY.MM.dd}"
    }
  }
}

2.3 守护进程配置

新增守护进程配置

vim /etc/supervisord.d/es-cluster-node0.ini 

[program:es-cluster-node0]
command=/data/elasticsearch-6.5.3-node0/bin/elasticsearch
directory=/data/elasticsearch-6.5.3-node0/bin
user=elasticsearch
redirect_stderr=true
stdout_logfile=/data/elkrunlog/es-cluster-node0.log
autostart=true
autorestart=true
;startsecs=10000
;stopwaitsecs=600
killasgroup=true
environment=JAVA_HOME=/usr/local/jdk1.8.0_181

vim /etc/supervisord.d/es-cluster-node1.ini  

[program:es-cluster-node1]
command=/data/elasticsearch-6.5.3-node1/bin/elasticsearch
directory=/data/elasticsearch-6.5.3-node1/bin
user=elasticsearch
redirect_stderr=true
stdout_logfile=/data/elkrunlog/es-cluster-node1.log
autostart=true
autorestart=true
;startsecs=10000
;stopwaitsecs=600
killasgroup=true
environment=JAVA_HOME=/usr/local/jdk1.8.0_181

vim /etc/supervisord.d/es-cluster-node2.ini   

[program:es-cluster-node2]
command=/data/elasticsearch-6.5.3-node2/bin/elasticsearch
directory=/data/elasticsearch-6.5.3-node2/bin
user=elasticsearch
redirect_stderr=true
stdout_logfile=/data/elkrunlog/es-cluster-node2.log
autostart=true
autorestart=true
;startsecs=10000
;stopwaitsecs=600
killasgroup=true
environment=JAVA_HOME=/usr/local/jdk1.8.0_181

[root@i-iehivbeb supervisord.d]# supervisorctl update
elasticsearch: stopped
elasticsearch: removed process group
es-cluster-node0: added process group
es-cluster-node1: added process group
es-cluster-node2: added process group

[root@i-iehivbeb data]# supervisorctl status
es-cluster-node0                 RUNNING   pid 23703, uptime 0:00:18
es-cluster-node1                 RUNNING   pid 23783, uptime 0:00:11
es-cluster-node2                 RUNNING   pid 23849, uptime 0:00:05

 

[root@i-iehivbeb data]# netstat  -tunlp|grep java |sort

2.4 查看结果

注意,6.5的kibana还不支持连接es集群,只能单机连,所以为一般会在每个es服务器上装kibana,kibana连接本机es,通过负载均衡连kibana做负载。注意6.8以及之后的版本直接在kibana.yml中配置以下参数就能支持连接集群

elasticsearch.hosts:
  - http://elasticsearch1:9200
  - http://elasticsearch2:9200

登录kibana查看一下

至此,完成升级扩容

<think>好的,我现在需要帮用户介绍如何将ELK从单点扩容集群。首先,我得回顾一下ELK的基本概念,确保自己理解正确。ELKElasticsearch、Logstash和Kibana的集合,主要用于日志处理和分析。用户的问题是关于扩容集群,所以重点应该在Elasticsearch,因为它负责存储和搜索数据,而Logstash和Kibana可能相对简单些。 接下来,用户可能想知道扩容的原因。可能他们的数据量增加了,或者遇到了性能问题,比如查询变慢,存储不足,或者高可用性需求。作为回答的一部分,应该先简要说明为什么需要扩容,比如提高可用性、处理更大数据量、提升性能等。 然后,我需要分步骤介绍扩容过程。可能包括准备新节点、修改配置、启动节点、分片调整等。这里需要注意Elasticsearch集群的基本概念,比如节点类型(主节点、数据节点、协调节点)、分片和副本的设置。可能还需要提到一些最佳实践,比如分开节点角色,设置适当的分片数,避免脑裂问题等。 另外,用户可能对具体操作步骤不太熟悉,需要详细说明每个步骤,比如如何修改elasticsearch.yml配置文件,如何添加新的节点,如何监控集群状态,以及如何处理可能遇到的问题,比如分片未分配的情况。 还要考虑Logstash和Kibana的集群部署。虽然Elasticsearch是核心,但Logstash可能需要考虑负载均衡和高可用,比如使用多个Logstash实例,或者结合消息队列如Kafka。Kibana的话,通常可以部署多个实例,通过负载均衡器来分配请求,需要确保它们连接到同一个Elasticsearch集群。 安全方面也不能忽视,比如在集群中启用安全功能,设置SSL/TLS加密通信,以及认证授权机制。这些在单点可能没有配置,但在集群中是必要的。 最后,扩容后的验证和优化步骤很重要,比如检查集群健康状态,测试性能,调整分片策略,监控资源使用情况等。可能还需要提醒用户注意分片数量和大小的控制,避免过多分片影响性能。 需要确保回答结构清晰,步骤明确,同时解释每一步的原因和注意事项。可能用户是运维人员或开发者,具备一定的技术背景,但可能需要具体的操作指导,所以提供命令示例和配置片段会更有帮助。 另外,考虑用户可能遇到的问题,比如网络配置错误,节点无法加入集群,分片分配问题等,可以在步骤中穿插一些常见问题解决方法,或者建议查阅官方文档和日志排查。 总结下来,回答的结构应该是:介绍扩容原因,详细步骤(分Elasticsearch、Logstash、Kibana),安全配置,验证优化,注意事项。这样用户能系统地了解整个过程,并实施操作。</think>将 ELKElasticsearch、Logstash、Kibana)从单点部署扩容集群,主要是为了解决单点性能瓶颈、提高可用性和数据容灾能力。以下是分步骤的实现思路和关键注意事项: --- ### **一、扩容原因** 1. **高可用性**:避免单点故障导致服务中断。 2. **横向扩展**:通过增加节点提升数据处理和查询性能。 3. **存储扩容**:支持更大数据量存储。 4. **负载均衡**:分散读写压力,提升吞吐量。 --- ### **二、Elasticsearch 集群化** ElasticsearchELK 的核心,集群化需重点关注: #### **1. 节点角色规划** - **主节点(Master)**:负责集群状态管理(建议 3 个专用主节点,避免脑裂)。 - **数据节点(Data)**:存储数据、执行读写操作。 - **协调节点(Coordinating)**:处理客户端请求,转发到数据节点。 - **Ingest 节点**:数据预处理(可选)。 **配置示例**(`elasticsearch.yml`): ```yaml # 主节点配置 node.master: true node.data: false # 数据节点配置 node.master: false node.data: true ``` #### **2. 集群配置** - **集群名称一致**:所有节点需配置相同的 `cluster.name`。 - **节点发现机制**:通过 `discovery.seed_hosts` 指定种子节点。 - **网络设置**:确保节点间端口(默认 9300)互通。 ```yaml cluster.name: my-elk-cluster discovery.seed_hosts: ["node1_ip", "node2_ip", "node3_ip"] cluster.initial_master_nodes: ["node1_name", "node2_name", "node3_name"] ``` #### **3. 添加新节点** 1. 在新服务器安装 Elasticsearch,修改配置后启动服务。 2. 节点会自动加入集群,通过 `GET /_cat/nodes` 验证。 #### **4. 分片与副本调整** - **分片数**:在创建索引时指定(如 `number_of_shards: 5`),后期无法直接修改,需通过 Reindex。 - **副本数**:动态调整 `number_of_replicas`,确保数据冗余。 ```bash PUT /my_index/_settings { "index.number_of_replicas": 1 } ``` --- ### **三、Logstash 扩展** 1. **多实例部署**:在不同服务器部署多个 Logstash 实例,分摊数据处理压力。 2. **结合消息队列**:使用 Kafka 或 Redis 作为缓冲层,实现生产-消费解耦。 3. **配置文件管理**:通过版本控制工具(如 Git)统一管理配置。 --- ### **四、Kibana 集群化** 1. **多实例负载均衡**:部署多个 Kibana 实例,通过 Nginx 或 HAProxy 实现负载均衡。 2. **共享配置**:所有 Kibana 实例指向同一 Elasticsearch 集群。 3. **Session 一致性**:若使用负载均衡,需配置 Session 粘滞或集中存储。 --- ### **五、安全加固** 1. **启用 HTTPS**:为 Elasticsearch 和 Kibana 配置 SSL/TLS。 2. **身份认证**:使用 X-Pack 或 OpenDistro 的安全插件。 3. **权限控制**:通过角色(Role)限制用户访问权限。 --- ### **六、验证与优化** 1. **集群健康检查**:`GET /_cluster/health` 确保状态为 `green`。 2. **性能测试**:使用 `_bulk` API 或工具(如 esrally)压测。 3. **监控工具**:通过 Elastic Stack 自带的 Monitoring 或 Prometheus + Grafana 监控集群状态。 --- ### **七、注意事项** 1. **分片设计**:单个分片大小建议 10-50GB,避免过多分片影响性能。 2. **滚动重启**:集群升级时逐个重启节点,避免服务中断。 3. **备份策略**:使用 Snapshot and Restore 功能定期备份数据。 --- 通过以上步骤,ELK 系统可从单点扩展为高可用集群,满足企业级日志处理需求。实施前建议在测试环境验证配置,并详细阅读[官方文档](https://www.elastic.co/guide/index.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值