当前位置: 首页 > 科技观察

Kafka的替代品Redpanda的架构与部署

时间:2023-03-13 09:23:06 科技观察

介绍Redpanda是用C++编写的,是兼容Kafka的流数据平台,已被证明速度提高10倍。它也是无JVM、无ZooKeeper、Jepsen测试和可用源代码的。Redpanda完全兼容KafkaAPI,也就是说在开发项目中无需修改Kafka客户端相关代码,直接替换Kafka即可。因为是C++写的,不需要用JVM,分布式协调用的是raft协议,所以不需要用zookeeper。只有一个可执行二进制文件,部署非常容易。架构计算机硬件在过去十年间发生了很多变化:硬盘由于采用了NVMe协议的SSD,速度提升了1000倍;网络快100倍;云计算更便宜;但是CPU速度提升不多,就用多核解决了。从这个趋势来看,CPU似乎是新的瓶颈。在这样的背景下,为了适应现代计算机硬件的发展,小熊猫设计了自己的架构:这种架构叫做Thread-Per-Core。如上所述,现代计算机有很多核心。为了充分利用多核,需要线程。但是线程会遇到两个主要的问题:1.需要同步的时候必须使用锁,2.ContextSwitch的成本比较高。Thread-Per-Core架构就是为了解决这两个主要问题。如果有几个核心,就建几个线程,把线程绑定到特定的核心上,因为不会有更多的线程,所以尽量减少上下文切换。另外Redpanda的每个线程只负责处理自己的分区,所以不需要使用锁。你可能会想,I/O呢?如果线程被阻塞怎么办?linux5.1版本内核之后,加入了完全异步的io模型——io_uringio_uring使用在用户空间建立的两个队列:sq(提交队列)和cq(完成队列)来完成io操作。读写操作都放到sq里面,这一步是异步的,然后应用程序可以做其他的事情,内核完成工作后,把结果放到cq里面,当应用程序需要查看io结果的时候,就去cq检查就是这样。在这种模式下,因为sq的存在,相当于对系统调用进行了批处理,即内核对io进行批处理。这也充分利用了现代硬件的优势,比如NVMeSSD硬盘,可以并行处理很多IO操作。Redpanda的kafka客户端向Redpanda发送消息时,实际上是发送到某个core。当核心不负责某个分区时,它会通过rpc通知其他核心上的线程进行处理。这里Redpanda没有使用grpc和thrift,而是使用了自己的轻量级rpc来达到完美的速度。当有多个Redpanda节点时,使用raft协议进行数据共识。总结起来,Redpanda实现了三个目标:易于操作。只有一个二进制可执行文件,部署简单,无需jvm或zk。尽可能少的数据丢失。使用raft协议保证数据安全。实测比Kafka快10倍。Thread-Per-Core架构和io_uring的加持使其比Kafka更快。部署Redpanda可以部署到docker、linux、win、macOS、kubernetes。直接安装在docker、linux、win、macOS上时,安装后如果需要非本地访问,需要在参数中配置广播地址和端口,这样就可以在外部访问下进行kubernetes部署了。https://github.com/redpanda-data/helm-charts这个地址下载helmchart,然后进去找到values.yaml,主要需要修改的是storage:修改成合适的storageClass,选择空间大小,然后执行:helminstallredpandaredpanda--namespaceredpanda--create-namespace安装成功。