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 架构图

zookeeper redis 集群 zookeeper kafka redis_zookeeper

redis 架构图

zookeeper redis 集群 zookeeper kafka redis_zookeeper redis 集群_02

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、结果查看

zookeeper redis 集群 zookeeper kafka redis_redis_03

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