Elasticsearch の基本概念
Elasticsearch を効率的に運用するために、まず以下のコア概念を理解する必要があります。
- ノード (Node): Elasticsearch が動作している単一のサーバーインスタンスです。
- クラスター (Cluster): 同じ
cluster.name設定を共有し、データを共同で管理するノードの集合体です。 - インデックス (Index): ドキュメントを保存する論理的な名前空間であり、1つ以上のシャードで構成されます。
- シャード (Shard): データを分散保持するための最小単位です。プライマリシャードとレプリカシャードが存在し、インデックス作成時にプライマリ数を決定します。
// インデックス作成時のシャード設定例
PUT /system-logs
{
"settings": {
"index.number_of_shards": 3,
"index.number_of_replicas": 1
}
}
// 実行中のインデックスに対するレプリカ数の変更
PUT /system-logs/_settings
{
"index.number_of_replicas": 2
}
クラスターの健康状態確認
クラスターの状態を把握するための基本的な API です。
GET /_cluster/health
// 応答例
{
"cluster_name": "data-cluster",
"status": "green", // green: 全て正常, yellow: 全レプリカが未割り当て, red: 一部のプライマリが未割り当て
"number_of_nodes": 3,
"active_primary_shards": 50,
"active_shards_percent_as_number": 100.0
}
Elasticsearch クラスターの構築設定
各ノードの elasticsearch.yml を設定します。ここではマスターノードとデータノードの構成例を示します。
マスターノード設定例
cluster.name: elastic-prod-cluster
node.name: node-master-01
node.master: true
node.data: true
path.data: /var/lib/elasticsearch/data
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["10.0.0.1:9300", "10.0.0.2:9300", "10.0.0.3:9300"]
cluster.initial_master_nodes: ["node-master-01"]
gateway.recover_after_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"
JVM メモリの最適化
jvm.options でヒープサイズを設定します。物理メモリの 50% かつ 32GB 未満(Compressed Oops を有効にするため)に設定するのが一般的です。
-Xms8g
-Xmx8g
セキュリティ認証(X-Pack)の有効化
トランスポート層の暗号化とユーザー認証を有効にします。
1. 証明書の生成
CA 証明書とノード用証明書を作成し、全てのノードの config ディレクトリに配布します。
# CA の作成
./bin/elasticsearch-certutil ca
# 証明書の作成
./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
2. elasticsearch.yml への追記
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
3. パスワードの設定
クラスター起動後、組み込みユーザーのパスワードを対話形式で設定します。
./bin/elasticsearch-setup-passwords interactive
Kibana の連携設定
kibana.yml を編集して Elasticsearch への接続と認証情報を設定します。
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.username: "kibana_system"
# パスワードはキーストアに保存することを推奨
i18n.locale: "ja-JP"
Logstash によるログ収集構成
Logstash で受信したデータを Elasticsearch へ転送するための logstash.conf 設定例です。
input {
tcp {
port => 5044
codec => json_lines
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
user => "elastic"
password => "your_password"
index => "app-logs-%{+YYYY.MM.dd}"
ssl => true
cacert => "/etc/logstash/config/certs/ca.crt"
}
}
Spring Boot (Logback) との統合
Java アプリケーションから Logstash へログを直接送信するための設定です。
<!-- pom.xml 依存関係 -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.0</version>
</dependency>
<!-- logback-spring.xml 設定 -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:5044</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
トラブルシューティングのポイント
- ファイル記述子不足:
/etc/security/limits.confでnofileを 65536 以上に設定。 - 仮想メモリ制限:
sysctl -w vm.max_map_count=262144を実行して設定値を永続化。 - UUID ミスマッチ: クラスターの再構築時、ノードの
dataディレクトリをクリアしてから再起動。