1、kafka 和 redis 有什么区别?
- 订阅机制不一样
- redis是一个基于内存的kv数据库,而kafka是分布式发布订阅消息系统。两者本身不是同样一个层次的东西。
- redis中有一个queue的数据类型,用来做发布/订阅系统,这个就可以和kafka进行比较了哈。
- 存储介质不同
- redis queue数据是存储在内存,虽然有AOF和RDB的持久化方式,但是还是以内存为主。
- kafka是存储在硬盘上
- 性能不同
- 因为存储介质不同,理论上redis queue的性能要优于kafka,但是在实际使用过程,这块体验并不是很明显,通常只有一些高并发场景下需要用redis queue,比如发红包,可以先将红包预先拆解然后push到redis queue,在抢的一瞬间可以很好的支撑并发。
- 成本不同
- kafka存储在硬盘上,成本会比内存小很多,具体差1,2个数量级是有,在数据量非常大的情况下,使用kafka能够节省蛮多服务器成本。最常见的有应用产生的日志,这些日志产生的量级一般都很大,如果有需要进行处理,可以使用kafka队列。
- 消息可靠性不同
- redis存储在内存中,一旦服务异常或者宕机,数据就会丢失。相对来说kafka存储在硬盘更加安全。
- 订阅机制
- 这边也是比较重点,订阅机制主要有两点不同:
- kafka消费了之后,可以重新消费。redis消费(lpop)了数据之后,数据就从队列里消失了。kafka里面是偏移量(offset)的概念,可以设置到前面重新消费。
- redis只支持单一的消费者,只有topic模式。kafka不光有topic,还支持group分组模式,可以有多个消费组,消费同一个topic的消息。比如应用产生的行为日志,走kafka就很合适,大数据部门可以消费做数据分析,开发部门可以消费做后续的业务逻辑。
- 加上kafka或者redis的作用,是防止elk宕机时,应用正在产生的日志丢失。
- 总结
- 订阅机制不同,存储介质不同,性能不同,成本不同,消息可靠性不同
zookeeper+kafka 架构图
redis 架构图
2、环境说明
服务器IP | 安装程序 | 服务名 | 要求 |
10.22.86.200 | Logstash+Elasticsearch+Kibana | elk | 4G内存以上 |
10.22.86.51 | filebeat+zookeeper+kafka | kafka51 | 2G内存以上 |
10.22.86.52 | ffilebeat+zookeeper+kafka | kafka52 | 2G内存以上 |
3、初始化环境
## kafka51 主机
[root@kafka51 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.22.86.51 kafka51
10.22.86.52 kafka52
## kafka52 主机
[root@kafka52 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.22.86.51 kafka51
10.22.86.52 kafka52
4、java安装
三台机器都需要安装java环境
## 上传软件包到/data/soft
[root@kafka51 ~]# mkdir -p /data/soft
[root@kafka51 ~]# mkdir -p /usr/local
[root@kafka51 soft]# cd /data/soft
[root@kafka51 soft]# tar -zxvf jdk-8u271-linux-x64.tar.gz -C /usr/local/
## 配置环境变量
[root@kafka51 soft]# vim /etc/profile
# java
export JAVA_HOME=/usr/local/jdk1.8.0_271
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
## 使环境变量生效
[root@kafka51 soft]# source /etc/profile
## 查看版本验证是否安装
java -version
5、安装 zookeeper
[root@kafka51 soft]# cd /data/soft
[root@kafka51 soft]# tar -xzvf apache-zookeeper-3.8.0-bin.tar.gz -C /opt/
[root@kafka51 soft]# cd /opt/apache-zookeeper-3.8.0-bin/conf
[root@kafka51 conf]# pwd
/opt/apache-zookeeper-3.8.0-bin/conf
## 生成 myid,不同机器的 myid 不同
[root@kafka51 conf]# mkdir -p /data/zookeeper
## kafka51
[root@kafka51 conf]# echo "1" > /data/zookeeper/myid
## kafka52
[root@kafka52 conf]# echo "2" > /data/zookeeper/myid
## 创建 zoo.cfg 文件,kafka51
[root@kafka51 conf]# cat zoo.cfg | grep -v '#\|^$'
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
server.1=10.22.86.51:2888:3888
server.2=10.22.86.52:2888:3888
## 创建 zoo.cfg 文件,kafka52
[root@kafka52 conf]# cat zoo.cfg | grep -v '#\|^$'
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
server.1=10.22.86.51:2888:3888
server.2=10.22.86.52:2888:3888
6、启动 zookeerper
## 启动
/opt/apache-zookeeper-3.8.0-bin/bin/zkServer.sh start
## 查询状态
/opt/apache-zookeeper-3.8.0-bin/bin/zkServer.sh status
7、测试 zookeerper
- 在其中一台机器创建频道,在另一台机器测试是否可以收到
## 创建频道
[root@kafka51 conf]# /opt/apache-zookeeper-3.8.0-bin/bin/zkCli.sh -server 10.22.86.51:2181
create /test "hello world"
## 接受频道信息
[root@kafka52 conf]# /opt/apache-zookeeper-3.8.0-bin/bin/zkCli.sh -server 10.22.86.52:2181
get /test
## 若显示 hello world ,说明安装成功
8、安装 kafka
[root@kafka51 soft]# cd /data/soft
[root@kafka51 soft]# tar -xzvf kafka_2.12-3.1.0.tgz -C /opt/
[root@kafka51 soft]# ln -s /opt/kafka_2.12-3.1.0/ /opt/kafka
[root@kafka51 soft]# mkdir /opt/kafka/logs
## kafka1 配置文件
[root@kafka51 soft]# cd /opt/kafka/config
[root@kafka51 config]# cat server.properties | grep -v '#\|^$'
broker.id=1
listeners=PLAINTEXT://10.22.86.51:9092
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/logs
num.partitions=1
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
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=10.22.86.51:2181,10.22.86.52:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
auto.create.topics.enable = true
delete.topic.enable=true
## kafka2 配置文件
[root@kafka52 config]# cat server.properties | grep -v '#\|^$'
broker.id=2
listeners=PLAINTEXT://10.22.86.52:9092
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/logs
num.partitions=1
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
log.segment.bytes=1073741824
log.retention.check.interval.ms=300000
zookeeper.connect=10.22.86.51:2181,10.22.86.52:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
delete.topic.enable=true
auto.create.topics.enable = true
9、启动 kafka
## 前台启动
/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/server.properties
## 后台启动
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties
## 关闭服务
/opt/kafka/bin/kafka-server-stop.sh /opt/kafka/config/server.properties
10、kafka 经常使用的命令
## 每个节点查看 jps
## kafka51
[root@kafka51 config]# jps
12647 Jps
8235 QuorumPeerMain
5612 Kafka
## kafka52
[root@kafka52 ~]# jps
8240 QuorumPeerMain
108454 Jps
88714 Kafka
## 创建topic
/opt/kafka/bin/kafka-topics.sh --create --bootstrap-server 10.22.86.51:9092,10.22.86.52:9092 --replication-factor 2 --partitions 1 --topic filebeat1
## 获取topic id
/opt/kafka/bin/kafka-topics.sh --bootstrap-server 10.22.86.51:9092,10.22.86.52:9092 --describe --topic filebeat1
## 查询所有频道
/opt/kafka/bin/kafka-topics.sh --bootstrap-server 10.22.86.51:9092,10.22.86.52:9092 --list
## 删除topic
/opt/kafka/bin/kafka-topics.sh --delete --bootstrap-server 10.22.86.51:9092,10.22.86.52:9092 --topic filebeat1
## 节点接受消息查询
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server 10.22.86.51:9092,10.22.86.52:9092 --topic filebeat1 --from-beginning
## 查询消费组
/opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 10.22.86.51:9092,10.22.86.52:9092 --list
## 查询消费组 组员
/opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 10.22.86.51:9092,10.22.86.52:9092 --describe --group filebeat
## 删除消费组
/opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 10.22.86.51:9092,10.22.86.52:9092 --delete --group filebeat
11、Elk + filebeat 安装
12、logstash 配置文件
input {
kafka {
bootstrap_servers => ["10.22.86.51:9092,10.22.86.52:9092"]
topics => ["filebeat1"]
group_id => "filebeat1"
client_id => "filebeat1"
codec => "json"
}
}
filter {
mutate {
convert => ["upstream_time","float"]
convert => ["request_time","float"]
}
}
output {
stdout {}
if [type] == "test-log"{
elasticsearch {
hosts => ["10.22.86.200:9200"]
index => "test-log-%{+YYYY.MM.dd}"
}
}
}
13、filebeat 配置文件
## kafka51
filebeat.inputs:
- type: log
backoff: "1s"
enabled: true
paths:
- /data/test/test.log
fields:
type: test-log
fields_under_root: true
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
setup.kibana:
output.kafka:
enabled: true
hosts: ["10.22.86.52:9092","10.22.86.51:9092"]
topic: 'filebeat1'
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
## kafka52
filebeat.inputs:
- type: log
backoff: "1s"
enabled: true
paths:
- /data/test/test.log
fields:
type: test-log
fields_under_root: true
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
setup.kibana:
output.kafka:
enabled: true
hosts: ["10.22.86.52:9092","10.22.86.51:9092"]
topic: 'filebeat1'
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
14、结果查看
15、附录
#/bin/bash
i=0
while true;
do
let i=i+1
echo `date "+%Y-%m-%d %H:%M:%S"` $i >> /data/test/test.log
echo $i
sleep 2
done