👻

Elasticsearch 8系でのクラスタの作り方

2023/06/11に公開

Elasticsearchの公式ドキュメント見ても、「こういう構成のクラスタは具体的にどう作るの?」の手順がないか、非常にわかりにくかったので、成功した手順をまとめておきます。

前提

  • インストールするelasticsearchはversion 8系
  • ubuntu 22.04 LTSのVMに直接インストールする
  • elasticsearchクラスタの構成は以下ですが、 node.roles を変えれば大抵のクラスタは作れそう
    • master x3
    • data x5
  • xpack.security は無効化する
    • 内部通信TLS化はクローズドネットワークを想定するのでしない
    • 必要な方は適宜設定ファイルを書き直してください

手順

  1. ubuntu 22.04のVMを8台作成します

  2. 全VM上でrootをとります

    sudo su -
    
  3. 全VM上で以下のコマンドを実行し、elasticsearchパッケージをインストールします。

    export DEBIAN_FRONTEND=noninteractive
    wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
    apt-get update && apt-get install -y apt-transport-https
    echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-8.x.list
    apt-get update && apt-get install -y elasticsearch   
    
  4. 全VM上でkernelパラメータ vm.max_map_count のセット

    echo vm.max_map_count=262144 > /etc/sysctl.d/90-elasticsearch.conf
    sysctl --system
    
  5. マスターノードを1台選出(master01とする)し、/etc/elasticsearch/elasticsearch.ymlを書いてサービス再起動

    # place elasticsearch config file
    cat << EOF > /etc/elasticsearch/elasticsearch.yml
    cluster.name: my-cluster
    node.name: master01
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    network.host: <master01のIP>
    http.port: 9200
    discovery.seed_hosts: [<master01のIP>]
    cluster.initial_master_nodes: [<master01のIP>]
    xpack.security.enabled: false
    xpack.security.transport.ssl.enabled: false
    xpack.security.http.ssl.enabled: false
    http.host: 0.0.0.0
    node.roles: ["master"]
    EOF
    chown elasticsearch:elasticsearch /etc/elasticsearch/elasticsearch.yml
    
    # restart elasticsearch
    systemctl restart elasticsearch
    
  6. 残りのマスターノード(master02, master03とする)に対しても、/etc/elasticsearch/elasticsearch.ymlを書いてサービス再起動

    # place elasticsearch config file
    cat << EOF > /etc/elasticsearch/elasticsearch.yml
    cluster.name: my-cluster
    node.name: master02
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    network.host: <master02のIP>
    http.port: 9200
    discovery.seed_hosts: [<master01のIP>,<master02のIP>]
    xpack.security.enabled: false
    xpack.security.transport.ssl.enabled: false
    xpack.security.http.ssl.enabled: false
    http.host: 0.0.0.0
    node.roles: ["master"]
    EOF
    chown elasticsearch:elasticsearch /etc/elasticsearch/elasticsearch.yml
    
    # restart elasticsearch
    systemctl restart elasticsearch
    
    # place elasticsearch config file
    cat << EOF > /etc/elasticsearch/elasticsearch.yml
    cluster.name: my-cluster
    node.name: master03
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    network.host: <master01のIP>
    http.port: 9200
    discovery.seed_hosts: [<master01のIP>,<master02のIP>,<master03のIP>]
    xpack.security.enabled: false
    xpack.security.transport.ssl.enabled: false
    xpack.security.http.ssl.enabled: false
    http.host: 0.0.0.0
    node.roles: ["master"]
    EOF
    chown elasticsearch:elasticsearch /etc/elasticsearch/elasticsearch.yml
    
    # restart elasticsearch
    systemctl restart elasticsearch
    

    cluster.initial_master_nodes を書かないところと、discovery.seed_hosts を徐々に増やすところがミソ。この時点でクラスタのbootstrapは完了し、マスターノードに対してAPIを叩くことができる

  7. データノード(data01-data05とする)に対しても、/etc/elasticsearch/elasticsearch.ymlを書いてサービス再起動

    # place elasticsearch config file
    cat << EOF > /etc/elasticsearch/elasticsearch.yml
    cluster.name: my-cluster
    node.name: <dataXX(XX=01-05)>
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    network.host: <dataXX(XX=01-05)のIP>
    http.port: 9200
    discovery.seed_hosts: [<master01のIP>,<master02のIP>,<master03のIP>]
    xpack.security.enabled: false
    xpack.security.transport.ssl.enabled: false
    xpack.security.http.ssl.enabled: false
    http.host: 0.0.0.0
    node.roles: [data]
    EOF
    chown elasticsearch:elasticsearch /etc/elasticsearch/elasticsearch.yml
    
    # restart elasticsearch
    systemctl restart elasticsearch
    

    ここまでで、curl "<master01のIP>:9200/_cat/nodes?format=json&filter_path=ip,name" | jq . を叩くと、次のように登録されたelasticsearch node達のIPと名前が返ってくる。

    curl "172.31.0.110:9200/_cat/nodes?format=json&filter_path=ip,name" | jq .
    [
      {
        "ip": "172.31.0.210",
        "name": "elasticsearchdata4.novalocal"
      },
      {
        "ip": "172.31.0.140",
        "name": "elasticsearchmaster2.novalocal"
      },
      {
        "ip": "172.31.0.204",
        "name": "elasticsearchdata0.novalocal"
      },
      {
        "ip": "172.31.0.86",
        "name": "elasticsearchdata3.novalocal"
      },
      {
        "ip": "172.31.0.16",
        "name": "elasticsearchmaster1.novalocal"
      },
      {
        "ip": "172.31.0.115",
        "name": "elasticsearchdata2.novalocal"
      },
      {
        "ip": "172.31.0.110",
        "name": "elasticsearchmaster0.novalocal"
      },
      {
        "ip": "172.31.0.186",
        "name": "elasticsearchdata1.novalocal"
      }
    ]
    

Discussion