-
KRaft 模式是 Kafka 在 3.0 版本中引入的新模式。KRaft 模式使用了 Raft 共识算法来管理 Kafka 集群元数据。Raft 算法是一种分布式共识算法,具有高可用性、可扩展性和安全性等优势。
-
在 KRaft 模式下,Kafka 集群中的每个 Broker 都具有和 Zookeeper 类似的角色。每个 Broker 都参与管理 Kafka 集群元数据,包括分区分配、副本分配、元数据快照等。
Zookeeper 模式和KRaft 模式 对比
特性 | KRaft 模式 | Zookeeper 模式 |
---|---|---|
使用共识算法 | Raft | Zookeeper |
可用性 | 高 | 高 |
扩展性 | 高 | 高 |
安全性 | 高 | 高 |
复杂度 | 低 | 高 |
KRaft 模式的优势
KRaft 模式具有以下优势:
- 更简单:KRaft 模式将 Kafka 集群元数据管理整合到了 Kafka 中,因此不需要使用外部服务,这使得 Kafka 集群的部署和管理更加简单。
更高效:KRaft 模式使用了 Raft 算法来管理 Kafka 集群元数据,Raft 算法具有更高的效率,因此 Kafka 集群的性能可以得到提升。
更可靠:KRaft 模式使用了 Raft 算法来管理 Kafka 集群元数据,Raft 算法具有更高的可靠性,因此 Kafka 集群的稳定性可以得到提升。
helm安装
helm repo add bitnami https://charts.bitnami.com/bitnami
helm pull bitnami/kafka --untar
helm install kafka kafka --values ./kafka/values.yaml \--set replicaCount=1 \--set kafka.kafkaConfigOverrides=transaction.state.log.replication.factor=1 \--set kafka.kafkaConfigOverrides=transaction.state.log.min.isr=1 \--set kafka.kafkaConfigOverrides=default.replication.factor=1 \--set kafka.kafkaConfigOverrides=num.io.threads=2 \--set kafka.kafkaConfigOverrides=num.network.threads=2 \--set kafka.kafkaConfigOverrides=inter.broker.protocol.version=3.5.1 \--set kafka.kafkaConfigOverrides=offsets.topic.replication.factor=1 \--set kafka.kafkaConfigOverrides=transaction.state.log.num.partitions=50
最后得到
kafka-controller-0.kafka-controller-headless.openim-dev.svc.cluster.local:9092kafka-controller-1.kafka-controller-headless.openim-dev.svc.cluster.local:9092kafka-controller-2.kafka-controller-headless.openim-dev.svc.cluster.local:9092The CLIENT listener for Kafka client connections from within your cluster have been configured with the following security settings:- SASL authenticationTo connect a client to your Kafka, you need to create the 'client.properties' configuration files with the content below:security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \username="user1" \password="$(kubectl get secret kafka-user-passwords --namespace openim-dev -o jsonpath='{.data.client-passwords}' | base64 -d | cut -d , -f 1)";
在安装一个kafka-web
apiVersion: apps/v1
kind: Deployment
metadata:name: kafka-uilabels:app: kafka-ui
spec:replicas: 1selector:matchLabels:app: kafka-uitemplate:metadata:labels:app: kafka-uispec:containers:- name: kafka-uiimage: provectuslabs/kafka-ui:latestenv:- name: KAFKA_CLUSTERS_0_NAMEvalue: '可以自定义名字 Kafka Cluster'- name: KAFKA_CLUSTERS_0_BOOTSTRAPSERVERSvalue: 'kafka-controller-0:9092,kafka-controller-1:9092,kafka-controller-2:9092'- name: KAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOLvalue: 'SASL_PLAINTEXT'- name: KAFKA_CLUSTERS_0_PROPERTIES_SASL_MECHANISMvalue: 'PLAIN'- name: KAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIGvalue: 'org.apache.kafka.common.security.plain.PlainLoginModule required username="user1" password="19fJTxgwnD";'resources:requests:memory: "256Mi"cpu: "100m"ports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:name: kafka-ui
spec:selector:app: kafka-uitype: NodePortports:- protocol: TCPport: 8080targetPort: 8080