# ELK+Filebeat+Kafka+ZooKeeper构建大数据日志分析平台案例

1 日志分析平台架构图



![img](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210120055447.png)

|       ip       |                 中间件                  |
| :------------: | :-------------------------------------: |
| 192.168.110.60 |       nginx服务器，mysql,filebeat       |
| 192.168.110.61 |             kafka,zookrrper             |
| 192.168.110.62 |             kafka,zookeeper             |
| 192.168.110.63 |             kafka,zookeeper             |
| 192.168.110.64 |             logstash,kibana             |
| 192.168.110.65 | elasticsearch,elasticsearch-head-master |
| 192.168.110.66 |              elasticsearch              |
| 192.168.110.67 |              elasticsearch              |

|          中间件           |             作用              |
| :-----------------------: | :---------------------------: |
|         filebeat          |           收集数据            |
|           kafka           |    暂存数据，防止数据过大     |
|         zookeeper         |          分布式管理           |
|       elasticsearch       |    分布式的搜索与分析引擎     |
| elasticsearch-head-master |        数据可视化插件         |
|         logstash          |        对数据进行处理         |
|          kibana           | 可视化展示elasticsearch的数据 |

版本为最新稳定版：8.7.1（8.7）

## es集群部署

|       IP       |                 中间件                  |
| :------------: | :-------------------------------------: |
| 192.168.110.66 |              elasticsearch              |
| 192.168.110.67 |              elasticsearch              |
| 192.168.110.65 | elasticsearch,elasticsearch-head-master |

### 官网下载安装包

```
tar -zxvf elasticsearch-8.7.1-linux-x86_64.tar.gz
```

### 修改与分发hosts文件

```
vim /etc/hosts
# 添加以下内容
192.168.110.65  es-1
192.168.110.66  es-2
192.168.110.67  es-3

# 分发
scp /etc/hosts 192.168.110.66:/etc/hosts
scp /etc/hosts 192.168.110.67:/etc/hosts
```

### 通过脚本安装java环境17版本

```
略
```

### yum安装elasticsearch

```
cd /opt/ && wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.7.1-x86_64.rpm

yum -y install elasticsearch-8.7.1-x86_64.rpm
```

#### 创建es的data目录和log目录

```
mkdir -p /opt/elasticsearch/data /opt/elasticsearch/log
```

#### 修改权限

```
chown -R elasticsearch:elasticsearch /opt/elasticsearch

```

#### 修改配置文件

```
以es2为例：
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak

vim /etc/elasticsearch/elasticsearch.yml
cluster.name: es-node
node.name: es-2
node.roles: [master,data]
path.data: /opt/data
path.logs: /opt/logs
bootstrap.memory_lock: false
network.host: 192.168.110.66
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
discovery.seed_hosts: ["es-1", "es-2", "es-3"]
cluster.initial_master_nodes: ["es-1", "es-2", "es-3"]
xpack.security.enabled: false
action.destructive_requires_name: false

# 此两项为添加项，主要为安装elasticsearch-head插件添加支持
http.cors.enabled: true
http.cors.allow-origin: "*"

# 分发
[root@elk1 ~]# scp /etc/elasticsearch/elasticsearch.yml 192.168.110.66:/etc/elasticsearch/elasticsearch.yml
[root@elk1 ~]# scp /etc/elasticsearch/elasticsearch.yml 192.168.110.67:/etc/elasticsearch/elasticsearch.yml

# 在elk2、elk3修改成对应的主机名和IP地址
```

#### jvm内存调优                

 es吃资源严重，可以根据服务器情况合理调配

原则为：调整为物理内存的一半

```
/etc/elasticsearch/jvm.options
改：-Xms4G
   -Xmx4G

为：-Xms512M
   -Xmx512M
```

#### 修改启动超时间

由于启动花费时间长，默认超时时间为75s,，会导致启动失败

```
vim /usr/lib/systemd/system/elasticsearch.service
改：TimeoutStartSec=75
为：TimeoutStartSec=900
```

#### 启动与开机自启

```
systemctl start elasticsearch 
systemctl enable elasticsearch

# 首次启动会很慢
# 成功浏览器打开ip:9200，如下图
```

![image-20230526165034625](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/image-20230526165034625.png)

#### 检查端口

```
# 9200的端口
[root@es-2 opt]# netstat -lntp | grep 92
tcp6       0      0 192.168.110.66:9300     :::*                    LISTEN      1912/java           
tcp6       0      0 192.168.110.66:9200     :::*                    LISTEN      1912/java 
```

#### 出现es报错，无法锁住内存（如果出现此错误）

```
# 在启动脚本里增加
vim /usr/lib/systemd/system/elasticsearch.service
[Service]
LimitMEMLOCK=infinity

# 重启服务
systemctl daemon-reload
systemctl start elasticsearch
```

### 安装node.js

Node.js 不是一门新的编程语言，也不是一个 JavaScript 框架，它是一套 JavaScript 运行环境，用来支持 JavaScript 代码的执行。

Node.js 官网中文版：https://nodejs.org/zh-cn/

#### 1.安装

下载nodejs工具包，上传node.js的包到elk的/opt目录下，版本为10.12版本

```
cd /opt && wget https://nodejs.org/dist/v16.17.1/node-v18.16.0-linux-x64.tar.xz
tar xvf node-v18.16.0-linux-x64.tar.xz
```

#### 2.添加环境变量

```
mv node-v18.16.0-linux-x64 /usr/local/node

vim /etc/profile
#set for nodejs
export NODE_HOME=/usr/local/node/
export PATH=$NODE_HOME/bin:$PATH

source !$

# 验证
[root@es-1 elasticsearch-head-5.0.0]# node -v
v16.17.1                           #出现此结果，刚已正常运行
```

## 安装elasticsearch-head-master

百度寻找下载elasticsearch-head-5.0.0.zip 

#### 1.安装

上传elasticsearch-head-master的包到elk1的/opt目录下

```
[root@elk1 opt]# yum -y install unzip

[root@elk1 opt]# unzip elasticsearch-head-5.0.0.zip 
```

#### 2.进入head目录进行安装

```shell
[root@elk1 opt]# cd elasticsearch-head-master

# 进行npm安装，因为用npm安装依赖包都是用国外的源，速度太慢，所以使用淘宝的镜像
# 方法一：
[root@elk1 elasticsearch-head-master]# npm config set registry https://registry.npm.taobao.org --global 

或者

[root@elk1 elasticsearch-head-master]# npm config set registry https://registry.npm.taobao.org

# 10版本会出现缺包，忽略那个包，使用骚操作，第一次更换为淘宝源后进行install使用Ctrl+c终止然后再执行一次install，一般就会忽略那个包，不报错

[root@elk1 elasticsearch-head-master]# npm install			#安装
[root@elk1 elasticsearch-head-master]# npm run start 		#启动
或
[root@elk1 elasticsearch-head-master]# npm run start >> /dev/null &

注：可能会出现卡住现象，推荐使用方法二

# 方法二:
# 使用cnpm命令并使用淘宝源
[root@elk1 elasticsearch-head-master]# npm install -g cnpm --registry=https://registry.npm.taobao.org
[root@elk1 elasticsearch-head-master]# cnpm install     #cnmp为使用国内源的node.js命令，c代表chinese
出现如下标记证明已安装好依赖包
✔ All packages installed

[root@elk1 elasticsearch-head-master]# cnpm run start  #前台运行，一退出就失效
或
[root@elk1 elasticsearch-head-master]# cnpm run start >> /dev/null &	#elasticsearch-head-masterr后台运行

#cnpm install 过程中可能出错，如下
killed: false,
  code: 2,
  signal: null,
  cmd:
   'tar jxf /tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2' } Error: Command failed: tar jxf /tmp/phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar (child): bzip2：无法 exec: 没有那个文件或目录
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

原因：缺少bzip2压缩工具包
yum install -y bzip2
```

![image-20221008203950127](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210111648037.png)

```
报错上面解决方法
npm install phantomjs-prebuilt@2.1.16 --ignore-scripts
```

![image-20221008204036767](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210111648954.png)

```
报错问题
npm install grunt-contrib-clean grunt-contrib-concat grunt-contrib-watch grunt-contrib-connect grunt-contrib-copy grunt-contrib-jasmine
```

#### 添加到开机自启

```
[root@elk1 elasticsearch-head-master]# vim /etc/rc.d/rc.local
[root@elk1 elasticsearch-head-master]# cnpm run start >>/dev/null &
[root@elk1 elasticsearch-head-master]# chmod +x /etc/rc.d/rc.local
```

#### 浏览器验证

浏览器输入http://ip:9100/

![image-20230526165924688](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/image-20230526165924688.png)

集群健康值介绍：

黄色：代表没有主分片数据丢失。

红色：代表有数据丢失

绿色：代表正常

五角星代表是主节点，圆代表是从节点，索引详细信息可点击某个索引，查看该索引的所有信息，包括mappings、setting等等

提示：es支持一个类似于快照的功能，方便我们用于数据备份，如上图的新建索引的副本数

Head插件小缺点：当我们索引特别多的时候，打开head至少需要五分钟。因为它要把所有的索引都扫描一遍进行展示，

这时候打开使用的带宽也会特别大（不会出现超时，一直等待就可以）

#### es-head查询

格式为：

http://ip:port/

索引名/索引类型/_search

请求方式为GET

这种方式是查询该索引下的所有数据

![image-20221009110833389](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210091109831.png)

如果要查询更为详细，可以在查询条件后面跟ID，比如

http://ip:port/

索引名/索引类型名/文档id

请求方式仍然是GET请求

![image-20221009111023344](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210091110663.png)



## 安装kibana

|       IP       |     中间件      |
| :------------: | :-------------: |
| 192.168.110.64 | logstash,kibana |

kibana-8.7.1-x86_64.rpm

#### 1.安装

上传kibana-8.7.1-x86_64.rpm到/opt目录（<font color='red'>不需要java环境</font>）

```
cd /opt && wget https://artifacts.elastic.co/downloads/kibana/kibana-8.7.1-x86_64.rpm

yum -y install kibana-8.7.1-x86_64.rpm
```

#### 2.修改配置文件

```
cp /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bak
vim /etc/kibana/kibana.yml

# 修改配置文件如下，开启以下的配置
[root@64-kl opt]# grep -Ev "#|^$"  /etc/kibana/kibana.yml
server.port: 5601
server.host: "192.168.110.64"
server.name: "64-kl"
elasticsearch.hosts: ["http://192.168.110.65:9200"]
logging:
  appenders:
    file:
      type: file
      fileName: /var/log/kibana/kibana.log
      layout:
        type: json
  root:
    appenders:
      - default
      - file
pid.file: /run/kibana/kibana.pid
i18n.locale: "zh-CN"
```

#### 3.启动服务并设置开机启动

```
systemctl  start kibana 
systemctl enable  kibana

[root@64-kl opt]# netstat -auntlp |grep 5601
tcp        0      0 192.168.110.64:5601     0.0.0.0:*               LISTEN      2915/node 
# 查状态是启动的，但是实际未必这么快，要看到端口出来了才行
```

#### 4.浏览器回到head，会发现多了kibana的索引

![image-20230526170327140](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/image-20230526170327140.png)



#### 5.浏览器找开页面

浏览器输入http://ip:5601/，如下图

![image-20230526170401925](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/image-20230526170401925.png)

## 安装LogStash

|       IP       |     中间件      |
| :------------: | :-------------: |
| 192.168.110.64 | logstash,kibana |

工作原理：https://zhuanlan.zhihu.com/p/379656230

注意：你需要采集哪台服务器上的日志就在哪台机子上进行安装（<font color='red'>需要java环境</font> ）

上传logstash-8.7.1-x86_64.rpm包到/opt目录

#### 1.安装

```
[root@elk4 ~]# cd /opt && wget https://artifacts.elastic.co/downloads/logstash/logstash-8.7.1-x86_64.rpm
[root@elk4 opt]# yum -y install logstash-8.7.1-x86_64.rpm
```

#### 2.添加环境变量

```
[root@elk4 opt]# vim /etc/profile
#set for logstash
export PATH=$PATH:$JAVA_HOME/bin:/usr/share/logstash/bin		
#yum安装elk，主程序一般安在/usr/share下面
```

#### 3.jvm内存调优                

 logstash吃资源严重，可以根据服务器情况合理调配

```
/etc/logstash/jvm.options
改：-Xms1G
   -Xmx1G

为：-Xms512M
   -Xmx512M
```



#### 4.创建logstash的data目录

```
mkdir -p /opt/logstash/data
```

#### 5.修改配置文件

```
[root@64-kl ~]# grep -Ev "#|^$"  /etc/logstash/logstash.yml

path.data: /opt/logstash/data
path.logs: /var/log/logstash

```



#### 4.简单验证

```
[root@elk4 opt]# logstash -e 'input { stdin { } }  output { stdout {} }'

## 等待一段时间启动 Logstash，停留在交互位置
## 输入  hello world 回车，观察返回结果
## 成功如下图

# 注:
# -e 执行操作
# input 标准输入，{ stdin } 插件
# output 标准输出， { stdout } 插件
```

![image-20220530165118190](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202205301651268.png)

#### 5.标准输出到elasticsearch中并保存下来

```
[root@elk4 opt]# logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["192.168.110.65:9200"] } stdout { codec => rubydebug }}'

## stdin { } 为空时，需要手动交互输入内容，如果｛｝里有内容，在运行命令时，会自动输入
## 等待进入交互
## 输入hello word

```

![image-20220530165726369](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202205301657458.png)

浏览器输入http://192.168.245.170:9100/，查看索引数据会发现成功写入

![image-20220530170137568](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202205301701636.png)



#### 6.logstash的插件input与file使用（单机输出）

```
# 本地输入输出
[root@elk4 opt]# vim /etc/logstash/conf.d/systemd.conf
# 添加以下内容
input {
   file {
       path => "/var/log/messages"
       type => "system-log"
       start_position => "beginning"
   }
}
output {
     file {
       path => "/tmp/%{type}.%{+yyyy.MM.dd}"
     }
}


注：需要对收集的日志文件有读权限 chmod 644 
              对写入的文件有写权限 chmod 655
              
# 去到es集群的head页面(port:9100)刷新发现并没有出来，原因是没有权限
[root@elk4 conf.d]# vim /var/log/logstash/logstash-plain.log
# 解决方案
[root@elk4 conf.d]# chmod o+r /var/log/messages
```

```
# 语法检查
[root@elk4 opt]# logstash -f /etc/logstash/conf.d/systemd.conf -t   相当于nginx -t

# 当出现两个ok就行，如下图
```

![image-20220530171222113](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202205301712173.png)

```shell
# 启动
# 方法一：		
[root@elk4 opt]# systemctl start logstash   # 虽然可以使用system管理启动（需要添加环境变量），但是会加载/etc/logstash/conf.d/所有配置文件，测试过会出现无法读取配置文件的情况，所以一般采用方法二
注：一定要检测端口是否拉起

# 方法二   #后台启动
[root@elk4 conf.d]# nohup logstash -f /etc/logstash/conf.d/systemd.conf &


# 然后复制会话，一个tail一个输入，如下图

[root@elk4 opt]# tail -f /tmp/system-log.2022.04.07

[root@elk4 opt]# echo "this is test" >> /var/log/messages
```

![image-20220530172025220](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202205301720333.png)



#### 7.logstash导入es

##### 1.修改配置文件

```
[root@64-kl ~]# cat /etc/logstash/conf.d/systemd.conf
input {
   file {
       path => "/var/log/messages"
       type => "system-test"
       start_position => "beginning"
       codec => "json"
   }
}
filter{
     mutate {
          remove_field => ["host","path","message"]
            }
       }
output {
     elasticsearch {
       hosts => ["192.168.110.65:9200","192.168.110.66:9200","192.168.110.67:9200"]
       index => "%{type}-%{+yyyy.MM.dd}"
     }
}

[root@64-kl ~]# cat /etc/logstash/conf.d/nginx.conf 
input {
    beats {
      port => 5044
      type => "test-nginx"
      codec => "json"
    }
}
output {
     elasticsearch {
       hosts => ["192.168.110.65:9200","192.168.110.66:9200","192.168.110.67:9200"]
       index => "%{type}-%{+yyyy.MM.dd}"
     }
}


```

```
旧版本例子
vim /etc/logstash/conf.d/system-log.conf
# 修改如下
input {
   file {
       path => "/var/log/messages"
       type => "system-log"
       start_position => "beginning"
   }
}
output {
     elasticsearch {
       hosts => ["192.168.245.17:9200"]
       index => "%{type}-%{+yyyy.MM.dd}"
     }
}
```

##### 2.检查

```
[root@elk4 conf.d]# logstash -f /etc/logstash/conf.d/system-log.conf -t
```

##### 3.启动

```
# 现在只有一个配置文件，可以system启动
vim /usr/share/logstash/bin/logstash.lib.sh
JAVA_HOME=/usr/java/jdk1.8.0_191		#要对应jdk路径

#生成system启动脚本
/usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd 
systemctl start logstash
systemctl status logstash -l 观察其输出信息

# 扫描端口
netstat -lntp | grep 9600   # 需要等一会，可能查状态是活跃的。但是未必启动这么快
```

##### 4.测试

```
echo "this is test2" >> /var/log/messages

# 再去到es集群的head页面(port:9100)刷新发现出来了，如下图
```

![image-20230526171822058](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/image-20230526171822058.png)

## 安装filebeat

|       ip       |           中间件            |
| :------------: | :-------------------------: |
| 192.168.110.60 | nginx服务器，mysql,filebeat |

注意：你需要采集哪台服务器上的日志就在哪台机子上进行安装（不需要java环境）

#### 1.安装

上传filebeat-7.17.0-x86_64到elk4的/opt目录下，做好主机映射hosts

```
[root@elk4 opt]# cd /opt/  && wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.7.1-x86_64.rpm
[root@elk4 opt]# yum -y install filebeat-8.7.1-x86_64.rpm
```

#### 2.修改配置文件

```
[root@elk4 opt]# cp /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml.bak

# 修改filebeat.yml，修改如下



# 修改filebeat.yml，修改如下
[root@elk4 opt]# grep -Ev "#|^$" /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log   # 可以写多个type，具体看后面采集配置
  enabled: true
  paths:
    - /usr/local/nginx/logs/access.log     # 可以写多个，下一行减号开头和原格式一样就行
  tags: ["nginx"]
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 1   # 切片数量
setup.kibana:
output.elasticsearch:
  hosts: ["192.168.110.65:9200", "192.168.110.66:9200", "192.168.110.67:9200"]
  # 可以多个["IP1","IP2"]，下面还有账号密码，如果有得取消注释写好配置
  indices:
    - index: "nginx-access-web-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx"
  protocol: "http"
processors:
  - add_host_metadata: 
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~


#######grep -Ev "#|^$"  /etc/filebeat/filebeat.yml#####连接整个架构的配置
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/access.log
  tags: ["nginx"]
- type: log
  enabled: true
  paths:
    - /var/log/messages
  tags: ["system"]
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 2
setup.kibana:
setup.ilm.enabled: false
setup.template.name: "nginx2-access"
setup.template.pattern: "nginx2-access-*"
setup.template.enabled: true
setup.template.overwrite: false
output.logstash:
  hosts: ["192.168.110.64:5044"]
  when.contains:
        tags: "nginx"
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

```

#### 启动filebeat

```
# 先停止logstash
[root@elk4 opt]# systemctl stop logstash

# 启动filebeat
[root@elk4 opt]# systemctl start filebeat
[root@elk4 opt]# systemctl status filebeat
# 去到es集群的head页面(port:9100)刷新出来，如下图
```

![image-20221011114627824](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210111146965.png)

### filebeat采集nginx

#### 1.修改配置文件

```
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/access.log
  tags: ["nginx"]
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 1
setup.kibana:
setup.ilm.enabled: false
setup.template.name: "nginx2-access"
setup.template.pattern: "nginx2-access-*"
setup.template.enabled: true
setup.template.overwrite: false
output.elasticsearch:
  hosts: ["192.168.110.65:9200", "192.168.110.66:9200", "192.168.110.67:9200"]
  indices:
    - index: "nginx-access-web-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx"
  protocol: "http"
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
```

#### 2.重启filebeat

```
systemctl restart filebeat

## 到 ES 中观察， 如果长时间没有索引产生， 试着重启filebeat ，或者刷新一下网页， 促使网页日志文件有新的行产生,又或者访问一下nginx，让其产生日志
# 去到es集群的head页面(port:9100)刷新出来，如下图
```

![image-20230526172923232](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/image-20230526172923232.png)



### filebeat采集系统日志（旧版例子）

#### 1.修改配置文件

```shell
# 修改filebeat.yml，修改如下
[root@elk4 opt]# grep -Ev "#|^$" /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/access.log
    - /usr/local/nginx/logs/nginx.log
  tags: ["nginx"]
- type: log
  enabled: true
  paths:
    - /var/log/messages
  tags: ["system"]
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 2
setup.kibana:
setup.ilm.enabled: false
setup.template.name: "nginx2-access"
setup.template.pattern: "nginx2-access-*"
setup.template.enabled: true
setup.template.overwrite: false
output.elasticsearch:
  hosts: ["192.168.110.65:9200", "192.168.110.66:9200", "192.168.110.67:9200"]
  indices:
    - index: "nginx2-access-web-%{+yyyy.MM.dd}"
      when.contains:
        tags: "nginx"
  indices:
    - index: "system-%{+yyyy.MM.dd}"
      when.contains:
        tags: "system"
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
```

#### 2.重启filebeat

```
[root@elk4 opt]# systemctl restart filebeat

# 去到es集群的head页面(port:9100)刷新出来，如下图
```

![image-20221011144008421](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210111440513.png)

### filebeat与logstash连用

#### 1.配置文件先关闭es配置项

![image-20220530020803141](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202205300208210.png)

#### 2.打开logstash配置项

```
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/local/nginx/logs/access.log
  tags: ["nginx"]
- type: log
  enabled: true
  paths:
    - /var/log/messages
  tags: ["system"]
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 2
setup.kibana:
setup.ilm.enabled: false
setup.template.name: "nginx2-access"
setup.template.pattern: "nginx2-access-*"
setup.template.enabled: true
setup.template.overwrite: false
output.logstash:
  hosts: ["192.168.110.64:5044"]
  when.contains:
        tags: "nginx"
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~


```

#### 3.修改logstash配置文件

```
[root@elk4 opt]# cp /etc/logstash/conf.d/access.conf /etc/logstash/conf.d/nginx.conf

[root@64-kl ~]# cat /etc/logstash/conf.d/nginx.conf 
input {
    beats {
      port => 5044
      type => "test-nginx"
      codec => "json"
    }
}
output {
     elasticsearch {
       hosts => ["192.168.110.65:9200","192.168.110.66:9200","192.168.110.67:9200"]
       index => "%{type}-%{+yyyy.MM.dd}"
     }
}

```

#### 4.重启filebeat

```
[root@elk4 opt]# systemctl restart filebeat
```

#### 5.指定配置文件启动logstash

```
[root@elk4 opt]# logstash -f /etc/logstash/conf.d/nginx.conf >> /dev/null &
```

#### 6.验证

```
[root@elk4 opt]# netstat -ntpl |grep 5044
```

![image-20220601152216072](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202206011522112.png)

去到es集群的head页面(port:9100)刷新出来，如下图

![image-20230526173412980](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/image-20230526173412980.png)



## 消息队列zookeeper+kafka集群部署

|       ip       |     中间件      |
| :------------: | :-------------: |
| 192.168.110.61 | kafka,zookrrper |
| 192.168.110.62 | kafka,zookeeper |
| 192.168.110.63 | kafka,zookeeper |

### 修改host 

```
[root@63-kb3 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.110.61  61-kb1
192.168.110.62  62-kb2
192.168.110.63  63-kb3

scp /etc/hosts 192.168.110.62:/etc/hosts
scp /etc/hosts 192.168.110.63:/etc/hosts
```

### 配置java环境

```
略略略
```

### zookeeper单点启动（测试）

#### 1.下载

zookeeper官网：https://www.apache.org/

版本 3.7

三台机子都下载

```
cd /opt/ && yum -y install wget && wget --no-check-certificate https://downloads.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
```

#### 2.单点启动

```
[root@kafka1 opt]# tar -xvf apache-zookeeper-3.7.1-bin.tar.gz
[root@kafka1 opt]# cd apache-zookeeper-3.7.1-bin
[root@kafka1 apache-zookeeper-3.7.1-bin]# ll
总用量 36
drwxr-xr-x 2 1000 1000  4096 3月  17 2021 bin
drwxr-xr-x 2 1000 1000    77 3月  17 2021 conf
drwxr-xr-x 5 1000 1000  4096 3月  17 2021 docs
drwxr-xr-x 2 root root  4096 4月  17 17:15 lib
-rw-r--r-- 1 1000 1000 11358 3月  17 2021 LICENSE.txt
-rw-r--r-- 1 1000 1000   432 3月  17 2021 NOTICE.txt
-rw-r--r-- 1 1000 1000  2214 3月  17 2021 README.md
-rw-r--r-- 1 1000 1000  3570 3月  17 2021 README_packaging.md
[root@kafka1 apache-zookeeper-3.7.1-bin]# cd conf/
[root@kafka1 conf]# cp zoo_sample.cfg zoo.cfg

[root@kafka1 conf]# grep -Ev "#|^$" /root/apache-zookeeper-3.7.1-bin/conf/zoo.cfg   # 修改如下，根据业务需求修改

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeperkeeper    # 存储快照的目录，不要默认
clientPort=2181
maxClientCnxns=128   # 客户最大连接数


[root@kafka1 opt]# mv /opt/apache-zookeeper-3.7.1-bin /usr/local/zookeeper
[root@kafka1 opt]# mkdir /opt/zookeeperkeeper

[root@kafka1 conf]#  /root/apache-zookeeper-3.7.1-bin/bin/zkServer.sh  start 
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.7.1-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
#出现STARTED表示启动成功,出现FAILED TO START要检查配置文件是否有问题

# 检查2181端口
[root@kafka1 opt]# netstat -aulntp|grep 2181
```

#### 3.单点测试

```
[root@kafka1 opt]#  /root/apache-zookeeper-3.7.1-bin/bin/zkCli.sh -server 192.168.110.61:2181

[zk: 192.168.110.175:2181(CONNECTED) 1] ls /
[zookeeper]
[zk: 192.168.110.175:2181(CONNECTED) 2] ls /zookeeper 
[config, quota]
[zk: 192.168.110.175:2181(CONNECTED) 3] ls /zookeeper/config 
[]
[zk: 192.168.110.175:2181(CONNECTED) 4] ls /zookeeper/
config   quota    
[zk: 192.168.110.175:2181(CONNECTED) 4] ls /zookeeper/quota 
[]
[zk: 192.168.110.175:2181(CONNECTED) 5] create /linux
Created /linux
[zk: 192.168.110.175:2181(CONNECTED) 6] ls /
[linux, zookeeper]
[zk: 192.168.110.175:2181(CONNECTED) 7] create /shy shy514
Created /shy
[zk: 192.168.110.175:2181(CONNECTED) 8] get /shy 
shy514
[zk: 192.168.110.175:2181(CONNECTED) 9] delete /shy 
[zk: 192.168.110.175:2181(CONNECTED) 10] get /shy 
org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /shy
[zk: 192.168.110.175:2181(CONNECTED) 11] ls
ls [-s] [-w] [-R] path
[zk: 192.168.110.175:2181(CONNECTED) 12] ls /
[linux, zookeeper]
[zk: 192.168.110.175:2181(CONNECTED) 13] delete /linux
[zk: 192.168.110.175:2181(CONNECTED) 14] ls /
[zookeeper]
# zookeeper千万不要删


[zk: 192.168.110.175:2181(CONNECTED) 15] quit
```

```
# 复制会话，这些操作记录在log.1
[root@kafka1 version-2]# ll /opt/zookeeperkeeper/version-2/
总用量 12
-rw-r--r-- 1 root root 67108880 4月  17 18:03 log.1
-rw-r--r-- 1 root root      457 4月  17 17:31 snapshot.0
```

## zookeeper与kafka集群



### 1、配置zookeeper集群

#### 1.修改配置文件

```
[root@kafka1 opt]# grep -Ev "#|^$" /usr/local/zookeeper/conf/zoo.cfg 
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeperkeeper
clientPort=2181
maxClientCnxns=4096
autopurge.snapRetainCount=128   # /opt/zookeeperkeeper里保存快照的最大数量
autopurge.purgeInterval=1   # 几小时清理一次
# 可以用主机名，因为设置了映射
server.1=192.168.110.175:2888:3888
server.2=192.168.110.176:2888:3888
server.3=192.168.110.177:2888:3888

配置参数解读：

server.A=B:C:D

A是一个数字，表示这个是第几号服务器。myid中的编号就是这个值。zookeeper启动时读取此文件，拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
B是这个服务器的地址。
C是这个服务器Follower与集群中的Leader服务器交换信息的端口。
D是万一集群中的leader服务器挂了，需要一个端口来重新进行选举，选举一个新的leader，而这个端口就是用来执行选举时服务器相互通信的端口。
```

```
# 因为之前单点启动过，先关闭
[root@kafka1 opt]# /usr/local/zookeeper/bin/zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
```

#### 2.添加集群id

```
[root@kafka1 opt]# cd /usr/local/zookeeper/conf/
[root@kafka1 conf]# scp zoo.cfg 192.168.110.176:`pwd`
root@192.168.110.176's password: 
zoo.cfg                                                                                               100% 1248     2.1MB/s   00:00    
[root@kafka1 conf]# scp zoo.cfg 192.168.110.177:`pwd`
root@192.168.110.177's password: 
zoo.cfg                                                                                               100% 1248     1.4MB/s   00:00    

# 验证是否发到对应机子目录下
```

```
# 在原来的机上清空zoo文件夹
[root@kafka1 conf]# rm -rf //opt/zookeeperkeeper/*
```

```
# 在不同的机子上给予不同的id
[root@kafka1 conf]# echo "1" > /opt/zookeeperkeeper/myid

[root@kafka2 conf]# echo "2" > /opt/zookeeperkeeper/myid

[root@kafka3 conf]# echo "3" > /opt/zookeeperkeeper/myid
```

#### 3.启动zookeeper集群

```
# 三台机子同时操作
/usr/local/zookeeper/bin/zkServer.sh start

# 查询状态
/usr/local/zookeeper/bin/zkServer.sh status

# 两个follower一个leader，我的是kafka2是leader
```

启动时报错如下：

![image-20221012153803366](https://ye5201314-1312898079.cos.ap-guangzhou.myqcloud.com/202210121538462.png)

错误原因

在配置zoo.cfg文件时候，端口号后面还有空格。因为是从其他地方复制的，所以不容易发现

```
server.0=spark1:2888:3888(此处有空格)
server.1=spark2:2888:3888
server.2=spark3:2888:3888
```

解决办法：

删掉端口号后面的空格即可



### 2、配置kafka集群

kafka官网https://kafka.apache.org/

#### 1.下载安装kafka

```
cd /opt && wget https://archive.apache.org/dist/kafka/2.6.0/kafka_2.12-2.6.0.tgz
tar -zxvf kafka_2.12-2.6.0.tgz
mv kafka_2.12-2.6.0 /usr/local/kafka
```

#### 2.修改kafka配置文件

```
[root@kafka1 ~]# cd /usr/local/kafka/config/
[root@kafka1 config]# cp server.properties server.properties.bak
[root@kafka1 config]# grep -Ev "#|^$" server.properties
broker.id=0   # 节点id
listeners=PLAINTEXT://192.168.110.175:9092   # 改成本机ip
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/opt/kafka   # 储存日志文件
num.partitions=1	#这个参数用于设置新创建的topic有多少个分区，可以根据消费者实际情况配置
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168		#这个参数用于配置kafka中消息保存的时间，还支持log.retention.minutes和log.retention.ms配置项
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=kafka1:2181,kafka2:2181,kafka3:2181   # 所有节点的ip或者映射
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
```

复制配置文件

```
[root@kafka1 config]# scp -r server.properties 192.168.110.176:`pwd`
root@192.168.110.176's password: 
server.properties                                     100% 6879     8.6MB/s   00:00    
[root@kafka1 config]# scp -r server.properties 192.168.110.177:`pwd`
root@192.168.110.177's password: 
server.properties                                     100% 6879     7.4MB/s   00:00    

```

```
# 修改其他机子的id和ip
[root@kafka2 ~]# cd /usr/local/kafka/config/
[root@kafka2 config]# vim server.properties
# 修改如下
21 broker.id=1
31 listeners=PLAINTEXT://192.168.110.176:9092


[root@kafka3 config]# cd /usr/local/kafka/config/
[root@kafka3 config]# vim server.properties
# 修改如下
21 broker.id=2
31 listeners=PLAINTEXT://192.168.110.177:9092
```

```
# 全部机子都操作
mkdir -p /opt/kafka
```

#### 2.启动kafka

```
# 全部机子都操作
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
```

```
# 验证
# 主机会有5个端口，两个为自身机子，其他三个是集群
[root@kafka1 config]# netstat -aulntp | grep 9092
tcp6       0      0 192.168.110.175:9092    :::*                    LISTEN      18641/java          
tcp6       0      0 192.168.110.175:40070   192.168.110.175:9092    ESTABLISHED 18641/java          
tcp6       0      0 192.168.110.175:9092    192.168.110.175:40070   ESTABLISHED 18641/java          
tcp6       0      0 192.168.110.175:34324   192.168.110.176:9092    ESTABLISHED 18641/java          
tcp6       0      0 192.168.110.175:39458   192.168.110.177:9092    ESTABLISHED 18641/java


# 从机的
[root@kafka2 config]# netstat -aulntp | grep 9092
tcp6       0      0 192.168.110.176:9092    :::*                    LISTEN      18068/java          
tcp6       0      0 192.168.110.176:9092    192.168.110.175:34324   ESTABLISHED 18068/java
```

### 8.kafka集群基本命令操作

kefka提供了多个命令用于查看、创建、修改、删除topic信息，也可以通过命令测试如何生产消息、消费消息等，这些命令位于kafka安装目录的bin目录下，这里是/usr/local/kafka/bin。登录任意一台kafka集群节点，切换到此目录下，即可进行命令操作。下面列举kafka的一些常用命令的使用方法。



**创建主题与测试**

```
[root@kafka1 config]# /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper kafka1:2181,kafka2:2181,kafka3:2181 --partitions 3 --replication-factor 3 --topic test
Created topic test.



# 验证topic
[root@kafka1 config]# /usr/local/kafka/bin/kafka-topics.sh --describe --zookeeper kafka1:2181,kafka2:2181,kafka3:2181 --topic test
Topic: test	PartitionCount: 3	ReplicationFactor: 3	Configs: 
	Topic: test	Partition: 0	Leader: 2	Replicas: 2,0,1	Isr: 2,0,1
	Topic: test	Partition: 1	Leader: 0	Replicas: 0,1,2	Isr: 0,1,2
	Topic: test	Partition: 2	Leader: 1	Replicas: 1,2,0	Isr: 1,2,0

# 获取所有topic
[root@kafka1 config]# /usr/local/kafka/bin/kafka-topics.sh --list --zookeeper kafka1:2181,kafka2:2181,kafka3:2181
test
```

**生产消息**

```
[root@kafka1 config]# /usr/local/kafka/bin/kafka-console-producer.sh --broker-list kafka1:9092,kafka2:9092,kafka3:9092 --topic test
>this is a test
```

**消费消息**

```
[root@kafka1 config]# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test --from-beginning
this is a test

# 在1号即发消息，这里能收到消息
```

**删除消息**

```
[root@kafka1 config]# /usr/local/kafka/bin/kafka-topics.sh --zookeeper kafka1:2181,kafka2:2181,kafka3:2181 --delete --topic test
```

kafka可视化工具

https://www.freesion.com/article/72661130783/



## ELK+FileBeat+Redis架构

```
略
```









