1. Introduction
- 
ack:在消息被认为成功写入前需确认(acknowledge)接收消息的broker的数量; 
- 
使用min.insync.replicas和此生产者配置(如acks=all); 
- 
生产者只向分区的当前leader broker写入数据,生产者还必须确认acks的级别, 
 以指定在将消息视为成功写入之前,是否必须将消息写入最小数量的副本;
2. Ack Setting
- 
kafka ≥ 3.0,acks = all,否则acks = 1; 
2.1. Ack0
 
- 
当acks = 0,生产者在发送消息的那一刻就认为消息 
 "written successfully",而根本无需等待broker接受它;
- 
若brokeroffline或发生异常,我们将不知道,并将丢失数据; 
- 
这对可能potentially丢失消息的数据(如metric collection)很有用, 
 且因网络开销overhead最小化,故可产生高吞吐produce highest throughput设置;
2.2. Ack1
 
- 
当acks = 1时,当消息仅由leader确认时,生产者会将消息视为"written successfully"; 
- 
请求leader响应(request leader response),但不能保证guarantee复制replication; 
- 
因它发生在后台,若没收到(receive)ack,生产者可重试请求; 
- 
若leader broker offline,但副本replica尚未复制replicate数据,则数据丢失; 
2.3. AckAll
 
- 
当acks = all时,当消息被所有ISR接受时,生产者将消息视为"written successfully"; 
| 
 | 
| 
 | 
| 
 | 
3. Topic Durability Availability
 
- 
主题复制因子topic replication factor为3,主题数据的 
 持久性durability可承受(withstand)2个broker的损失(loss);
- 
一般对与N个复制因子,可永久丢失(N - 1)个broker,且仍可恢复数据; 
- 
可用性availability稍微复杂,此处先假定复制因子为3; 
- 
读取Read:只要一个分区已启动(up)并被视为ISR,该主题就可读取; 
- 
写Write:当acks=0且acks=1,只要一个分区已启动,并被视为ISR, 
 该主题就可写入,当acks=all时,情况相对复杂:
| Entry | Memo | 
|---|---|
| min.insync.replicas=1 | 默认,主题必须至少有一个分区作为ISR(含reader), | 
| min.insync.replicas=2 | 主题必须至少有2个ISR启动,那最多可容忍一个broker down(在复制因子 | 
| min.insync.replicas=3 | 复制因子为3,没多大意义,不能容忍任何broker宕机; | 
| Summary | 总之,当acks=all带有replication.factor=N和min.insync.replicas=M时, | 
| 
 | 
4. Overriding Topic Config
- 
可使用kafka-configs.sh更改主题配置min.insync.replicas, 
- 
此配置在broker级别默认为1,此配置的典型值(replication factor - 1); 
 即当复制因子为3时,min.insync.replicas应为2;
- 
创建3个分区,复制因子为1,名为topic-config的主题: 
./kafka-topics.sh --bootstrap-server 192.168.0.123:9092 \
	--topic topic-config --create \
	--partitions 3 --replication-factor 1- 
描述(describe)主题以检查是否为此主题已设置任何配置覆盖(override); 
./kafka-topics.sh --bootstrap-server 192.168.0.123:9092 \
	--describe --topic topic-config- 
将主题topic-config配置min.insync.replicas为2: 
./kafka-configs.sh --bootstrap-server 192.168.0.123:9092 \
	--alter --entity-type topics --entity-name topic-config \
	--add-config min.insync.replicas=2- 
重新描述(describe)主题以检查是否为此主题已设置任何配置覆盖(override); 
./kafka-topics.sh --bootstrap-server 192.168.0.123:9092 \
	--describe --topic topic-config- 
现在可看到主题配置有属性:Configs: min.insync.replicas=2; 
- 
可通过—delete-config替换—add-config来删除属性; 
./kafka-configs.sh --bootstrap-server 192.168.0.123:9092 \
	--alter --entity-type topics --entity-name topic-config \
	--delete-config min.insync.replicas- 
再次描述(describe)主题以检查是否为此主题已设置任何配置覆盖(override); 
./kafka-topics.sh --bootstrap-server 192.168.0.123:9092 \
	--describe --topic topic-config5. min.insync.replicas
5.1. Via Config File
- 
此配置的默认值为1,但这可在broker级别进行更改; 
- 
打开broker配置,并在文件末尾追加如下内容: 
# config/server.properties
min.insync.replicas = 2- 
与kafka-configs.sh不同,kafka-configs.sh可在运行时修改, 
 而通过配置文件方式修改则需重新启动broker;
5.2. Dynamic Config
- 
通过kafka-configs.sh动态更改broker配置,而无需重启broker; 
./kafka-configs.sh --bootstrap-server 192.168.0.123:9092 \
	--alter --entity-type brokers --entity-default \
	--add-config min.insync.replicas=2- 
描述broker动态更新配置: 
./kafka-configs.sh --bootstrap-server 192.168.0.123:9092 \
	--describe --entity-type brokers --entity-default
Default configs for brokers in the cluster are:
  min.insync.replicas=2 sensitive=false
  	synonyms={DYNAMIC_DEFAULT_BROKER_CONFIG:min.insync.replicas=2}- 
删除动态配置: 
./kafka-configs.sh --bootstrap-server 192.168.0.123:9092 \
	--alter --entity-type brokers --entity-default \
	--delete-config min.insync.replicas- 
描述broker动态更新配置: 
./kafka-configs.sh --bootstrap-server 192.168.0.123:9092 \
	--describe --entity-type brokers --entity-default