kafka实战读书笔记
1、katka_2.12-l.0.0.tgz
上面两个文件中的 2.11 /2.12 分别表示编译 Kafka 的 Scala 语言版本,后面的 1.0 .0 是 Kafka的版本 。
2、kafka的好多脚本,如kafka-console-producer.sh 如果不加任何参数直接运行它们,则会打印它们各自的使用帮助文档
3、Kafka 的消息是用二进制方式来保存的,但依然是结构化的消息 。
4、最常见的两种消息引擎范型是消息队列模型和发布/订阅模型
消息队列模型:一旦消息被消费( consumed ),就会从队列中移除该消息 。 每条消息由一个发送者生产 出来,且只被一个消费者( consumer)处理一一发送者和消费
者之间是一对一的关系 。
5、吞吐量/延时 是一对矛盾体
6、kafka只是把数据写入到操作系统的页缓存( page cache )中,然后由操作系统自行决定什么时候把页缓存中的数据写回磁盘上
7、事实上普通 SAS 磁盘随机读/写的吞吐量的确是很慢的,但是磁盘的顺序读/写操作其实是非常快的
8、只能在日志文件末尾追加写入新的消息,且不允许修改己写入的消息,因此kafka属于典型的磁盘顺序访问型操作
9、Kafka 在读取消息时会首先尝试从 OS的页缓存中读取,如果命中便把消息经页缓存直接发送到网络的 Socket 上
10、
11、每台 Kafka 服务器上的状态统一交由 ZooKeeper 保管 。 Kafka 服务器上并不是所有状态都不保存,它只保存了很轻量级的内部状态
12、Kafka 服务器有一个官方名字: broker
13、Key:消息键,对消息做 partition 时使用,即决定消息被保存在某 topic 下的哪个 partition。
14、follower replica 是不能提供服务给客户端的,也就是说不负 责响应客户端发来的消息写入和消息消费请求。
15、Kafka 保证同 一个 partition 的多个 replica 一定不会分配在同一台 broker 上
16、ISR 的全称是 in-sync replica,翻译过来就是与 leader replica 保持同步的 replica 集合 。因为各种各样的原因,一小部分 replica 开始落后于 leader replica 的进度 。
当滞后 到 一定程度 时, Kafka 会将这些 replica “踢”出 ISR 。replica 重新“追上”了 leader 的进度时 , 那么 Kafka 会将它们加 回到 ISR 中
17、Kafka 的服务器端代码是由 Scala 语言编写的,而新版本客户端代码是由 Java语言编写的
18、因为 Kafka 是顺序写磁盘的,而磁盘顺序 VO 的性能,即使机械硬盘也是不弱的一一顺序 1/0 不需要频繁地移动磁头,因而节省了耗时的寻道时间
19、推荐用户为每个 broker 都配置多个日志路径,每个路径都独立挂载在不同的磁盘上,这使得多块物理磁盘磁头同时执行物理 I/O 写操作,可以极大地加速 Kafka 消息生产的速度。
20、磁盘容量计算
21、假设单个日志段文件大小设置为 lOGB,那么你至少应该给予 page cache 1OGB 以上的内存空间 。这样,待消费的消息有很大概率会保存在页缓存中
22、内存规划
23、Kafka 不属于计算密 集型( CPU-bound )的系统,因此对于 CPU 需要记住一点就可以了:追求多核而非高时钟频率。
Kafka 的机器有 16 个 CPU 核这件事情比该机器 CPU 时钟高达 4GHz 更加重要,因为 Kafka 可能无法充分利用这 4GHz 的频率,但几乎肯定会用满 16 个 CPU 核。
24、宽主要也有两种: lGb/s 和 lOGb/s,即平时所说的千兆位网络和万兆位网络
25、根据业务量和带宽计算需要几台broker
26、单节点伪分布式环境是指集群由一台 ZooKeeper 服务器和一台 Kafka broker 服务器组成
多节点 Kafka 集群由一套多节点 ZooKeeper 集群和一套多节点 Kafka 集群组成
27、安装java
28、启动kafka
29、最好使用奇数个服务器,即 2n + 1 个服务器,这样整个 ZooKeeper 集群最多可以容忍 n 台服务器容机而保证依然提供服务 。假如我们使用了 4
台服务器,若 2 台服务器岩机,剩下的 2 台服务器不满足“半数以上服务器存活”的条件,因此此时 ZooKeeper 集群将停止服务
30、zookeeper关键参数
myid 文件位于 zoo.cf运中 dataDir 配置的目录下,其内容也很简单,仅是一个数字,即 ID 。
31、一台机器上的三台zookeeper
32、查看集群状态
33、ZooKeeper 的主进程名是 QuorumPeerMain
34、一台机器上启动三个kafka
在上面 3 个配置文件中我们需要每台 Kafka 服务器指定不同的 broker ID 。 该由在整个集群中必须是唯一的
35、topic删除是个异步过程,执行 kafka-topics 脚本来列出当前的 topic 列表,如果 test-topic 不在该列表中,则表明该 topic 被删除成功
36、Kafka 还提供了性能吞吐量测试脚本,它们分别是 katka-producer-perf-test 脚本和 katkaconsumer-perf-test 脚本
37、生产者吞吐量测试
38、消费者吞吐量测试
39、当前对于绝大多数的 broker 端参数而言, 尚不支持动态修改一一这就是说,如果要新增、修改,抑或是删除某些 broker 参数的话,需要重启对应的 broker 服务器。
1)、log.dirs一一-非常重要的参数!该参数指定了 Kafka 持久化消息的目录 。该参数可以设置多个目录,以逗号分隔,比如/home/kafkal ,/home/kafka2
2)、如果要使用 一套 ZooKeeper环境管理多套 Kafka 集群,那么设置该参数的时候就必须指定 ZooKeeper 的 chroot,比如 zkl :218 l ,zk2:2181,zk3:2181/kafka_clusterl o 结尾的/kafka_cluster 1 就是 chroot,它
是可选的配置,如果不指定则默认使用 ZooKeeper 的根路径 。
3)、listeners一-broker 监听器的 csv 列表,格式是[协议]://[主机名 ]:[端口],[[协议]]://[主机名]:[端口]]。该参数主要用于客户端连接 broker 使用,
可以认为是 broker 端开放给 clients的监听端口 。 如果不指定主机名,则表示绑定默认网卡:如果主机名是 0.0.0.0,则表示绑定所有网卡。
4)、advertised.listeners一一与 listeners 类似,该参数也是用于发布给 clients 的监听器,不过该参数主要用于 IaaS 环境,比如云上的机器通常都配有多块网卡(私网网卡和公网网
卡)。对于这种机器,用户可以设置该参数绑定公网 IP 供外部 clients 使用,然后配置上面的 listeners 来绑定私网 IP 供 broker 间通信使用 。在实际使用场景中,对于配有多块网
卡的机器而言,这个参数通常都是需要配置的。
5)、unclean.leader.election.enable- 该参数默认值是 false ,即表明如果发生这种情况, Kafka 不允许从剩下存活的非 ISR 副本中选择一个当 leader
6)、log.retention. {hourslminuteslms} 若同时设置,优选ms,minutes次之,hours最后
7)、min.insync.replicas 也只有在 acks=-1 时才有意义 。
40、Kafka 会频繁地创建井修改文件系统中的文件 ,如果一个 broker 上面有很多 topic 的分区,那么这个 broker 势必就需要打开很多个文件一一大致数量约等于分区数 × (分区
总大小/日志段大小〉 × 3
41、