首先来看下造成扩容问题的原因,是受Kafka本身架构的限制。Kafka 是以分区为读写单位,分区是和节点绑定的,这些数据会写入到元数据存储中。此时一旦计算层(CPU/网卡)或存储层(util)出现瓶颈,是没办法让其他节点承载压力的。如果要解决这个问题,Kafka在架构上要做很大的改动。
从架构的角度出发,我个人理解,解决的思路就是:计算存储分离 + 存储分段。这一点Apache Pulsar就做的很好。我们来简单看一下Pulsar的做法。来看下图:
计算存储分离:解决的是计算压力的快速转移。计算节点和存储节点是分开的。计算节点只负责计算逻辑的处理,是无状态的节点。当节点出现瓶颈,可以快速横向扩容。
存储分段:解决的主要是存储层IO压力的快速转移。Pulsar使用Bookeeper作为存储层,Pulsar将逻辑上的分区,在实际存储层面,分为多个段(segment)进行管理和存储。如果出现某个存储的机器有瓶颈,直接禁用该机器上segment,在新的机器上拉起新的Segment即可。
总结一下,一旦Pulsar集群遇到上面说的Kafka集群类似的瓶颈,从扩容的角度来说,会更优雅和便捷。这是架构自身带来的优势。