V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Songxwn
V2EX  ›  分享发现

Elasticsearch 安装配置集群系统

  •  1
     
  •   Songxwn · 362 天前 · 1071 次点击
    这是一个创建于 362 天前的主题,其中的信息可能已经有所发展或是发生改变。

    欢迎关注和订阅

    个人博客(会更新修改): https://songxwn.com/elk_cluster/

    知乎: https://zhuanlan.zhihu.com/p/625990164

    介绍

    本教程客户端 API 关闭 HTTPS 认证,但传输使用 HTTPS 。(为了接入日志监控

    主要介绍了 ES 集群的搭建。ELK 单机使用可参考:https://songxwn.com/elk/

    Elasticsearch 版本:8.x

    系统版本:Rocky 8.7 (关闭 SE Linux 和防火墙)

    配置要求:建议 4 核 8G 以上,存储空间按照存储的文档大小规划。

    Elasticsearch 集群建议至少要有三个节点,两个以上的 master 节点。

    概念

    ( 1 )集群( Cluster ):ES 可以作为一个独立的单个搜索服务器。不过,为了处理大型数据集,实现容错和高可用性,ES 可以运行在许多互相合作的服务器上。这些服务器的集合称为集群。

    ( 2 )节点( Node ): 形成集群的每个服务器称为节点。

    ( 3 )索引(index): 在 ES 中, 索引是一组文档的集合。

    ( 4 )分片( shard )

    当有大量的文档时,由于内存的限制、磁盘处理能力不足、无法足够快的响应客户端的请求等,一个节点可能不够。这种情况下,数据可以分为较小的分片。每个分片放到不同的服务器上。

    当你查询的索引分布在多个分片上时,ES 会把查询发送给每个相关的分片,并将结果组合在一起,而应用程序并不知道分片的存在。即:这个过程对用户来说是透明的。

    ( 5 )副本( Replia )

    为提高查询吞吐量或实现高可用性,可以使用分片副本。

    副本是一个分片的精确复制,每个分片可以有零个或多个副本。ES 中可以有许多相同的分片,其中之一被选择更改索引操作,这种特殊的分片称为主分片。

    当主分片丢失时,如:该分片所在的数据不可用时,集群将副本提升为新的主分片。

    区别

    分片与副本的区别在于:

    当你分片设置为 5 ,数据量为 30G 时,es 会自动帮我们把数据均衡地分配到 5 个分片上,即每个分片大概有 6G 数据,当你查询数据时,ES 会把查询发送给每个相关的分片,并将结果组合在一起。

    而副本,就是对分布在 5 个分片的数据进行复制。因为分片是把数据进行分割而已,数据依然只有一份,这样的目的是保障查询的高效性,副本则是多复制几份分片的数据,这样的目的是保障数据的高可靠性,防止数据丢失。

    注意

    索引建立后,分片个数是不可以更改的。

    安装

    系统参数调整

    修改虚拟内存大小

    cat >> /etc/sysctl.conf <<EOF
    vm.max_map_count=655360
    fs.file-max=655360
    EOF
    
    sysctl -p
    
    # 执行在线生效。
    
    

    修改所有用户限制

    cat >> /etc/security/limits.conf <<EOF
    * soft nofile 924000
    * hard nofile 924000
    * soft nproc 4096
    * hard nproc 4096
    EOF
    
    # 永久生效,但需要重启。
    
    

    正式安装

    yum 源配置

    vim /etc/yum.repos.d/elasticsearch.repo
    
    [elasticsearch]
    name=Elasticsearch repository for 8.x packages
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/elasticstack/8.x/yum
    gpgcheck=0
    enabled=1
    autorefresh=1
    type=rpm-md
    
    # 使用清华大学镜像源,关闭 gpg 认证。
    
    

    集群规划,集群名字为 ES-CU1

    节点名字 IP 角色规划
    ES-01 100.64.128.101 master 、data
    ES-02 100.64.128.102 master 、data
    ES-03 100.64.128.103 master 、data

    vim /etc/hosts
    
    
    100.64.128.101 ES-01
    100.64.128.102 ES-02
    100.64.128.103 ES-03
    
    # 配置本地主机名解析,通过 ping 验证。每个节点都要配置
    
    

    安装

    dnf install elasticsearch logstash kibana -y
    
    # 注意安装后会自动生成证书和密码,注意配置前不要启动。
    
    

    关闭 HTTPS 认证(每台节点配置)

    vim /etc/elasticsearch/elasticsearch.yml
    
    
    # Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
    xpack.security.http.ssl:
      enabled: false
    #  keystore.path: certs/http.p12
    
      
    
    

    xpack.security.http.ssl 改为 false ,并注释证书路径。

    配置集群(每台节点配置,但 node.name 和 IP 需要修改)

    ##ES-01 配置#################################################
    
    vim /etc/elasticsearch/elasticsearch.yml 
    
    cluster.name: ES-CU1
    node.name: ES-01
    http.host: 100.64.128.101
    transport.host: 100.64.128.101
    network.host: 100.64.128.101
    node.roles: [master,data]
    discovery.seed_hosts: ["100.64.128.101:9300","100.64.128.102:9300","100.64.128.103:9300"]
    cluster.initial_master_nodes: ["ES-01"]
    
    
    ##ES-02 配置#################################################
    
    
    
    vim /etc/elasticsearch/elasticsearch.yml 
    
    
    cluster.name: ES-CU1
    node.name: ES-02
    http.host: 100.64.128.102
    transport.host: 100.64.128.102
    network.host: 100.64.128.102
    node.roles: [master,data]
    discovery.seed_hosts: ["100.64.128.101:9300","100.64.128.102:9300","100.64.128.103:9300"]
    cluster.initial_master_nodes: ["ES-01"]
    
    
    
    ##ES-03 配置#################################################
    
    vim /etc/elasticsearch/elasticsearch.yml 
    
    
    cluster.name: ES-CU1
    node.name: ES-03
    http.host: 100.64.128.103
    transport.host: 100.64.128.103
    network.host: 100.64.128.103
    node.roles: [master,data]
    discovery.seed_hosts: ["100.64.128.101:9300","100.64.128.102:9300","100.64.128.103:9300"]
    cluster.initial_master_nodes: ["ES-01"]
    
    
    
    
    # 注意防火墙开放端口 9200 和 9300 端口。
    # 注意默认配置文件有 http.host 和 cluster.initial_master_nodes 配置,注意删除或修改。
    
    
    • cluster.name 为集群名字,集群内所有节点必须统一。
    • node.name 为节点名字,每个节点不能一样。
    • http.host 、transport.host 、network.host 配置为主机的 IP 地址。
    • node.roles: [master,data],为配置节点角色,目前为主节点和存储节点。说明文档
    • discovery.seed_hosts 配置发现其他节点,一般写所有节点的地址,后面加上传输节点的端口号。默认为 9300.
    • cluster.initial_master_nodes 节点初始化默认主节点选定。

    启动 ES-01 ,验证并配置其他节点同步证书。

    ES-01 (第一个启动,其他节点先不要启动。使用 ES-01 自动生成的证书)

    systemctl enable elasticsearch.service 
    
    # 设置开机启动
    
    systemctl restart elasticsearch.service
    
    # 启动
    
    curl -q http://100.64.128.101:9200
    
    # 验证启动
    
    

    注意:安装之后其他节点不能启动,要等配置好集群配置和证书后启动。

    如果启动过了,建议按照教程最后的教程清理按照。

    ES-02

    SCP 教程

    scp -r ES-01:/etc/elasticsearch/certs/ /etc/elasticsearch/
    scp -r ES-01:/etc/elasticsearch/elasticsearch.keystore /etc/elasticsearch/
    
    # scp 同步证书文件和密钥文件,也可以手动下载上传。
    
    
    systemctl enable elasticsearch.service 
    
    # 设置开机启动
    
    systemctl restart elasticsearch.service
    
    
    # 启动
    
    curl -q http://100.64.128.102:9200
    
    # 简单验证启动,如有返回字符则启动生成。
    
    

    ES-03

    scp -r ES-01:/etc/elasticsearch/certs/ /etc/elasticsearch/
    
    scp -r ES-01:/etc/elasticsearch/elasticsearch.keystore /etc/elasticsearch/
    
    
    # scp 同步覆盖证书文件和密钥文件,也可以手动下载上传。
    
    
    systemctl enable elasticsearch.service 
    
    
    # 设置开机启动
    
    
    systemctl restart elasticsearch.service
    
    
    # 启动
    
    
    curl -q http://100.64.128.103:9200
    
    
    # 简单验证启动,如有返回字符则启动生成。
    
    

    默认文件目录说明

    配置文件目录

    tree -L 2 /etc/elasticsearch/
    /etc/elasticsearch/
    ├── certs
    │   ├── http_ca.crt
    │   ├── http.p12
    │   └── transport.p12
    ├── elasticsearch.keystore
    ├── elasticsearch-plugins.example.yml
    ├── elasticsearch.yml
    ├── jvm.options
    ├── jvm.options.d
    ├── log4j2.properties
    ├── role_mapping.yml
    ├── roles.yml
    ├── users
    └── users_roles
    
    # certs 为默认生成的证书存储目录,http_ca.crt 为根证书、http.p12 为默认 9200 所使用的 web 服务器证书,transport.p12 为传输节点之间使用的证书。
    
    # elasticsearch.keystore 为存储密码所使用的文件,如证书密码,LDAP 访问密码、邮箱密码等。
    
    # elasticsearch.yml 为主配置文件。
    
    # jvm.options 为 ES 的 JAVA 启动配置文件,可以修改启动内存等配置。
    
    

    程序目录

    tree -L 1 /usr/share/elasticsearch
    /usr/share/elasticsearch
    ├── bin
    ├── jdk
    ├── lib
    ├── LICENSE.txt
    ├── modules
    ├── NOTICE.txt
    ├── plugins
    └── README.asciidoc
    
    # bin 存放二进制启动文件的目录
    # jdk 存放自带 JAVA 版本的目录
    
    

    日志目录

    tree -L 1 /var/log/elasticsearch/
    /var/log/elasticsearch/
    ├── elasticsearch_audit.json
    ├── elasticsearch_deprecation.json
    ├── elasticsearch_index_indexing_slowlog.json
    ├── elasticsearch_index_search_slowlog.json
    ├── elasticsearch.log
    ├── elasticsearch_server.json
    ├── ES-CU1_audit.json
    ├── ES-CU1_deprecation.json
    ├── ES-CU1_index_indexing_slowlog.json
    ├── ES-CU1_index_search_slowlog.json
    ├── ES-CU1.log
    ├── ES-CU1_server.json
    ├── gc.log
    ├── gc.log.00
    
    # 可用于排错
    
    

    数据存储目录

    tree -L 1 /var/lib/elasticsearch/
    /var/lib/elasticsearch/
    ├── indices
    ├── node.lock
    ├── nodes
    ├── snapshot_cache
    └── _state
    
    # 存放数据
    
    

    重置管理员密码和验证集群数量

    重置密码

    usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
    
    # 重置最高管理员 elastic 密码,全节点同步
    
    /usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system
    
    # 重置 kibana_system 密码,全节点同步,下面接入 kibana 使用。
    
    
    
    curl -k -u elastic http://100.64.128.101:9200
    Enter host password for user 'elastic':
    {
      "name" : "ES-01",
      "cluster_name" : "ES-CU1",
      "cluster_uuid" : "UNCqtG1YTeuHSNgDHOHkIw",
      "version" : {
        "number" : "8.7.0",
        "build_flavor" : "default",
        "build_type" : "rpm",
        "build_hash" : "09520b59b6bc1057340b55750186466ea715e30e",
        "build_date" : "2023-03-27T16:31:09.816451435Z",
        "build_snapshot" : false,
        "lucene_version" : "9.5.0",
        "minimum_wire_compatibility_version" : "7.17.0",
        "minimum_index_compatibility_version" : "7.0.0"
      },
      "tagline" : "You Know, for Search"
    }
    
    # 使用上面重置的密码,查看 ES 是否可用。
    
    curl -k -u elastic http://100.64.128.101:9200/_cat/nodes?v
    Enter host password for user 'elastic':
    ip             heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
    100.64.128.102            5          92   1    0.01    0.03     0.00 dm        -      ES-02
    100.64.128.101           18          93   5    0.20    0.35     0.17 dm        *      ES-01
    100.64.128.103           17          89   1    0.02    0.05     0.02 dm        -      ES-03
    
    
    # 使用上面重置的密码,可以查看所有在线的集群。
    
    

    配置 Kibana 接入集群

    默认配置

    默认为 5601 端口,默认绑定为 127.0.0.1 地址。使用 HTTP 协议。

    可以修改 kibana.yml 文件修改绑定地址,或者使用 Nginx 反向代理。

    修改语言和监听 IP

    vim /etc/kibana/kibana.yml  
    
    i18n.locale: "zh-CN"
    
    server.host: "0.0.0.0"
    
    # 配置语言和监听 IP 。
    
    systemctl enable --now kibana.service
    
    # 配置开机启动和启动。
    
    

    基本认证配置

    vim /etc/kibana/kibana.yml 
    
    
    # =================== System: Elasticsearch ===================
    
    
    elasticsearch.hosts: ["http://100.64.128.101:9200","http://100.64.128.102:9200","http://100.64.128.103:9200"]
    
    
    elasticsearch.username: "kibana_system"
    elasticsearch.password: "EVecudsC4vvlcR6QT4mR"
    
    

    修改文件,配置 ES 所有访问地址,配置系统默认账号 kibana_system 的密码,填入配置文件。(必须为此账号)

    使用systemctl restart kibana.service重启服务,使配置生效。

    在 Kibana 上查看和监测 ES 集群

    vim /etc/kibana/kibana.yml 
    
    monitoring.ui.ccs.enabled: false
    
    # 添加配置文件,重启生效。
    
    /usr/share/elasticsearch/bin/elasticsearch-reset-password -u beats_system
    
    # 重置自带的 beats_system 的密码,在下面使用。
    
    dnf install metricbeat -y
    
    systemctl enable --now metricbeat.service
    
    metricbeat modules enable elasticsearch-xpack
    
    # 安装 metricbeat 并启用监控 ES 模块。
    
    
    vim /etc/metricbeat/metricbeat.yml 
    
    output.elasticsearch:
      hosts: ["http://100.64.128.101:9200","http://100.64.128.102:9200","http://100.64.128.103:9200"]
      username: "beats_system"
      password: "1@PASSWORD"
      
    # 配置集群地址,账号密码,接入 ES 。
      
    
    systemctl restart metricbeat.service 
    
    

    访问 http://100.64.128.101:5601/app/monitoring路径

    即可查看监控,使用 elastic 账号登录。

    彻底清理卸载 ES

    systemctl stop elasticsearch
    
    # 停止服务
    
    dnf remove elasticsearch -y
    
    # 使用 dnf 包管理器删除
    
    rm -rf /var/lib/elasticsearch
    
    # 清理默认数据存储文件
    
    rm -rf /etc/elasticsearch
    
    # 清理配置文件及默认证书和密钥存储
    
    rm -rf /usr/share/elasticsearch
    
    # 清理程序所在目录
    
    rm -rf /var/log/elasticsearch
    
    # 清理日志存储
    
    

    相关教程

    单机部署 ELK ,接收 syslog 。

    接入 ES 做日志告警

    配置接收 SNMP-Trap 日志

    11 条回复    2024-01-08 16:41:24 +08:00
    julyclyde
        1
    julyclyde  
       360 天前
    为什么 为了接入日志监控,就必须 http 不开启 ssl 、transport 开启 ssl 呢?
    Songxwn
        2
    Songxwn  
    OP
       360 天前
    @julyclyde 为了兼容问题,我使用的日志兼容软件不支持 ES8 的加密算法。

    https://songxwn.com/frostmourne_install/
    Songxwn
        3
    Songxwn  
    OP
       360 天前
    @julyclyde 是的,就是为了接入日志监控,所以只 http 关闭就行了。看实际使用情况吧,不关闭也没事。
    julyclyde
        4
    julyclyde  
       360 天前
    @Songxwn 是因为你那个日志软件搭配的 jdk 太低导致的吗?
    Songxwn
        5
    Songxwn  
    OP
       360 天前
    @julyclyde 是的,还不支持 Java 17
    jack1998
        6
    jack1998  
       112 天前
    有没有 docker/compose 部署呢?
    Songxwn
        7
    Songxwn  
    OP
       112 天前
    @jack1998 官方文档有,数据库还是习惯本地安装
    jack1998
        9
    jack1998  
       109 天前
    请问怎样在 compose 里指定哪一个 es 的 node 是 data /client ,google 查到 env 里添加 node.data=true 后官方 compose 里起不来
    Songxwn
        10
    Songxwn  
    OP
       109 天前
    @jack1998 #9 不懂,没用 docker 部署过
    jack1998
        11
    jack1998  
       109 天前
    @Songxwn 没事 谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2680 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:31 · PVG 23:31 · LAX 08:31 · JFK 11:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.