👻
Elasticsearch 8系でのクラスタの作り方
Elasticsearchの公式ドキュメント見ても、「こういう構成のクラスタは具体的にどう作るの?」の手順がないか、非常にわかりにくかったので、成功した手順をまとめておきます。
前提
- インストールするelasticsearchはversion 8系
- ubuntu 22.04 LTSのVMに直接インストールする
- elasticsearchクラスタの構成は以下ですが、
node.roles
を変えれば大抵のクラスタは作れそう- master x3
- data x5
-
xpack.security
は無効化する- 内部通信TLS化はクローズドネットワークを想定するのでしない
- 必要な方は適宜設定ファイルを書き直してください
手順
-
ubuntu 22.04のVMを8台作成します
-
全VM上でrootをとります
sudo su -
-
全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
-
全VM上でkernelパラメータ
vm.max_map_count
のセットecho vm.max_map_count=262144 > /etc/sysctl.d/90-elasticsearch.conf sysctl --system
-
マスターノードを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
-
残りのマスターノード(
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を叩くことができる -
データノード(
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