本文纯概念我用白话文阐述一下自己的理解任何数据库为了保证数据的一致性都不是直接把数据写到硬盘中的而是下面这样的1.假设我要插入一条数据A2.创建一条插入日志日志里记录了关于A的内容3.日志创建完毕没有问题最后插入A到数据库中有了日志就方便处理宕机问题方便快速回溯数据上面这个过程就叫WALwrite ahead log你看到了log这就足以说明这是个日志模块mysql也有你不会不知道吧WAL是个过程如果我想自己实现该过程我需要自己按照上面步骤写代码你如果觉得我写的不好那么你也可以自己实现上述过程那么你和我就是两套不同的WAL实现而啄木鸟恰好就是Milvus数据库的WAL实现早期的Milvus中是下面这样子的插入数据----创建一条日志—将日志通过MQ发送到云存储阿里云/或者公司私有化的对象服务器—日志上传成功没问题—告诉我们插入成功在上述过程中对于milvus来说有一个不好的地方就是第三步也就是通过MQkafka或者其他将log发送到云服务器milvus这是一个痛点痛的地方在于下面2点其他我们不用考虑MQ速度慢吞吐量不够你可能会问kafka还慢对是的milvus的需求比较简单insert一条数据创建日志直接将日志推送到云存储即可其他功能全都多余我不需要而kafka等MQ消息中间件它为了保证数据的一致性并发性消费组他们都做了很多事情做的事情越多和不做这些事情相比肯定要慢尤其是作为消息中间件需要有一个代理服务器数据先推到代理服务器然后再给消费者而milvus天然就不需要这些它就是把log直接推到云存储就行了MQ不方便运维这个就比较好理解了你部署一套分布式MQ运维就多了很多工作尤其是数据迁移的时候超级麻烦需要各种副本处理正是因为上述两种原因Milvus自己实现了一套WAL这个过程具体负责这个过程的模块他们给起了个名字叫啄木鸟Woodpecker,也就是说不用kafka了也不用其他MQ了直接内部使用woodpecker啄木鸟的吞吐量在milvus自己给出的官方测试中性能要高出MQ七八倍主要就是因为没有代理的过程直接推送到云存储