kafka配置:
server.properties:
1. broker.id = 0 每台机器配置唯一的broker id
2. zookeeper配置
启动服务:
1.启动 zookeeper 集群
2. 启动 kafka
bin/kafka-server-start.sh config/server.properties
创建topic
bin/kafka-topics.sh --create --zookeeper master:2181,slave1:2181,slave2:2181 \
--replication-factor 1 --partitions 1 --topic test
主要配置副本数 分区 与主题
发送消息:
producer 向broker推送消息,broker (Leader)会选择一个partition存储,也会放副本
leader 选举是由kafka 中 zookeeper 服务选出的。
producer 发送方式有两种: 同步(默认), 异步
在Producer配置文件中:
producer.type 配置同步/异步
request.required.asks设置确认消息属性
ack:
0 不确认
1 leader 确认
-1 leader 和follower都确认
如何确保producer发送的消息不丢失,确保消息不重复:
producer 同步发送选择 -1消息确认模式,--确保消息不会丢失.
异步,只要配置无限阻塞,防止队列满了.--确保消息不会丢失.
针对消息重复:将消息的唯一标识保存到外部介质中,每次消费时判断是否处理过即可
Kafka 分配 Replica 的算法如下:
1. 将所有 broker(假设共 n 个 broker)和待分配的 partition 排序
2. 将第 i 个 partition 分配到第(i mod n)个 broker 上
3. 将第 i 个 partition 的第 j 个 replica 分配到第((i + j) mode n)个 broker上
.
kafka python编程(topic由命令行创建):
Producer :
from kafka import KafkaProducer,KafkaConsumer
import json
ka = KafkaProducer(bootstrap_servers='master:9092')
data = {"a":1}
msg = json.dumps(data)
ka.send("jpb", msg)
send当中也可以指定分区
Consumer:
con=KafkaConsumer("jpb",bootstrap_servers=["master:9092"],group_id="123456789")
for msg in con:
print msg
group_id 是表示同一个group_id没有共享消息的权限,比如两个Consumer,groud_id一样的,如果一个Consumer 接收到Producer的消息,另一是接收不到的.
KafkaConsumer 第一个参数可以是 topic list
KafkaConsumer 中参数很多其中就有auto_offset_reset, enable_auto_commit
auto_offset_reset (str):
A policy for resetting offsets on OffsetOutOfRange errors: 'earliest' will move to the oldest available message, 'latest' will move to the most recent. Any other value will raise the exception. Default: 'latest'.
就是说当offset越界时, earliest : 将offset设置为最早的信息, latest: 将offset设置为最新的信息,其它的值出现越界将抛出异常
enable_auto_commit (bool): 就是说consumer 会将自己的offset定期提交给kafka。默认是True
If True , the consumer's offset will be periodically committed in the background. Default: True