前言:把同步结果变成可以证明的事实
业务系统通常先拥有一张可靠的交易表,随后出现全文搜索、运营筛选、知识检索和分析报表。团队很快发现,把同一行再复制一份并不困难;困难在于原表继续变化、消费者停止、旧数据删除、字段上线之后,还能回答那份副本究竟代表哪个时刻的事实。本书关注的对象就是这种持续变化的数据投影。
我们用一个小型商品目录贯穿全书:MySQL 保存业务事实,Debezium 读取真实二进制日志,Kafka 保留变化事件,Python 消费者把事件写入 PostgreSQL 查询投影。选择 PostgreSQL 是为了让事务、唯一约束和完整对账清晰可见;这里的投影不是全文搜索引擎,也没有声称覆盖 Elasticsearch 的分词、分片与排名行为。读者可以在理解同步边界后替换查询存储,不能直接把本书的数据库事务保证搬到另一种接口上。
所有集成实验都要求四个真实服务就绪,依赖缺失会失败。我们在初始快照查询执行期间插入、修改和删除数据,随后观察真实快照事件与 binlog 事件。我们实际杀死投影已提交、Kafka 位点尚未提交的消费者进程,验证重启产生重复投递;再演练停机积压、新增字段、隔离全量重建与逐行核对。随书报告记录检查项、服务版本、镜像实际摘要与运行地址,失败的报告不会被包装为已完成验证。
本书假设读者理解 SQL 的基本查询和数据库事务,能够运行命令行程序,愿意阅读少量 Python。前六章建立边界,第七至十二章解释在线投影,第十三至十八章完成重建、运维和交付。每章练习都有参考思路。完整代码自动从实验目录编入附录,下载 ZIP 可以在独立目录重新执行,不需要先克隆整套出版工程。
需要提前约定一个词:可靠并不等于永不出错。这里的可靠是能够保留必要证据,在限定条件下重试、恢复并验证结果。单个 broker、单个数据分区与合成数据无法证明多机容灾或大规模容量;个人学习凭据也不能直接用于生产。我们会把这些限制写在结论旁边,让实验支持的结论与尚待验证的设计保持一致。