一.关于Kafka
Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用。目前越来越多的开源分布式处理系统如Storm,Spark,Flink都支持与Kafka集成。现在我们的消息推送模块也使用到了kafka。现在它已被多家不同类型的公司作为多种类型的数据管道和消息系统使用。
二.为什么要使用kafka
1.解耦
在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
2.冗余
有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。
3.扩展性
因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。
4.灵活性 & 峰值处理能力
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
5.数据一致性和可靠性
Kafka的分区多副本是Kafka可靠性的核心保证,把消息写入到多个副本可以使Kafka在崩溃时保证消息的持久性及可靠性。
三.zookeeper扮演什么角色
kafka依赖于zookeeper,zookeeper就是它的大管家。
1. 存储kafka的各种元数据
* Broker服务器列表记录
* Topic注册信息
* 消费者注册信息
* 消费进度Offset 记录
* 分区与消费者 的关系
2. 生产者与消费者负载均衡
四.zookeeper安装
1. 下载地址
链接: [link](https://mirrors.cnnic.cn/apache/zookeeper/).
2.压缩包放到指定目录解压
命令: tar -zvxf zookeeper-3.4.14.tar.gz
3.复制zoo_sample.cfg文件到zoo.cfg(zookeeper配置文件)
命令:cp zoo_sample.cfg zoo.cfg
4.修改zoo.cfg配置
日志数据输出位置: dataDir = XXX
zookeeper集群配置:
server.1=ip:2888:3888
server.2=ip:2888:3888
server.3=ip:2888:3888
5.dataDir目录下创建myid文件
myid存放的id值就是服务器编号,对应上面的1,2,3
ZooKeeper在启动时会读取 myid文件 中的值与 zoo.cfg文件中的配置信息进行比较, 以确定是哪台服务器。
6.配置环境变量
编辑~/.bash_profile文件
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=/usr/local/java8/bin:$PATH:$HOME/bin
export PATH
通过source使更改生效。
source ~/.bash_profile
7.启动zookeeper
进入bin目录,命令:zkServer.sh start
五.kafka安装下载
1. 下载地址
链接: [link](1.http://kafka.apache.org/downloads).
2.解压安装
3.修改配置
进入config/server.properties
broker.id=l #指定代理的 id
log.dirs=/opt/data/kafka- logs #指定 Log 存储路径
zookeeper.connect=ip:2181 , ip:2181 , ip:2181
listeners=PLAINTEXT://:9092
advertised.host.name = ip(主机ip)
host.name=localhost
4.进入bin目录启动kafka
后台启动:kafka-server-start.sh -daemon …/config/server.properties
直接启动:kafka-server-start.sh …/config/server.properties
查看启动是否成功: jps
此时有如下进程正在运行
15976 Jps
14999 QuorumPeerMain
15906 Kafka
六.kafka基本命令
1.创建一个拥有3个副本,1个分区,名称为test的topic
例:
kafka-topics.sh --create --zookeeper ip:2181 --replication-factor 3 --partitions 1 --topic test
2. 查看所有topic
kafka-topics.sh --list --zookeeper ip:2181
3.查看topic节点信息
kafka-topics.sh --list --zookeeper ip:2181
4.向topic发送信息
kafka-console-producer.sh --broker-list ip:9092 --topic test
5.消费topic信息
kafka-console-consumer.sh --bootstrap-server ip:9092 --from-beginning --topic test
七.注意事项
1.信息大小设置
produce端: max.request.size = 5242880(5m)
Broker 端: message.max.bytes = 6291456(6m)
Consumer端: fetch.max.bytes = 7340032(7m)
max.request.size < message.max.bytes < fetch.max.bytes
2.内存大小
Kafka默认启动内存为1g
3.消息故障
kafka并没有提供故障处理机制,需要我们自己在应用层提供和实现消息重试机制
消息处理存在两种可能的故障:
1)瞬时故障——故障产生是由于临时问题导致,比如网络连接,CPU负载,或者服务崩溃。我们可以通过一遍又一遍的尝试来减轻这种故障。
2)持久故障——故障产生是由于永久的问题导致的,并且这种问题不能通过额外的重试来解决。比如常见的原因有软件bug或者无效的消息格式(例如,损坏(poison)的消息)。
由于kafka自身机制,Kafka按照顺序处理相同主题分区的所有消息。如果消费者阻塞在重试一个消息上,那么底部分区的消息就不会被处理。
解决方法:
把失败的消息提交到一个“重试主题”,并且从那个主题中处理重试;
缺点:
丢失消息的顺序。