I. 概要
- ELKとは3つのオープンソースソフトウェアの略称で、それぞれオープンソースソフトウェアであるElasticsearch、Logstash、Kibanaを意味します。公式からも推奨されている軽量なログ収集・処理ツール(エージェント)であるFileBeatが追加されました。FileBeatはリソースの消費が少なく、各サーバー上のログを収集してLogstashに転送するのに適しています。
- 一般的なフローチャートは次のとおりです。
①Elasticsearchストレージ
- Elasticsearch は、データの収集、分析、保存の 3 つの機能を提供するオープンソースの分散検索エンジンです。その機能は、分散型、ゼロ構成、自動検出、自動インデックス断片化、インデックス コピー メカニズム、Restful スタイル インターフェイス、複数のデータ ソース、自動検索読み込みなどです。
②Filebeatログデータ収集
- filebeat は Beats のメンバーです。Beats は軽量のログ コレクターです。実際、Beats ファミリには 6 つのメンバーがあります。初期の ELK アーキテクチャでは、Logstash はログの収集と解析に使用されていましたが、Logstash はメモリ、CPU、およびメモリなどのリソースを消費します。比較的高いです。Logstash と比較すると、Beats が占有するシステム CPU とメモリはほとんど無視できます。
- Filebeat は、ログ データの転送と一元化のための軽量配信ツールで、指定されたログ ファイルまたは場所を監視し、ログ イベントを収集します。
- Beats には現在、次の 6 つのツールが含まれています。
-
- Packetbeat: ネットワーク データ (ネットワーク トラフィック データを収集)。
-
- Metricbeat: メトリクス (システム、プロセス、ファイル システム レベルで CPU やメモリの使用量などのデータを収集します)。
-
- Filebeat: ログ ファイル (ファイル データを収集)。
-
- Winlogbeat: Windows イベント ログ (Windows イベント ログ データを収集します)。
-
- Auditbeat: 監査データ (監査ログを収集)。
-
- ハートビート: 実行時監視 (システムの実行中にデータを収集します)。
- 作業の流れは以下の通りです。
- 長所: Filebeat は依存関係のない単なるバイナリです。必要なリソースはほとんどありません。
- 短所: Filebeat の適用範囲は非常に限られているため、シナリオによっては問題が発生しますが、バージョン 5.x ではフィルター機能も備えています。
③カフカ
- Kafka はピークをカットでき、ELK は redis をメッセージ キューとして使用できますが、redis はメッセージ キューとして強みがなく、redis クラスターはプロフェッショナルなメッセージ パブリッシング システム kafka ほど優れていません。
④ Logstashフィルタリング
- Logstash は主にログの収集、分析、フィルタリングを行うためのツールであり、多数のデータ取得方法をサポートしています。一般的な動作モードは c/s アーキテクチャで、クライアントはログを収集する必要があるホストにインストールされ、サーバーは各ノードで受信したログをフィルタリングして変更し、elasticsearch に送信する役割を果たします。
- アドバンテージ:
-
- スケーラビリティ、Beats は Logstash ノードのセット全体で負荷分散される必要があります。高可用性のためには少なくとも 2 つの Logstash ノードが推奨されます。Logstash ポイントごとに Beats 入力を 1 つだけデプロイするのが一般的ですが、各 Logstash ノードでも問題ありません。複数の Beats 入力をデプロイします。異なるデータソースに対して個別のエンドポイントを公開します。
-
- 復元力: Logstash の永続キューはノード障害に対する保護を提供します。Logstash のディスクレベルの復元力のためには、ディスクの冗長性を確保することが重要です。オンプレミス展開の場合は RAID を構成することをお勧めします。また、クラウドまたはコンテナ化された環境で実行する場合は、データ SLA を反映するレプリケーション ポリシーを持つ永続ディスクを使用することをお勧めします。
-
- フィルター可能: イベント フィールドに対して定期的な変換を実行します。イベント内のフィールドは名前変更、削除、置換、および変更できます。
- 欠点: Logstash は大量のリソースを消費し、多くの CPU とメモリを占有します。さらに、メッセージ キュー キャッシュがないため、データ損失のリスクがあります。
⑤ Kibana 展示
- Kibana はオープン ソースの無料ツールでもあり、重要なデータ ログの要約、分析、検索に役立つ Logstash および ElasticSearch 用のログ分析に適した Web インターフェイスを提供します。
- filebeat と logstash の関係: logstash は jvm によって実行され、多くのリソースを消費するため、作者は後に golang で機能は少ないがリソース消費が少ない軽量の logstash フォワーダーを作成しました。ただし、著者は 1 人であり、http://elastic.co に参加した後、es 社自体が別のオープンソース プロジェクト packetbeat を買収し、このプロジェクトは golang を使用することに専念しているため、チーム全体が存在するため、es 社は簡単に言うとlogstash - フォワーダーの開発も同じ golang チームにマージされているため、新しいプロジェクトは filebeat と呼ばれます。
2、helm3 で ELK をインストールする
- 全体的なフローチャートは次のとおりです。
①準備条件
- Helm リポジトリを追加します。
$ helm repo add elastic https://helm.elastic.co
②helm3のインストールelasticsearch
- カスタム値: 主にストレージ クラスの永続性とリソース制限を設定します。コンピューター リソースが制限されている場合は、リソースを減らすことができます。
# 集群名称
clusterName: "elasticsearch"
# ElasticSearch 6.8+ 默认安装了 x-pack 插件,部分功能免费,这里选禁用
esConfig:
elasticsearch.yml: |
network.host: 0.0.0.0
cluster.name: "elasticsearch"
xpack.security.enabled: false
resources:
requests:
memory: 1Gi
volumeClaimTemplate:
storageClassName: "bigdata-nfs-storage"
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 3Gi
service:
type: NodePort
port: 9000
nodePort: 31311
- Kibana セキュリティ プロンプトを無効にします (Elasticsearch の組み込みセキュリティ機能は有効になっていません) xpack.security.enabled: false。
- Elasitcsearch のインストールを開始します。
$ helm install es elastic/elasticsearch -f my-values.yaml --namespace bigdata
W1207 23:10:57.980283 21465 warnings.go:70] policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
W1207 23:10:58.015416 21465 warnings.go:70] policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
NAME: es
LAST DEPLOYED: Tue Dec 7 23:10:57 2021
NAMESPACE: bigdata
STATUS: deployed
REVISION: 1
NOTES:
1. Watch all cluster members come up.
$ kubectl get pods --namespace=bigdata -l app=elasticsearch-master -w2. Test cluster health using Helm test.
$ helm --namespace=bigdata test es
- 確認するには、すべてのポッドが正常であるために正常に実行されている必要があります。イメージのダウンロードは少し遅いため、確認する前にしばらく待つ必要があります。
$ kubectl get pod -n bigdata -l app=elasticsearch-master
$ kubectl get pvc -n bigdata
$ watch kubectl get pod -n bigdata -l app=elasticsearch-master
- 確認:
$ helm --namespace=bigdata test es
$ kubectl get pod,svc -n bigdata -l app=elasticsearch-master -o wide
$ curl 192.168.0.113:31311/_cat/health
$ curl 192.168.0.113:31311/_cat/nodes
- 掃除:
$ helm uninstall es -n bigdata
$ kubectl delete pvc elasticsearch-master-elasticsearch-master-0 -n bigdata
$ kubectl delete pvc elasticsearch-master-elasticsearch-master-1 -n bigdata
$ kubectl delete pvc elasticsearch-master-elasticsearch-master-2 -n bigdata
③helm3 Kibanaをインストールする
- カスタム値:
$ cat <<EOF> my-values.yaml
#此处修改了kibana的配置文件,默认位置/usr/share/kibana/kibana.yaml
kibanaConfig:
kibana.yml: |
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: [ "elasticsearch-master-headless.bigdata.svc.cluster.local:9200" ]
resources:
requests:
cpu: "1000m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "1Gi"
service:
#type: ClusterIP
type: NodePort
loadBalancerIP: ""
port: 5601
nodePort: "30026"
EOF
- Kibana のインストールを開始します。
$ helm install kibana elastic/kibana -f my-values.yaml --namespace bigdata
- 確認:
$ kubectl get pod,svc -n bigdata -l app=kibana
- ブラウザアクセス: http://192.168.0.113:30026/
- 掃除:
$ helm uninstall kibana -n bigdata
④helm3 Filebeatをインストールする
- Filebeat はデフォルトでホスト上の Docker のログ パスを収集します: /var/lib/docker/containers。Docker のインストール パスが変更された場合はどのように収集しますか? 非常に簡単で、チャート内の DaemonSet ファイルの hostPath パラメータを変更します。
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers #改为docker安装路径
- もちろん、変更する値をカスタマイズすることもできますので、ここでは値をカスタマイズして収集ログのパスを変更することをお勧めします。
- カスタム値: デフォルトでは、データは ES に保存され、変更されたデータは Kafka に保存されます。
$ cat <<EOF> my-values.yaml
daemonset:
filebeatConfig:
filebeat.yml: |
filebeat.inputs:
- type: container
paths:
- /var/log/containers/*.log
output.elasticsearch:
enabled: false
host: '${
NODE_NAME}'
hosts: '${
ELASTICSEARCH_HOSTS:elasticsearch-master:9200}'
output.kafka:
enabled: true
hosts: ["kafka-headless.bigdata.svc.cluster.local:9092"]
topic: test
EOF
- Filefeat のインストールを開始します。
$ helm install filebeat elastic/filebeat -f my-values.yaml --namespace bigdata
$ kubectl get pods --namespace=bigdata -l app=filebeat-filebeat -w
- 確認:
# 先登录kafka客户端
$ kubectl exec --tty -i kafka-client --namespace bigdata -- bash
# 再消费数据
$ kafka-console-consumer.sh --bootstrap-server kafka.bigdata.svc.cluster.local:9092 --topic test
- データが消費できることがわかり、データが kafka に保存されていることを示します。Kafka データ バックログを確認します。
$ kubectl exec --tty -i kafka-client --namespace bigdata -- bash
$ kafka-consumer-groups.sh --bootstrap-server kafka-0.kafka-headless.bigdata.svc.cluster.local:9092 --describe --group mygroup
- 大量のデータがバックログ状態にあることがわかります。
- 次のステップは、logstash をデプロイして Kafka データを使用し、最終的に ES に保存することです。
- 掃除:
$ helm uninstall filebeat -n bigdata
⑤ Helm3 に Logstash をインストールする
- カスタム値 (ES と kafka のアドレスを独自の環境に置き換えます):
$ cat <<EOF> my-values.yaml
logstashConfig:
logstash.yml: |
xpack.monitoring.enabled: false
logstashPipeline:
logstash.yml: |
input {
kafka {
bootstrap_servers => "kafka-headless.bigdata.svc.cluster.local:9092"
topics => ["test"]
group_id => "mygroup"
#如果使用元数据就不能使用下面的byte字节序列化,否则会报错
#key_deserializer_class => "org.apache.kafka.common.serialization.ByteArrayDeserializer"
#value_deserializer_class => "org.apache.kafka.common.serialization.ByteArrayDeserializer"
consumer_threads => 1
#默认为false,只有为true的时候才会获取到元数据
decorate_events => true
auto_offset_reset => "earliest"
}
}
filter {
mutate {
#从kafka的key中获取数据并按照逗号切割
split => ["[@metadata][kafka][key]", ","]
add_field => {
#将切割后的第一位数据放入自定义的“index”字段中
"index" => "%{[@metadata][kafka][key][0]}"
}
}
}
output {
elasticsearch {
pool_max => 1000
pool_max_per_route => 200
hosts => ["elasticsearch-master-headless.bigdata.svc.cluster.local:9200"]
index => "test-%{+YYYY.MM.dd}"
}
}
# 资源限制
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "1Gi"
volumeClaimTemplate:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 3Gi
EOF
- 出力プラグイン 出力プラグイン、イベントを特定のターゲットに送信します。
stdout {
codec => rubydebug } // 开启 debug 模式,可在控制台输出
- stdout : 標準出力、イベントを画面に出力します。
output{
stdout{
codec => "rubydebug"
}
}
- ファイル: イベントをファイルに書き込みます:
output{
file {
path => "/data/logstash/%{host}/{application}
codec => line { format => "%{
message}"} }
}
}
- kafka: イベントを kafka に送信します:
output{
kafka{
bootstrap_servers => "localhost:9092"
topic_id => "test_topic" #必需的设置。生成消息的主题
}
}
- elasticseach: ログを es に保存します:
output{
elasticsearch {
#user => elastic
#password => changeme
hosts => "localhost:9200"
index => "nginx-access-log-%{+YYYY.MM.dd}"
}
}
- Logstash のインストールを開始します。
$ helm install logstash elastic/logstash -f my-values.yaml --namespace bigdata
$ kubectl get pods --namespace=bigdata -l app=logstash-logstash
- 確認:
-
- kibana にログインして、インデックスが作成されたかどうかを確認します。
-
- ログを表示する:
$ kubectl logs -f logstash-logstash-0 -n bigdata >logs
$ tail -100 logs
-
- Kafka の消費を表示します。
$ kubectl exec --tty -i kafka-client --namespace bigdata -- bash
$ kafka-consumer-groups.sh --bootstrap-server kafka-0.kafka-headless.bigdata.svc.cluster.local:9092 --describe --group mygroup
- kibana を介してインデックス データを表示する (Kibana バージョン: 7.15.0) インデックス作成モード:
- 上記で作成したインデックス モードを使用してデータをクエリ (Discover) します。
- 掃除:
$ helm uninstall logstash -n bigdata
3. ELK 関連のバックアップ コンポーネントとバックアップ方法
- Elasticsearch は 2 つの方法でバックアップします。
-
- データをテキスト ファイルにエクスポートします。たとえば、Elasticsearch に保存されているデータを、elasticdump や esm などのツールを使用してファイルにエクスポートします。これは、データ量が少ないシナリオに適しています。
-
- elasticsearch データ ディレクトリ内のファイルをバックアップしてスナップショットを取得し、Elasticsearch のスナップショット インターフェイスによって実装された関数を使用して、大量のデータを含むシナリオに適用します。
① Elasticsearchスナップショットスナップショットバックアップ
- スナップショット スナップショット バックアップの長所と短所:
-
- 利点: スナップショットを介してスナップショットを取得し、スナップショット バックアップ戦略を定義します。これにより、スナップショットの自動ストレージが実現され、独自の異なるバックアップに合わせてさまざまな戦略を定義できます。
-
- 短所: 復元には十分な柔軟性がなく、バックアップ用のスナップショットの取得は高速ですが、仮想マシンのスナップショットと同様に、復元時に自由に復元する方法がありません。
- バックアップ ディレクトリを構成します。
-
- elasticsearch.yml の構成ファイルで、次のように path.repo をバックアップ パスとして使用できることを指定します。
path.repo: ["/mount/backups", "/mount/longterm_backups"]
-
- 構成後、次のようにスナップショット API を使用してリポジトリを作成でき、my_backup という名前のリポジトリを作成します。
PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/mount/backups/my_backup"
}
}
- API インターフェースを通じてバックアップを開始します。
-
- repostiroy を使用すると、データの現在の状態を記録するバックアップ (スナップショットとも呼ばれます) を作成できます。次のように、snapshot_1 という名前のスナップショットを作成します。
PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true
-
- wait_for_completion が true の場合、API はバックアップの実行後に結果を返します。それ以外の場合は、デフォルトで非同期に実行されます。ここでは、効果をすぐに確認するために、このパラメータが設定されています。このパラメータを設定する必要はありません。オンラインで実行し、バックグラウンドで非同期にして実行します。
- 増分バックアップ: 実行が完了すると、/mount/backups/my_backup のボリュームが大きくなっていることがわかります。これは、新しいデータのバックアップが入ったことを意味します。注意すべき点は、同じバックアップに複数のスナップショットが作成される場合です。リポジトリでは、elasticsearch はバックアップ対象のデータ セグメント ファイルが変更されているかどうかを確認し、変更がない場合は処理されません。変更されていない場合は、変更されたセグメント ファイルのみがバックアップされ、実際には増分バックアップが実現されます。
PUT /_snapshot/my_backup/snapshot_2?wait_for_completion=true
- データ回復: 回復機能は、次の API を呼び出すことで迅速に実現できます。
POST /_snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true
{
"indices": "index_1",
"rename_replacement": "restored_index_1"
}
② elasticdump バックアップ移行 ES データ
- インデックス データはファイル (バックアップ) としてエクスポートされます。
# 导出索引Mapping数据
$ elasticdump \
--input=http://es实例IP:9200/index_name/index_type \
--output=/data/my_index_mapping.json \ # 存放目录
--type=mapping
# 导出索引数据
$ elasticdump \
--input=http://es实例IP:9200/index_name/index_type \
--output=/data/my_index.json \
--type=data
- インデックス データ ファイルがインデックスにインポートされます (復元)。
# Mapping 数据导入至索引
$ elasticdump \
--output=http://es实例IP:9200/index_name \
--input=/home/indexdata/roll_vote_mapping.json \ # 导入数据目录
--type=mapping
# ES文档数据导入至索引
$ elasticdump \
--output=http:///es实例IP:9200/index_name \
--input=/home/indexdata/roll_vote.json \
--type=data
- バックアップ データは別の es クラスターに直接インポートできます。
$ elasticdump --input=http://127.0.0.1:9200/test_event --output=http://127.0.0.2:9200/test_event --type=data
- type は ES データのエクスポートおよびインポートのタイプであり、Elasticdump ツールは次のデータ タイプをサポートします。
タイプタイプ | 説明する |
マッピング | ESのインデックスマッピング構造データ |
データ | ESデータ |
設定 | ES インデックス ライブラリのデフォルト設定 |
アナライザ | ES トークナイザー |
レンプレート | ESテンプレート構造データ |
エイリアス | ES のインデックス エイリアス |
③esmのバックアップとesmデータの移行
- データのバックアップ:
$ esm -s http://10.33.8.103:9201 -x "petition_data" -b 5 --count=5000 --sliced_scroll_size=10 --refresh -o=./es_backup.bin
- -w はスレッド数を示します。 -b はバルク リクエストのデータ サイズを示します。単位は MB、デフォルトは 5M です。 -c データをインポートおよび復元するためのスクロール リクエストの数です。
$ esm -d http://172.16.20.20:9201 -y "petition_data6" -c 5000 -b 5 --refresh -i=./dump.bin