目录
一、环境准备
Ⅰ、准备好三台虚拟机用于搭建nginx和kafka集群
Ⅱ、配置静态ip地址
<!--一般大家的虚拟机都是使用dhcp,ip是动态更改的,当每次关机重启之后,ip地址会改变.但后期进行操作时,ip需要跟服务进行绑定,所以这里创建虚拟机尽量选择NAT模式,ip为静态IP。不然每次开机重启会很繁琐。-->
1、更改网卡配置文件
[root@nginx-kafka01 ~]# cd /etc/sysconfig//network-scripts/
[root@nginx-kafka01 network-scripts]# ls
ifcfg-ens33 ifdown-ippp ifdown-routes ifup ifup-ipv6 ifup-ppp ifup-tunnel
ifcfg-lo ifdown-ipv6 ifdown-sit ifup-aliases ifup-isdn ifup-routes ifup-wireless
ifdown ifdown-isdn ifdown-Team ifup-bnep ifup-plip ifup-sit init.ipv6-global
ifdown-bnep ifdown-post ifdown-TeamPort ifup-eth ifup-plusb ifup-Team network-functions
ifdown-eth ifdown-ppp ifdown-tunnel ifup-ippp ifup-post ifup-TeamPort network-functions-ipv6
[root@nginx-kafka01 network-scripts]#
这里我的网卡配置文件为ifcfg-ens33,还有一部分人的为ifcfg-ens22
IPADDR=192.168.8.137
GATEWAY=192.168.8.2
PREFIX=24
DNS1=114.114.114.114
网卡配置管理服务
CentOS7里面有俩个网卡配置服务Network/NetworkManager(默认开启)只能起俩个中的一个服务,CentOS8只有NetworkManager
[root@nginx-kafka01 network-scripts]# ps -ef|grep -i network
root 677 1 0 07:48 ? 00:00:00 /usr/sbin/NetworkManager --no-daemon
root 1468 1424 0 08:07 pts/0 00:00:00 grep --color=auto -i network
[root@nginx-kafka01 network-scripts]#
注:开启/重启关闭服务:systemctl start/restart/stop (服务名)
通过其他方式安装的服务当使用systemctl 起服务时,systemctl会自动调用systemd下面的system目录下的服务配置文件。
[root@nginx-kafka01 system]# ls |grep NetworkManager
NetworkManager-dispatcher.service
NetworkManager.service
NetworkManager-wait-online.service
[root@nginx-kafka01 system]# pwd
/usr/lib/systemd/system
[root@nginx-kafka01 system]#
这个目录下面的文件以.service结尾,理论上都可以交给systemctl进行管理,开启相应服务时相当于运行此目录下.service结尾的文件,也相当于运行图片中的那行代码
2、配置默认路由
路由:配置好路由,告诉包怎么走,发往哪里去
[root@nginx-kafka01 system]# ip r
default via 192.168.8.2 dev ens33 proto static metric 100
192.168.8.0/24 dev ens33 proto kernel scope link src 192.168.8.137 metric 100
[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文件中三台虚拟机都得保持一直-->
[root@nginx-kafka01 system]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.8.137 nginx-kafka01
192.168.8.135 nginx-kafka02
192.168.8.140 nginx-kafka03
[root@nginx-kafka01 system]#
Ⅴ、安装基本软件
yum install wget lsof vim -y
用于上网,从网上下东西,后期会从网上下kafka
Ⅵ、安装时间同步服务
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目录下面来。开机的时候根据这个目录来启动里面的每一个服务。
[root@nginx-kafka01 nginx]# ls
apache-zookeeper-3.6.3-bin.tar.gz mime.types
conf.d mime.types.default
default.d nginx.conf
fastcgi.conf nginx.conf.default
fastcgi.conf.default scgi_params
fastcgi_params scgi_params.default
fastcgi_params.default uwsgi_params
koi-utf uwsgi_params.default
koi-win win-utf
[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目录下虚拟主机的配置:
[root@nginx-kafka01 conf.d]# pwd
/etc/nginx/conf.d
[root@nginx-kafka01 conf.d]# ls
sc.conf
[root@nginx-kafka01 conf.d]# cat sc.conf
server {
listen 80 default_server;
server_name www.sc.com;
root /usr/share/nginx/html;
access_log /var/log/nginx/sc/access.log main;
location / {
}
}
[root@nginx-kafka01 conf.d]#
当客户端以域名来访问这个网站时,通过端口为80访问,访问此虚拟主机,default_server的作用是当客户端以ip来访问网站时,default_server会默认访问这个网站的内容。
注:nginx做web网站只能支持静态网页展示,基于HTTP协议(超文本传输协议)
(3) 语法检测
root@nginx-kafka01 html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: [emerg] open() "/var/log/nginx/sc/access.log" failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed
[root@nginx-kafka01 html]# mkdir /var/log/nginx/sc
[root@nginx-kafka01 html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
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 https://mirrors.bfsu.edu.cn/apache/kafka/2.8.1/kafka_2.12-2.8.1.tgz 解包: 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 https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
(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)
-
查看是否启动成功
[root@nginx-kafka03 apache-zookeeper-3.6.3-bin]# bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.6.3-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
至少的有一个leader
(2) 启动kafka
bin/kafka-server-start.sh -daemon config/server.properties
(3)连接zookeeper,及其使用
zookeeper目录下执行 bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 4] get /brokers/ids/0
{"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://nginx-kafka02:9092"],"jmx_port":9999,"features":{},"host":"nginx-kafka02","timestamp":"1642300427923","port":9092,"version":5}
[zk: localhost:2181(CONNECTED) 5] ls /brokers/ids/0
[]
[zk: localhost:2181(CONNECTED) 6] get /brokers/ids/0
{"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。不过作者是一个人,加入 Free and Open Search: The Creators of Elasticsearch, ELK & Kibana | Elastic公司以后,因为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 https://packages.elastic.co/GPG-KEY-elasticsearch
2、编辑/etc/yum.repos.d/fb.repo文件
elastic-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
3、yum安装
`yum install filebeat -y`
rpm -qa |grep filebeat #可以查看filebeat有没有安装 rpm -qa 是查看机器上安装的所有软件包 rpm -ql filebeat 查看filebeat安装到哪里去了,牵扯的文件有哪些
4、设置开机自启
systemctl enable filebeat
`{
"filebeat.inputs": [
{ "type":"log",
"enabled":true,
"paths":["/var/log/nginx/sc_access"
},
],
}`
2、修改配置
修改配置文件/etc/filebeat/filebeat.yml `filebeat.inputs:
`filebeat.inputs:
- type: log
Change to true to enable this input configuration.
enabled: true
Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/nginx/sc/access.log
#==========------------------------------kafka-----------------------------------
output.kafka:
hosts: ["192.168.8.137:9092","192.168.8.135","192.168.8.140:9092"]
topic: nginxlog
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