1、集群外物理主机安装fluentd后运行报错:“The client noticed that the server is not a supported distribution of Elasticsearch.”

2022-01-12 14:24:21 +0800 [error]: #0 unexpected error error_class=Elasticsearch::UnsupportedProductError error="The client noticed that the server is not a supported distribution of Elasticsearch."
2022-01-12 14:24:21 +0800 [error]: #0 C:/opt/td-agent/lib/ruby/gems/2.7.0/gems/elasticsearch-7.15.0/lib/elasticsearch.rb:85:in `verify_with_version_or_header'

原因:​https://segmentfault.com/a/1190000040973437​​​​

​https://www.theregister.com/2021/08/09/elasticsearch_python_client_change/​​​​

​https://www.oschina.net/news/154014/aws-fork-clients-of-elasticsearch​


ruby -v

fluent-gem --version

fluentd --version

fluent-plugin-elasticsearch

K8S(fluentd-es-ds)-ok

2.7.1p83

3.1.2

1.11.4

4.2.2

物理主机CentOS8.5(td-agent 4.3.0)-nok



?

?

物理主机CentOS8.5(td-agent 4.0.0)-ok

?

3.1.6

1.14.3

5.1.4

川大主机RHEL6.5(td-agent-3.8.0-0)-ok

2.4.10p364

2.6.14.4

1.11.1

4.0.9

目前Elasticsearch库已经更新到7.15.1,7.15.1版本的库无法链接到ES服务器端,需要安装低于7.14.0版本得Elasticsearch库才可以。

*:td-agent的v3.0.1版本以后自带包含out_elasticsearch插件:​https://www.cnblogs.com/sanduzxcvbnm/p/13932087.html​​​

解决:td-agent-4.3.0-1.el7.x86_64.rpm版本高,使用低版本td-agent-4.0.0-1.el7.x86_64.rpm   OK!

​https://td-agent-package-browser.herokuapp.com/4/redhat/7/x86_64​​​​

另:RHEL6.5安装td-agent-3.8.0-0.el6.x86_64.rpm版本 OK.

*文件描述符0 ,表示标准输入(stdin);1 表示标准输出(stdout);2 表示标准错误(stderr)

# nohup /opt/td-agent/embedded/bin/fluentd -c /etc/td-agent/td-agent.conf >/dev/null 2>&1 &
>/dev/null 2>&1的作用就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重用了标准输出的描述符,所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。

2、k8s中elasticsearch版本7.10.2

http://192.168.31.10:33151/
{
"name" : "elasticsearch-logging-0",
"cluster_name" : "kubernetes-logging",
"cluster_uuid" : "2KlZT9s3QLWnO2FOBV1Z8g",
"version" : {
"number" : "7.10.2",
"build_flavor" : "oss",
"build_type" : "docker",
"build_hash" : "747e1cc71def077253878a59143c1f785afa92b9",
"build_date" : "2021-01-13T00:42:12.435326Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

3、三个必须的元数据元素:_id是一个字符串,文档唯一标识,当它和 _index 以及 _type 组合就可以唯一确定 Elasticsearch 中的一个文档。 当你创建一个新的文档,要么提供自己的 _id ,要么让 Elasticsearch 帮你生成(自动生成的 ID 是 URL-safe、 基于 Base64 编码且长度为20个字符的 GUID 字符串。 这些 GUID 字符串由可修改的 FlakeID 模式生成,这种模式允许多个节点并行生成唯一 ID ,且互相之间的冲突概率几乎为零)。

在 Elasticsearch 中文档是 不可改变 的,不能修改它们(不能被修改,只能被替换)。删除文档不会立即将文档从磁盘中删除,只是将文档标记为已删除状态。随着你不断的索引更多的数据,Elasticsearch 将会在后台清理标记为已删除的文档。

 Elasticsearch 真正强大之处在于可以从无规律的数据中找出有意义的信息。Elasticsearch 不只会_存储(stores)_ 文档,为了能被搜索到也会为文档添加_索引(indexes)_ ,这也是为什么我们使用结构化的 JSON 文档,而不是无结构的二进制数据。

4、自 Elasticsearch 变更开源协议以来,AWS 和 Elastic 这两家公司就开始逐渐“脱钩”。AWS 先是创建了一个自称真正开源的 Elasticsearch 分支,并获得了不少厂商的支持。现在,Elastic 修改 Elasticsearch 的客户端,以阻止连接到 AWS 的 OpenSearch。双方彼此都不想产生任何关联。——Elastic 开发者上个月向 elasticsearch-py 提交了一个 PR(已被合并),旨在修改 Elasticsearch Python 客户端连接到 Elasticsearch 的验证逻辑。根据 PR 的描述,修改后的客户端将无法连接到由 AWS 维护的 Elasticsearch 分支 OpenSearch,以及一些版本较低的 Elasticsearch 开源发行版,或是托管到 AWS Elasticsearch Service 的 Elasticsearch。AWS 表示,开发者只需对其应用程序的代码进行细小的改动,即可像以前一样正常连接到 Elasticsearch 以及相关的衍生版本。它还建议开发者不要将任何由 Elastic 维护的客户端升级到最新版本,因为这可能会导致应用程序中断。

5、人们通常将 Elastic Stack 称为 ELK Stack,目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据, “ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。Elastic Stack 是 ELK Stack 的更新换代产品,向 ELK Stack 中加入了一系列轻量型的单一功能数据采集器,并把它们叫做 Beats

Elasticsearch-head 是 Web 前端,用于浏览和与 Elasticsearch 集群进行交互,elasticsearch-head插件管理elasticsearch:​https://my.oschina.net/u/3291782/blog/4526729​​​​

作为Chrome插件进行安装:​​​https://www.cnblogs.com/sanduzxcvbnm/p/14948942.html​​​​

6、目的是使将数据写入Elasticsearch索引与Logstash所称的索引兼容。通过这样做,可以利用kibana。将logstash_format选项设置为true,将忽略index_name设置。默认索引名前缀为logstash-

The index name will be #{logstash_prefix}-#{formatted_date}

logstash_format true # defaults to false
logstash_prefix mylogs # defaults to "logstash"
logstash_prefix_separator _ # defaults to "-"
logstash_dateformat %Y.%m. # defaults to "%Y.%m.%d"

​type_name​ parameter will be used fixed ​_doc​ value for Elasticsearch 7.type_name parameter will make no effect for Elasticsearch 8.

<match my.logs>
@type elasticsearch
host localhost
port 9200
index_name fluentd
type_name fluentd
</match>

Buffer options:Fluentd有一个非常易于配置的缓冲系统。可以存储在内存中,也可以存储在磁盘上,其中包含想要知道的更多参数。

buffer_type memory
flush_interval 60s
retry_limit 17
retry_wait 1.0
num_threads 1

7、文档(Document):即搜索引擎中的文档概念,也是ES中一个可以被检索的基本单位,相当于数据库中的row,一条记录。record body is wrapped by 'doc'

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

由于有几个原因,由于elaticsearch推出了弃用映射类型的新闻,因此他们强制v6用户每个索引只使用1种映射类型,即你可以拥有索引中的任何一个​user​​tweet​内部​twitter​,但不能同时使用两者.他们进一步建议保持一致,并将其_doc用作映射类型的名称.但这实际上可以是任何字符串 - 狗,猫等.它只是建议是​_doc​因为在v7中映射类型字段完全消失.因此,如果elasticsearch中的每个索引只有1种映射类型,那么迁移到v7会更容易,因为您只需删除映射类型,然后所有文档将直接归入索引.

8、The stable Fluentd distribution package maintained by Treasure Data, Inc. provides the stable distribution of Fluentd, called td-agent

# td-agent 4
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent4.sh | sh
td-agent.service - td-agent: Fluentd based data collector for Treasure Data

9、解析多行日志,参照示例“Java Stacktrace Log”,format_firstline指定多行起始行的regexp模式。输入插件可以跳过日志,直到格式_firstline匹配为止。默认值为零。(in_tail插件可用于多行,但其他输入插件不可用于多行。

​https://docs.fluentd.org/parser/multiline​

<parse>
@type multiline
format_firstline /\d{4}-\d{1,2}-\d{1,2}/
format1 /^(?<time>\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}) \[(?<thread>.*)\] (?<level>[^\s]+)(?<message>.*)/
</parse>

10、fluentd的过滤器不允许标记重写:​​https://github.com/fluent/fluent-plugin-rewrite-tag-filter​

rewrite_tag_filter:重写Fluentd的标记筛选器。它被设计用来重写标签,比如mod_rewrite。当值与正则表达式匹配/不匹配时,重新发出带有重写标记的记录。还可以使用正则表达式按域、状态代码(例如500错误)、用户代理、请求uri、regex backreference等更改Apache日志中的标记。这是一个输出插件,因为fluentd的过滤器不允许标记重写

# for system installed fluentd
$ gem install fluent-plugin-rewrite-tag-filter

# for td-agent2 (with fluentd v0.12)
$ sudo td-agent-gem install fluent-plugin-rewrite-tag-filter -v 1.6.0

# for td-agent3 (with fluentd v0.14)
$ sudo td-agent-gem install fluent-plugin-rewrite-tag-filter

It is supported these placeholder for new_tag (rewritten tag).(​​https://github.com/fluent/fluent-plugin-rewrite-tag-filter/blob/master/example.conf#​​)

# It will get "rewritten.ExampleMail.app30-124" when hostname is "app30-124.foo.com"
<match apache.access>
@type rewrite_tag_filter
hostname_command hostname -s //根据需要,使用hostname_command选项覆盖hostname命令,hostname-s指使用短主机名。
<rule>
key domain
pattern ^(mail)\.(example)\.com$ //分组捕获 得到$2 $1
tag rewritten.$2$1.${hostname} //占位符的用法
</rule>
</match>
  • ​${tag}​
  • ​__TAG__​
  • ​${tag_parts[n]}​
  • ​__TAG_PARTS[n]__​
  • ​${hostname}​
  • ​__HOSTNAME__​

实践配置:filter中tag配置必须有!否则kibana输出同名的只有一个。

<filter fdp.log>
@type record_transformer
<record>
server "${hostname}"
tag ${tag}
</record>
</filter>
<match fdp.log>
@type rewrite_tag_filter
<rule>
key server
pattern ^.+$
tag ${hostname}.${tag}
</rule>
</match>

11、​jps(Java ​​Virtual​​ Machine Process Status Tool)是java提供的一个显示当前所有java进程pid的命令,适合在linux/unix平台上简单察看当前java进程的一些简单情况。jps 类似很多人都是用过unix系统里的ps命令,它的作用是显示当前系统的java进程情况及进程id。可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例)并可通过opt来查看这些进程的详细启动参数。

$> jps -l
28729 sun.tools.jps.Jps
23789 com.asiainfo.aimc.bossbi.BossMain

12、登录kibana——>​http://ip:port/kibana​;fdp-2出现报错:​​https://blog.csdn.net/jj_tyro/article/details/79607502​

<Fluent::Plugin::Buffer::BufferOverflowError: buffer space has too many data>

EFK(elasticsearch + fluentd + kibana)日志系统-续_python

拷贝k8s集群fluentd-es-configmap.yaml中配置output.conf到fdp-2的td-agent.conf配置测试OK.(Output插件是以Chunk为单位向输出端发送数据包,Chunk的大小由参数​chunk_limit_size​设置)​​https://blog.csdn.net/JacksonKing/article/details/117559986?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-4.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-4.pc_relevant_default&utm_relevant_index=9​

<buffer>
@type file
path /var/log/fluentd-buffers/kubernetes.system.buffer
flush_mode interval
retry_type exponential_backoff
flush_thread_count 2
flush_interval 5s
retry_forever
retry_max_interval 30
chunk_limit_size 2M
total_limit_size 500M
overflow_action block
</buffer>