目录
10.1.2 编辑/etc/yum.repos.d/fb.repo文件
1、准备好3台虚拟机搭建nginx和kafka集群
2、配置好静态ip地址
服务:NetworkManager 或者 network 只运行一个
systemctl管理的服务器,配置文件在/usr/lib/systemd/system下,以service结尾的配置文件
配置好DNS 用于域名解析
/etc/resolv.conf 要先写入这个文件才可以进行解析,配置本地域名服务器
[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 114.114.114.114
DNS解析:
- 浏览器的缓存
- 本地hosts文件 -- Linux(/etc/hosts)
- 找本地域名服务器 -- Linux(/etc/resolv.conf)
3、修改主机名
vim /etc/hosthname
hostname -F /etc/hostname
或者
hostnamectl set-hostname nginx-kafka03
4、每一台机器上都写好域名解析
一个ip地址可以写多个域名
vim /etc/hosts
192.168.0.94 nginx-kafka01
192.168.0.95 nginx-kafka02
192.168.0.96 nginx-kafka03
5、安装基本软件
yum install wget lsof vim -y
6、安装时间同步服务
yum -y install chrony
systemctl enable chronyd 设置开机自启,disable关闭开机自启
systemctl start chronyd
设置时区: cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
(此步骤在配置虚拟机已经设置的话可以跳过)
7、关闭防火墙
[root@nginx-kafka01 ~]# systemctl stop firewalld
[root@nginx-kafka01 ~]# systemctl disable firewalld
关闭selinux:
vim /etc/selinux/config
SELINUX=disabled
selinux关闭 需要重启机器
[root@nginx-kafka01 ~]# getenforce
Disabled
selinux是Linux系统内核里一个跟安全相关的子系统,规则非常繁琐,一般日常工作里都是关闭的
8、nginx搭建
搜狗只是展示了一个文本,网页是浏览器展示的
这个nginx web服务是为了测试只是提供一个静态页面
8.1 安装好epel源
yum install epel-release -y
yum install nginx -y
启动:systemctl start nginx
设置开机自启: systemctl enable nginx
8.2 编辑配置文件
[root@nginx-kafka01 ~]# cd /etc/nginx/
[root@nginx-kafka01 nginx]# ls
conf.d fastcgi.conf.default koi-utf mime.types.default scgi_params uwsgi_params.default
default.d fastcgi_params koi-win nginx.conf scgi_params.default win-utf
fastcgi.conf fastcgi_params.default mime.types nginx.conf.default uwsgi_params
主配置文件:nginx.conf
... #全局块
events { #events块
事件块 可以有多少个连接
...
}
http #http块
{
... #http全局块 默认块 对所有的网站都生效
include /etc/nginx/conf.d/*.conf; 要添加一个网站的话去这个目录里更改就好,以.conf结尾就会自动加载
server #server块 可以有多个,一个网站一个server
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
- 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等
- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网络连接,开启多个网络连接序列化等。
- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数
- server块:配置虚拟主机的相关参数,一个http中可以有多个server
- location块:配置请求的路由,以及各种页面的处理情况
(1)配置文件修改
vim nginx.conf
将
listen 80 default_server;
修改成:
listen 80;
(2)虚拟主机的配置
vim /etc/nginx/conf.d/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 / {
}
}
8. 3 语法检测
[root@nginx-kafka01 /]# cd /usr/share/nginx/html 这个地址就是server里配的root地址
[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
开启nginx服务 systemctl start nginx
检查nginx是否启动 ps -ef|grep nginx
# 重新加载nginx nginx -s reload
8.4 查看nginx的状态
systemctl status nginx
nginx做web网站的话,只能支持静态网页展示 -- html
9、kafka配置
9.1 安装
放在/opt目录下!!!
(1)安装java:yum install java wget -y
(2)安装kafka:
wget https://mirrors.bfsu.edu.cn/apache/kafka/2.8.1/kafka_2.12-2.8.1.tgz
(3)解压:
tar xf kafka_2.12-2.8.1.tgz
使用自带的zookeeper集群配置
(4)安装zookeeper:
wget https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
(5)解压
👀注:新的版本的kafka是可以自己管理配置的,我们要的2.12版本还是要靠zookeeper管理,所以要安装zookeeper
看日志 -- logs
看二进制文件 -- bin
看配置 -- conf
9.2 配置kafka
vim /config /server.properties
broker.id=0
listeners=PLAINTEXT://nginx-kafka01:9092
zookeeper.connect=192.168.136.141:2181,192.168.136.132:2181,192.168.136.147:2181
放三个是为了防止有一个连不上的时候可以连下一个
也可以是
zookeeper.connect=192.168.0.94/kafka1,192.168.0.95/kafka1,192.168.0.96/kafka1
表示把东西都放到了kafka1
要是再有一个集群,就可以放到kafka2
9.3 配置zookeeper (每台机器都需要)
cd /opt/apache-zookeeper-3.6.3-bin/confs
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
添加如下三行:
server.1=192.168.136.141:3888:4888
server.2=192.168.136.132:3888:4888
server.3=192.168.136.147:3888:4888
3888和4888都是端口 一个用于数据传输,一个用于检验存活性和选举
在每台机器上
mkdir /tmp/zookeeper
echo 1 > /tmp/zookeeper/myid
这个1 2 3是本机指定的zookeeper id内容
192.168.136.141 1
192.168.136.132 2
192.168.136.147 3
9.4 启动zookeeper
/opt/ape
bin/zkServer.sh start
开启zk和kafka的时候,一定是先启动zk,再启动kafka
关闭服务的时候,kafka先关闭,再关闭zk
9.5 查看zookeeper是否启动
[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 follower 表明已经启动
zookeeper使用方法
/opt/ape/bin
./zkCli.sh 进入zookeeper
zookeeper只有绝对路径没有相对路径
9.6 启动kafka
/opt/kafka
bin/kafka-server-start.sh -daemon config/server.properties
9.7 测试
创建topic
bin/kafka-topics.sh --create --zookeeper 192.168.136.141:2181 --replication-factor 3 --partitions 3 --topic sc
这个主题信息会保存在zookeeper上,不放在kafka上了
查看topic
bin/kafka-topics.sh --list --zookeeper 192.168.136.141:2181
创建生产者
[root@localhost kafka_2.12-2.8.0]# bin/kafka-console-producer.sh --broker-list 192.168.0.94:9092 --topic sc
创建消费者
[root@localhost kafka_2.12-2.8.0]# bin/kafka-console-consumer.sh --bootstrap-server 192.168.136.141:9092 --topic sc --from-beginning
如果出现了生产的数据,就表示成功了
from beginning 表示每次都从头开始
9.8 kafka的日志可以按照两个维度来设置清除
1、按时间 7天
2、按大小
这两个维度可以到kafka的配置文件下更改
任意一个按时间或者按大小的条件满足,都可以触发日志清理
kafka日志保存时按段保存的,segment
保存在不同的段里就是方便清理,如果全都在一个段里,就不好清理
假设有如下segment
00.log 11.log 22.log
- 00.log保存的是第一条到11条的日志
- 11.log保存的是第12条到第22条的日志
- 22.log保存的是第22条之后的日志
10、filebeat部署
filebeat:轻量级日志采集器 /var/log/*.log
10.1 安装
10.1.1
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
10.1.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
10.1.3 yum安装
yum install filebeat -y
rpm -qa |grep filebeat 查看filebeat有没有安装
rpm -qa 是查看机器上安装的所有软件包
rpm -ql filebeat 查看filebeat安装到哪里去了,牵扯的文件有哪些
10.1.4 设置开机自启
systemctl enable filebeatf
非开机自启就是 disable
10.2 配置
修改配置文件/etc/filebeat/filebeat.yml
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.136.141:9092","192.168.136.132:9092","192.168.136.147:9092"]
topic: nginxlog
keep_alive: 10s
格式一定要正确!!!注意缩进以及paths路径!!!
filebeat只要吐一次就行
output只能有一个
路径一定要正确 ,不然可能收不到日志
谁是leader 谁是follower都是保存在zookeeper里
创建主题nginxlog
bin/kafka-topics.sh --create --zookeeper 192.168.136.141:2181 --replication-factor 3 --partitions 1 --topic nginxlog
启动服务
systemctl start filebeat
查看是否启动
ps -ef |grep filebeat
创建消费者
bin/kafka-console-consumer.sh --bootstrap-server 192.168.136.141:9092 --topic nginxlog --from-beginning
如果能获取到日志数据,就说明连接成功了
filebeat数据文件
[root@nginx-kafka01 filebeat]# pwd
/var/lib/filebeat/registry/filebeat
[root@nginx-kafka01 filebeat]# less log.json
log.json有记录,表明数据已经发送出去了
11、数据入库
11.1 需求分析
需要nginx日志的ip,时间,带宽字段
将ip字段解析成相应的省份、运营商
存入数据库的字段: id, 时间, 省份, 运营商, 带宽
11.2 步骤
1、创建数据库
2、编写python脚本,从kafka获取nginx日志
3、获取好的nginx日志,提取出ip、时间、带宽字段
4、提取出的ip字段通过淘宝一个接口解析出省份和运营商
url = "https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip=114.114.114.114"
5、格式化时间字段 "2021-10-12 12:00:00"
6、存入数据库
import json
import requests
import time
import pymysql
taobao_url = "https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip="
#查询ip地址的信息(省份和运营商isp),通过taobao网的接口
def resolv_ip(ip):
response = requests.get(taobao_url+ip)
if response.status_code == 200:
tmp_dict = json.loads(response.text)
prov = tmp_dict["data"]["region"]
isp = tmp_dict["data"]["isp"]
return prov,isp
return None,None
#将日志里读取的格式转换为我们指定的格式
def trans_time(init_time):
#把字符串转成时间格式
timeArray = time.strptime(init_time, "%d/%b/%Y:%H:%M:%S")
#timeStamp = int(time.mktime(timeArray))
#把时间格式转成字符串
new_time = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
return new_time
#从kafka里获取数据,清洗为我们需要的ip,时间,带宽
from pykafka import KafkaClient
client = KafkaClient(hosts="192.168.136.141:9092,192.168.136.132:9092,192.168.136.147:9092")
topic = client.topics['nginxlog']
balanced_consumer = topic.get_balanced_consumer(
consumer_group='testgroup',
# 自动提交offset,一般来说是五秒钟提交一次,不是实时更新的
auto_commit_enable=True,
zookeeper_connect='nginx-kafka01:2181,nginx-kafka02:2181,nginx-kafka03:2181'
)
#consumer = topic.get_simple_consumer()
# 创建数据库连接
db = pymysql.connect(
host="192.168.136.148",
user="sc",
passwd="123456",
database="nginxlog"
)
# 创建要给游标对象,保留中间结果
cursor=db.cursor()
for message in balanced_consumer:
if message is not None:
try: #如果数据出现错误,就跳过这条日志
# 如果能消费到数据,都是放在message.value里
line = json.loads(message.value.decode("utf-8"))
log = line["message"]
tmp_lst = log.split()
ip = tmp_lst[0]
init_time = tmp_lst[3].replace("[","")
bt = tmp_lst[9]
dt = trans_time(init_time)
prov, isp = resolv_ip(ip)
if prov and isp:
print(dt,prov,isp,bt)
try:
cursor.execute('insert into kafka_nginxlog(time,province,operater,BW) values("%s", "%s", "%s", "%s")' %(dt,prov,isp,bt))
db.commit()
print("数据写入成功")
except Exception as err:
print("数据写入失败",err)
db.rollback()
except:
pass
db.close()