背景
在日志系统迁移过程中,往往需要同时支持 Elasticsearch 和 ClickHouse,实现平滑过渡。
双写架构
[Kafka Consumer]
↓
[Router]
↙ ↘
[ES Writer] [CH Writer]一致性保障
func (w *DualWriter) Write(batch []Log) error {
errCh := make(chan error, 2)
go func() { errCh <- w.esWriter.Write(batch) }()
go func() { errCh <- w.chWriter.Write(batch) }()
for i := 0; i < 2; i++ {
if err := <-errCh; err != nil {
return err
}
}
return nil
}Note
双写模式下需要监控两个存储的写入延迟差异。