From 6b9b68d54105ecae4d968c4263b16d7a815cfecf Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Wed, 14 Sep 2022 00:05:51 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=96=87=E6=A1=A3=E4=BF=AE=E6=94=B9](master):?= =?UTF-8?q?=20Kafka=20=E5=8F=82=E6=95=B0=E9=85=8D=E7=BD=AE=E4=B8=8A=20?= =?UTF-8?q?=E5=91=A8=E4=B8=80=E5=AD=A6=E4=B9=A0=202022=E5=B9=B409=E6=9C=88?= =?UTF-8?q?14=E6=97=A500:05:43?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bigdata/kafka/README.md | 48 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/bigdata/kafka/README.md b/bigdata/kafka/README.md index 59d22ab..f716a11 100644 --- a/bigdata/kafka/README.md +++ b/bigdata/kafka/README.md @@ -92,9 +92,51 @@ zookeeper.connect=[你的ip地址]:2181 --- - 最最最重要的集群参数配置 - - TODO - - + - Kafka 服务器端的配置,其中既有 Broker 端参数,也有主题(Topic)级别的参数、JVM 端参数和操作系统级别的参数 +- Broker 端参数 + - 首先 Broker 是需要配置存储信息的,即 Broker 使用哪些 磁盘。那么针对存储信息的重要参数有以下这么几个: + - **log.dirs**: 这是非常重要的参数,指定了 Broker 需要 使用的若干个文件目录路径。要知道这个参数是没有默认 值的,这说明什么?这说明它**必须由你亲自指定**。 + - log.dir: 注意这是 dir,结尾没有 s,说明它只能表示 单个路径,它是**补充上一个参数用的**。 + - 这两个参数应该怎么设置呢?很简单,你只要设置 log.dirs,即第一个参数就好了,不要设置log.dir。而且更重要的是,在线上生产环境中一定要为log.dirs配置 多个路径, + 具体格式是一个 CSV 格式,也就是用逗号分隔 的多个路径,比 如/home/kafka1,/home/kafka2,/home/kafka3这 样。如果有条件的话你最好保证这些目录挂载到不同的物理磁盘上。 + - 这样做有两个好处: + - 提升读写性能:比起单块磁盘,多块物理磁盘同时读写数据有更高的吞吐量。 + - 能够实现故障转移:即 Failover。这是 Kafka 1.1 版本新 引入的强大功能。要知道在以前,只要 Kafka Broker 使 用的任何一块磁盘挂掉了,整个 Broker 进程都会关闭。 但是自 1.1 开始,这种情况被修正了, + 坏掉的磁盘上的数 据会自动地转移到其他正常的磁盘上,而且 Broker 还能 正常工作。这个改进正是我们舍弃 RAID 方案的基 础:没有这种 Failover 的话,我们只能依靠 RAID 来提 供保障。 + - 与 ZooKeeper 相关的设置 + - 首先 ZooKeeper 是 做什么的呢?它是一个分布式协调框架,负责协调管理并保 存 Kafka 集群的所有元数据信息,比如集群都有哪些Broker 在运行、创建了哪些 Topic,每个 Topic 都有多少 分区以及这些分区的 Leader 副本都在哪些机器上等信息。 + - Kafka 与 ZooKeeper 相关的最重要的参数当属 **zookeeper.connect** + - 这也是一个 CSV 格式的参数,比 如我可以指定它的值为 **zk1:2181,zk2:2181,zk3:2181**。2181 是 ZooKeeper 的默认端口。 + - 如果我让**多个 Kafka 集群使用同一套 ZooKeeper 集群**,那么这个参数应该怎么设置呢?这时候 chroot 就派上用场了。这个 chroot 是 ZooKeeper 的概 念,类似于别名。 + - 如果你有两套 Kafka 集群,假设分别叫它们 kafka1 和 kafka2,那么两套集群的zookeeper.connect参数可以 这样指定:**zk1:2181,zk2:2181,zk3:2181/kafka1和 zk1:2181,zk2:2181,zk3:2181/kafka2**。 + - **切记 chroot 只需要写一次,而且是加到最后的**。我经常碰到有人这样指 定: zk1:2181/kafka1,zk2:2181/kafka2,zk3:2181/kafka3,这样的格式是不对的。 + - 第三组参数是与 Broker 连接相关的,即客户端程序或其他 Broker 如何与该 Broker 进行通信的设置。有以下三个参 数: + - **listeners**: 学名叫监听器,其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。 + - advertised.listeners: 和 listeners 相比多了个 advertised。Advertised 的含义表示宣称的、公布的, 就是说**这组监听器是 Broker 用于对外发布的**。 + - [内网环境访问Kafka不需要配置这个参数,常见的玩法是:你的Kafka Broker机器上配置了双网卡,一 块网卡用于内网访问(即我们常说的内网IP);另一个块用 于外网访问。那么你可以配置listeners为内网IP, advertised.listeners为外网IP。] + - ~~host.name/port~~: 列出这两个参数就是想说你把它们忘掉吧,压根不要为它们指定值,毕竟都是过期的参数了。 + - 监听器的概念,从构成上来说,它是若干个逗 号分隔的三元组,**每个三元组的格式为<协议名称,主机 名,端口号>**。这里的协议名称可能是标准的名字,比如 PLAINTEXT 表示明文传输、SSL 表示使用 SSL 或 TLS 加密 传输等; + 也可能是你自己定义的协议名字,比如 CONTROLLER: //localhost:9092。 + - 一旦你自己定义了协议名称,你必须还要指定 listener.security.protocol.map参数告诉这个协议,底层使用了哪种安全协议,比如指定 listener.security.protocol.map=CONTROLLER:P LAINTEXT表示CONTROLLER这个自定义协议底层使用明文 不加密传输数据。 + - 经常有人会问主机 名这个设置中我到底使用 IP 地址还是主机名。这里我给出 统一的建议:**最好全部使用主机名**,即 **Broker 端和 Client 端应用配置中全部填写主机名**。 Broker 源代码中也使用的 是主机名,如果你在某些地方使用了 IP 地址进行连接,可能会发生无法连接的问题。 + - 第四组参数是关于 Topic 管理的。我来讲讲下面这三个参数: + - auto.create.topics.enable:是否允许自动创建 Topic。 + - [建议最好设置成 **false**,即不允许自动创建 Topic。每个部门被分配的 Topic 应该由运维严格把控,决不能允许自行创建任何 Topic。] + - unclean.leader.election.enable:是否允许 Unclean Leader 选举。 + - [每个分区都有多个副本来提供高可用。 在这些副本中只能有一个副本对外提供服务,即所谓的 Leader 副本。建议你还是显式地把它设置成 **false** 吧] + - auto.leader.rebalance.enable:是否允许定期进 行 Leader 选举。 + - [对生产环境影响非常大,设置它的值为 true 表示允许 Kafka 定期地对一些 Topic 分区进行 Leader 重选举,当然这个重选举不是无脑进行的,它要满 足一定的条件才会发生。严格来说它与上一个参数中Leader 选举的最大不同在于, + 它不是选 Leader,而是换 Leader!比如 Leader A 一直表现得很好,但若 true,则有可能 一段时间后 Leader A 就要被强行卸任换成 Leader B。建议你在生产环境中把这 个参数设置成 **false**。] + - 最后一组参数是数据留存方面的,即: + - log.retention.{hour|minutes|ms}:这是个“三 兄弟”,都是控制一条消息数据被保存多长时间。从优先 级上来说 ms 设置最高、minutes 次之、hour 最低。 + - [虽然 ms 设置有最高的优先级,但是 通常情况下我们还是设置 hour 级别的多一些,比如 log.retention.hour=168表示默认保存 7 天的数据,自动删除 7 天前的数据。很多公司把 Kafka 当做存储来使 用,那么这个值就要相应地调大。] + - log.retention.bytes:这是指定 Broker 为消息保存的总磁盘容量大小。 + - [这个值默认是 -1, 表明你想在这台 Broker 上保存多少数据都可以,至少在容 量方面 Broker 绝对为你开绿灯,不会做任何阻拦。这个参 数真正发挥作用的场景其实是在云上构建多租户的 Kafka 集 群:设想你要做一个云上的 Kafka 服务,每个租户只能使用 100GB 的磁盘空间] + - message.max.bytes:控制 Broker 能够接收的最大消息大小。 + - [不能使用默认值的参数,默认的 1000012 太少了,还不到 1MB。实际场景中突 破 1MB 的消息都是屡见不鲜的,因此在线上环境中设置一 个比较大的值还是比较保险的做法。毕竟它只是一个标尺而 已,仅仅衡量 Broker 能够处理的最大消息大小,即使设置 大一点也不会耗费什么磁盘空间的。] + - 补充参数 + - gg.handler.kafkahandler.Mode = tx gg.handler.kafkahandler.Mode = op 这两个的差别。遇到时 dml 数据会丢失的情况。用的是 op 。 + - 当设置成op单个数据库表的变更(插入、更新、删除) 会被当成一条Kafka消息发送;当设置成tx时,数据库事务 所做的所有变更统一被封装进一条Kafka消息,并在事务提 交后被发送。后者有事务性的保障,至少有原子性方面的保证,不会丢失部分 CDC 数据。