定制网站基于kafka的日志收集

目录


一、环境准备

Ⅰ、定制网站准备好三台虚拟机用于搭建和kafka集群

Ⅱ、配置静态ip地址

<!--定制网站一般大家的虚拟机都是使用dhcp,ip定制网站是动态更改的,定制网站当每次关机重启之后,ip定制网站地址会改变.定制网站但后期进行操作时,ip定制网站需要跟服务进行绑定,定制网站所以这里创建虚拟机尽量选择NAT模式,ip为静态IP。定制网站不然每次开机重启会很繁琐。-->

1、定制网站更改网卡配置文件

  1. [root@nginx-kafka01 ~]# cd /etc/sysconfig//network-scripts/
  2. [root@nginx-kafka01 network-scripts]# ls
  3. ifcfg-ens33 ifdown-ippp ifdown-routes ifup ifup-ipv6 ifup-ppp ifup-tunnel
  4. ifcfg-lo ifdown-ipv6 ifdown-sit ifup-aliases ifup-isdn ifup-routes ifup-wireless
  5. ifdown ifdown-isdn ifdown-Team ifup-bnep ifup-plip ifup-sit init.ipv6-global
  6. ifdown-bnep ifdown-post ifdown-TeamPort ifup-eth ifup-plusb ifup-Team network-functions
  7. ifdown-eth ifdown-ppp ifdown-tunnel ifup-ippp ifup-post ifup-TeamPort network-functions-ipv6
  8. [root@nginx-kafka01 network-scripts]#

定制网站这里我的网卡配置文件为ifcfg-ens33,定制网站还有一部分人的为ifcfg-ens22

  1. IPADDR=192.168.8.137
  2. GATEWAY=192.168.8.2
  3. PREFIX=24
  4. DNS1=114.114.114.114

定制网站网卡配置管理服务

CentOS7定制网站里面有俩个网卡配置服务Network/NetworkManager(默认开启)定制网站只能起俩个中的一个服务,CentOS8只有NetworkManager

  1. [root@nginx-kafka01 network-scripts]# ps -ef|grep -i network
  2. root 677 1 0 07:48 ? 00:00:00 /usr/sbin/NetworkManager --no-daemon
  3. root 1468 1424 0 08:07 pts/0 00:00:00 grep --color=auto -i network
  4. [root@nginx-kafka01 network-scripts]#

注:开启/定制网站重启关闭服务:systemctl start/restart/stop (服务名)

定制网站通过其他方式安装的服务当使用systemctl 起服务时,systemctl定制网站会自动调用systemd下面的system定制网站目录下的服务配置文件。

  1. [root@nginx-kafka01 system]# ls |grep NetworkManager
  2. NetworkManager-dispatcher.service
  3. NetworkManager.service
  4. NetworkManager-wait-online.service
  5. [root@nginx-kafka01 system]# pwd
  6. /usr/lib/systemd/system
  7. [root@nginx-kafka01 system]#

定制网站这个目录下面的文件以.service结尾,定制网站理论上都可以交给systemctl进行管理,定制网站开启相应服务时相当于定制网站运行此目录下.service定制网站结尾的文件,定制网站也相当于运行图片中的那行代码

 

2、定制网站配置默认路由

路由:定制网站配置好路由,定制网站告诉包怎么走,定制网站发往哪里去

  1. [root@nginx-kafka01 system]# ip r
  2. default via 192.168.8.2 dev ens33 proto static metric 100
  3. 192.168.8.0/24 dev ens33 proto kernel scope link src 192.168.8.137 metric 100
  4. [root@nginx-kafka01 system]#

3、配置DNS

[root@nginx-kafka01 system]# cat /etc/resolv.conf

Generated by NetworkManager

nameserver 114.114.114.11

dns解析:

<!--1、定制网站浏览器的缓存-->
<!--2、本地hosts文件_--linux (letc/hosts)-->
<!--3、定制网站找本地域名服务器-- linux (/etc/resolv.conf)-->

Ⅲ、定制网站修改主机名

<!--hostnamectl set-hostname +主机名-->

Ⅳ、域名解析

<!--/etc/hosthname定制网站文件中三台虚拟机都得保持一直-->

  1. [root@nginx-kafka01 system]# cat /etc/hosts
  2. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. 192.168.8.137 nginx-kafka01
  5. 192.168.8.135 nginx-kafka02
  6. 192.168.8.140 nginx-kafka03
  7. [root@nginx-kafka01 system]#

Ⅴ、定制网站安装基本软件

yum install wget lsof vim -y

用于上网,定制网站从网上下东西,定制网站后期会从网上下

Ⅵ、定制网站安装时间同步服务

yum -y install chrony systemctl enable chronyd #定制网站设置开机自启 disable定制网站关闭开机自启 systemctl start chronyd

 设置时区: cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

<!--定制网站日志消费清洗,需要同步,定制网站所以得先确保三台虚拟定制网站机的时间时同步的-->

<!--定制网站它的时间会自动同步,但后期使用之后,时间会存在时间差-->

Ⅶ、关闭防火墙

1、关闭防火墙:

[root@nginx-kafka01 ~]# systemctl stop firewalld ​

[root@nginx-kafka01 ~]# systemctl disable firewalld

服务运行时,若防火墙不关闭会有影响

2、关闭selinux:

关闭selinux:vim /etc/selinux/config……SELINUX=disabled……    selinux关闭后 需要重启机器[root@nginx-kafka01 system]# getenforce    ----查看是否生效Disabled[root@nginx-kafka01 system]# 

selinux是linux系统内核里一个跟安全相关的子系统,规则非常繁琐一般日常工作里都是关闭的


二、nginx搭建

Ⅰ.安装epel源并下载nginx服务

yum install eple-release -y

yum install nginx -y

Ⅱ.启动nginx服务

systemctl start nginx 1、设置开机自启 ​ systemctl enable nginx

  • 通过ststemctl 管理的服务,如果需要设置开机自启,则设置一个链接,链接到 /etc/systemd/system/multi-user.target.wants目录下面来。开机的时候根据这个目录来启动里面的每一个服务。

  1. [root@nginx-kafka01 nginx]# ls
  2. apache-zookeeper-3.6.3-bin.tar.gz mime.types
  3. conf.d mime.types.default
  4. default.d nginx.conf
  5. fastcgi.conf nginx.conf.default
  6. fastcgi.conf.default scgi_params
  7. fastcgi_params scgi_params.default
  8. fastcgi_params.default uwsgi_params
  9. koi-utf uwsgi_params.default
  10. koi-win win-utf
  11. [root@nginx-kafka01 nginx]#

Ⅲ.编辑配置文件

1、nginx.conf :主配置文件

`全局块

<!--user nginx;   
worker_processes auto;    

<!------- nginx工作进程,我的为自动设置-->
error_log /var/log/nginx/error.log   

<!-----  nginx错误日志的路径-->

pid /run/nginx.pid     

<!-------   每个进程的唯一标识符保存路径 每个进程起来之后都会有一个pid作为唯一标识符-->

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

(1)、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

(2)、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

(3)、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

(4)、server块:配置虚拟主机的相关参数,一个http中可以有多个server。

(5)、location块:配置请求的路由,以及各种页面的处理情况

2、配置文件修改

(1) http:

我们主要对配置文件里的http块进行修改:

log_format main部分是nginx配置文件http部分的日志格式

acess_log 部分是nginx配置文件http部分访问日志的存放路径

include /etc/nginx/conf.d/*.conf;

这个是包含在http块里,当加载http块时,这个目录下的以》.conf结尾的文件

server:

<!--一个nginx可以有多个网站,每个网站又有与其对应的唯一一个server-->

将 listen 80 default_server; 修改成: listen 80;

版本原因,有的不需要改这里

(2) conf.d目录下虚拟主机的配置:

  1. [root@nginx-kafka01 conf.d]# pwd
  2. /etc/nginx/conf.d
  3. [root@nginx-kafka01 conf.d]# ls
  4. sc.conf
  5. [root@nginx-kafka01 conf.d]# cat sc.conf
  6. server {
  7. listen 80 default_server;
  8. server_name www.sc.com;
  9. root /usr/share/nginx/html;
  10. access_log /var/log/nginx/sc/access.log main;
  11. location / {
  12. }
  13. }
  14. [root@nginx-kafka01 conf.d]#

当客户端以域名来访问这个网站时,通过端口为80访问,访问此虚拟主机,default_server的作用是当客户端以ip来访问网站时,default_server会默认访问这个网站的内容。

注:nginx做web网站只能支持静态网页展示,基于HTTP协议(超文本传输协议)

(3) 语法检测

  1. root@nginx-kafka01 html]# nginx -t
  2. nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
  3. nginx: [emerg] open() "/var/log/nginx/sc/access.log" failed (2: No such file or directory)
  4. nginx: configuration file /etc/nginx/nginx.conf test failed
  5. [root@nginx-kafka01 html]# mkdir /var/log/nginx/sc
  6. [root@nginx-kafka01 html]# nginx -t
  7. nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
  8. nginx: configuration file /etc/nginx/nginx.conf test is successful

(4) 重新加载nginx

nginx -s reload

写在后面:nginx集群搭建的web服务,只是提供了一个访问的静态页面,做测试

        假设在本地虚拟机上直接部署环境来监控日志,很难用一个量来记录上次的日志处理到了那一条,且日志是实时变化的,还有定期删除,不能存放大量的日志文件,很消耗内存。采用消息中间件来统一收集日志,对数据库的访问次数将大大减少,使服务更稳定,更高效。同时方便对日志排错

1.方便定位故障

2.方便扩展其他程序接入


三、kafka集群搭建

Ⅰ、kafka原理

1、使用kafka做日志统一收集的好处

(1).故障发生时方便定位问题

(2).日志集中管理,后续需要日志的程序直接从kafka获取日志即可。尽可能的减少日志处理对nginx的影响。

2、kafka消息中间件通常用途:

(1) 日志收集

对kafka进行消费可以来获得自己想要的日志信息

(2) 业务解耦

通过将服务的一些不太重要的业务交给消息中间件来操作,当某些业务出现故障后,实现对服务的影响最小化,同时方便扩展,提高业务的稳定性

(3) 流量削峰

例入双11之类的活动或者周末日游戏app上线等情况下流量突增,此刻消息中间件类似缓存。每访问下,就从消息中间件里消费一些数据。来减小服务的压力

3、消息中间件的俩种通信方式

  • 点对点

  • 发布订阅

<!--kafka: 消息中间件,是一个很典型的生产者消费者模型的软件。还有nsq\rocketMq等消息中间件,而kafak采用发布-订阅的消息传递方式-->

4、kafka专业术语:

(1)broker

  • 服务器节点

(2)topic-主题

  • 消息的类别

(3)partition-分区

  • 提高查吐量--提高效率--一般来说有几个broker就设置几个partition

  • 支持并发的读写

  • 有多个partition的话,消息的顺序总体来说就跟原来不一样了,但在单独的partition里面还是顺序

(4)replica

  • 副本

6、kafka如何保证高可用

(1) kafka集群工作原理图

多个broker +多个partition +多个replica

<!--broker数量如果和'replica一致,可以坏掉n-1台-->

  • 当filebeat收集日志送给kafka集群某一个分区时,不知道要把数据送到某个分区里的哪一个partition.

  • partition跟它的副本里依据ISR选择出leader跟follower

(2) ISR

  • in-sync-replica 是一个集合列表 存放需要同步的follower集合

         比如说5个副本,1个leader 4 follower -->ISR 有一条消息来了,leader怎么知道要同步哪些副本呢?_根据ISR来。如果一个followmer挂了,那就从这个列表里删除了如果一个follower卡住或者同步过慢它也会从ISR里删除。

7、如何保证数据一致性

(1)生产者数据一致性

        Kafka在Producer里面提供了消息确认机制。可以通过配置来决定有几个副本收到这条消息才算消息发送成功。可以在定义 Producer时通过acks参数指定(在0.8.2.X版本之前是通过request.required.acks参数设置的)。这个参数支持以下三种值:

  • acks=0 生产者不需要接收响应,发完就发下一条

  • acks=1(默认值)︰只要集群的Leader节点收到消息,生产者就会收到一个来自服务器的成功响应

  • acks=-1∶只有当所有参与复制的节点全部都收到消息时,生产者才会收到一个来自服务器的成功响应 <!--这种模式是最安全的,可以保证不止一个服务器收到消息,就算有服务器发生崩溃,整个集群依然可以运行,但延时比acks=1更高,因为要等待不止一个服务器节点接收消息-->

(2)消费者数据一致性

消费者消费数据时,引入了High Water Mark机制。木桶效应,只能消费ISR列表里偏移量最少的副本的消息数量。

Ⅱ、Kafka集群配置

yum install lrzsz -y

1、Kafka配置

(1) 安装:

安装java:yum install java wget -y -->kafka、zookeeper都是使用java写的 安装kafka: wget 解包: tar xf kafka_2.12-2.8.1.tgz

(2)kafka文件下各目录

bin : 存放二进制文件

config : 存放配置文件

libs : 通常存放kafka的库

logs : 存放日志文件

(3)config下配置文件的修改

修改config /server.properties: ① broker.id=1/2 /3……

<!--# The id of the broker. This must be set to a unique integer for each broker.-->

broker为代理的 ID,每个代理,必须将其设置为唯一的整数

② listeners=PLAINTEXT://nginx-kafka01:9092

kafka默认端口是9092

③ log.dirs=/data

kafka数据接收保存的地方,我的改为/data.

④ num.partitions=3

每个主题的默认日志分区数。更多的分区允许更大的并行度来使用,但这也将导致跨代理的文件更多。我将默认的1个改为3个。

④ zookeeper.connect=192.168.8.94:2181,192.168.8.95:2181,192.168.8.96:2181

zookeeper默认端口是2181

<!--zookeeper.properties : 主要配置kafka下的集成zk的,不太好用-->

2、zookeeper配置

(1) 安装

使用自带的zookeeper集群配置 安装zookeeper: wget

(2)conf 配置文件修改

① 先将conf 配置文件下的zoo_sample.cfg拷贝一份命名为zoo.cfg(启动时只认zookeeper配置文件的名字为zoo.cfg)

cp zoo_sample.cfg zoo.cfg

② 对zoo.cfg文件进行操作:

  • dataDir=/tmp/zookeeper --》zookeeper存放路径的位置

  • clientPort=2181 --》zookeeper的默认端口

  • 在文件中添加三行代码:

<!--这是zookeeper集群里各机器对应Ip,3888和4888都是端口 3888用于数据传输,4888用于检验存活性和选举-->

  • zookeeper机器宣告自己的ip

    创建/tmp/zookeeper目录 ,在目录中添加myid文件,文件内容就是本机指定的zookeeper id内容 

  •  例上图:在192.168.8.137机器上

  • echo 1 > /tmp/zookeeper/myid

(3)zookeeper 功能

分布式应用程序协调服务软件,提供的功能是:配置维护、域名服务、分布式同步、组服务等

3、启动

先启动zookeeper,后启动kafka(kafka的启动时依赖与zookeeper的,关闭服务的时候,先关闭kafka,再关闭zookeeper)

(1) 启动zookeeper

bin/zkServer.sh start (此目录下执行[root@nginx-kafka01 apache-zookeeper-3.6.3-bin]# pwd /opt/apache-zookeeper-3.6.3-bin)

  • 查看是否启动成功

  1. [root@nginx-kafka03 apache-zookeeper-3.6.3-bin]# bin/zkServer.sh status
  2. /usr/bin/java
  3. ZooKeeper JMX enabled by default
  4. Using config: /opt/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
  5. Client port found: 2181. Client address: localhost. Client SSL: false.
  6. Mode: leader

至少的有一个leader

(2) 启动kafka

bin/kafka-server-start.sh -daemon config/server.properties

(3)连接zookeeper,及其使用

zookeeper目录下执行 bin/zkCli.sh

  1. [zk: localhost:2181(CONNECTED) 4] get /brokers/ids/0
  2. {"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://nginx-kafka02:9092"],"jmx_port":9999,"features":{},"host":"nginx-kafka02","timestamp":"1642300427923","port":9092,"version":5}
  3. [zk: localhost:2181(CONNECTED) 5] ls /brokers/ids/0
  4. []
  5. [zk: localhost:2181(CONNECTED) 6] get /brokers/ids/0
  6. {"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://nginx-kafka02:9092"],"jmx_port":9999,"features":{},"host":"nginx-kafka02","timestamp":"1642300427923","port":9092,"version":5}
  • create 是创建节点

  • get是查看某个文件某个节点具体的值是什么

  • set 是设置某个节点的值

  • ls 是查看

① 当zookeeper集群没有搭建成功时:

1)、查看kafka进程是否跪了,若跪了则重新启动()

ps -ef|grep kafka

2)、

3)、默认用之前我们搭建的zookeeper集群,zookeeper也是可以指定路径的,

vim /opt/kkafka_2.12-2.8.1/config/server.properties

<!--我们连接kafka时,是直接连接的zookeeper的,整个集群是要交给zookeeper管理的,当我们没有创建节点时,是直接连接到“/”下面的,它便会自动创建一个brokers。-->

Ⅲ、测试

使用自带的测试工具进行测试

(2)、创建主题

bin/kafka-topics.sh --create --zookeeper 192.168.8.135:2181 --replication-factor 3 --partitions 1 --topic sc

创建的主题信息会保存在zookeeper上面

(1)、查看创建的主题信息:

  • kafka目录下面bin/zkCli.sh

  • ls /brokers/topics

    或者 bin/kafka-topics.sh --list --zookeeper 192.168.8.135:2181

    <!--其主题信息存在 /data目录下-->

(3)、使用提供的测试脚本创建生产者

[root@localhost kafka_2.12-2.8.0]# bin/kafka-console-producer.sh --broker-list 192.168.8.135:9092 --topic sc

(4) 、创建消费者

[root@localhost kafka_2.12-2.8.0]# bin/kafka-console-consumer.sh --bootstrap-server 192.168.8.135:9092 --topic sc --from-beginning

<!--里面的ip可以填zookeeper集群里面的任意一台,因为它们的数据是一致的-->

查看hostname--->cat /etc/hosts -->kafka 配置文件config/server.pro里的zookeeper集群里的配置,还有listern处


四、filebeat部署

Ⅰ、filebeat

1、Beats 是轻量级日志采集器,使用go语言编写的

2、工作方式

         启动Filebeati时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到ibeat, libeat将聚集事件,并将聚集的数据发送到为Flebe.置的输出。

3、filebeat和logstash的关系 因为logstash是Jvm跑的,资源消耗比较大,所以后来作者又用golang写了一个功能较少但是资源消耗也小的轻量级的logstash-forwarder。不过作者是一个人,加入 公司以后,因为es公司本身还收购了另一个开源项目packetbeat ,而这个项目专门就是用golang的,有整个团队,所以es司干脆把logstash-forwarder的开发工作也合并到同一个golang团队来搞,于是新的项目就叫filebeat了。

4、filebeat的构成 flebeat结构:由两个组件构成,分别是inputs (输入)和harvesters (收集器),harvester负责读取单个文件的内容。harvester逐行读取每个文件,并将内容发送到输出。为每个文件启动一个harvester。harvester负责打开和关闭文这意味着文件描述符在harvester运行时保持打开状态。如果在收集文件时删除或重命名文件,Filebeat将继续读取该文件。这样做的副作用是,磁盘上的空直保留到harvester关闭。默认情况下,Filebeat保持文件打开,直到达到close_inactive

Ⅱ、fliebeat的配置

1、安装

1、rpm --import

2、编辑/etc/yum.repos.d/fb.repo文件

  1. elastic-7.x]
  2. name=Elastic repository for 7.x packages
  3. baseurl=https://artifacts.elastic.co/packages/7.x/yum
  4. gpgcheck=1
  5. gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
  6. enabled=1
  7. autorefresh=1
  8. type=rpm-md

 3、yum安装

`yum  install  filebeat -y`

rpm -qa |grep filebeat #可以查看filebeat有没有安装 rpm -qa 是查看机器上安装的所有软件包 rpm -ql filebeat 查看filebeat安装到哪里去了,牵扯的文件有哪些

4、设置开机自启

systemctl enable filebeat

  1. `{
  2. "filebeat.inputs": [
  3. { "type":"log",
  4. "enabled":true,
  5. "paths":["/var/log/nginx/sc_access"
  6. },
  7. ],
  8. }`

2、修改配置

修改配置文件/etc/filebeat/filebeat.yml `filebeat.inputs:

  1. `filebeat.inputs:
  2. - type: log
  3. Change to true to enable this input configuration.
  4. enabled: true
  5. Paths that should be crawled and fetched. Glob based paths.
  6. paths:
  7. - /var/log/nginx/sc/access.log
  8. #==========------------------------------kafka-----------------------------------
  9. output.kafka:
  10. hosts: ["192.168.8.137:9092","192.168.8.135","192.168.8.140:9092"]
  11. topic: nginxlog
  12. keep_alive: 10s

3、验证fliebeat

① 创建主题nginxlog

bin/kafka-topics.sh --create --zookeeper 192.168.8.135:2181 --replication-factor 2 --partitions 1 --topic nginxlog

② 启动服务:

systemctl start filebeat

③ 查看fliebeat 是否启动

ps -ef |grep filebeatroot

④ 消费数据

bin/kafka-console-consumer.sh --bootstrap-server 192.168.8.135:9092 --topic nginxlog --from-beginning

⑤ 如果消费不到数据 :

  • 查看filebeat服务是否起来了(ps -ef|grep filebeat)

  • 查看filebeat 日志(/var/lib/filebeat/registry/filebeat/log.json)

  • 重启filebeat服务


五、添加域名映射

在客户端添加域名及IP,是客户端可以通过域名访问nginx web静态页面

C:\Windows\System32\drivers\etc下的hosts里添加对应域名及IP

排错:

zookeeper启动报错:

1、只显示进程号

之前已经开启zookeeper没有关闭,重启启动(restart)就可以了

2、显示Mode : standalone

 

若出现上面结果,关闭防火墙之后再尝试,便能成功

3、 查看日志文件

日志文件配置错误,在检查检查配置

4 、如果想重新配置zookeeper,先关闭zookeeper服务,再到/tmp/zookeeper 目录下把历史信息删除:rm -rf version-2

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发