我想构建同时使用Kafka(用于流处理)和Kubernetes(用于服务编排)的云应用程序。我想使其可扩展。 Kafka和Kubernetes都有自己的扩展应用程序的方式。 Kubernetes可以通过复制Pod并使用负载均衡器在这些Pod上分配服务调用来扩展服务。例如,可以通过在多个分区上分配流量来扩展Kafka(例如Pinterest,请参见https://medium.com/pinterest-engineering/how-pinterest-runs-kafka-at-scale-ff9c6f735be)。
问题:设计此应用程序以实现可伸缩性的最合适方法是什么?更重要的是:为什么?
Kubernetes和Kafka都是分布式系统,旨在提供可用性和可伸缩性。
可以在Kubernetes中将所有控制平面部件作为分布式系统运行,最常见的是作为3个副本运行。 Kafka的情况相同,通常将每个主题复制到3个节点。
Kubernetes控制平面中的某些零件,例如控制器仅需要一个活动副本,因此使用leader选举模式。卡夫卡中的流处理器经常需要这样做。
无状态工作负载,例如Kubernetes中的Deployment
和来自ReplicaSets
的Pod被轻松缩放为所需的多个副本。
[有状态的工作负载,例如Kubernetes中来自StatefulSet
的Pod通常使用consensus算法同步复制,例如Kafka正在使用的Zookeeper的Zab或Kubernetes中etcd使用的Raft。但这取决于应用程序要处理。
当系统需要的存储容量大于单个节点的容量,而读或写负载大于单个节点可以处理的负载时,则需要partition或shard负载,就像使用< [主题分区在Kafka中。