在生产中使用哪个 ClickHouse 版本?
首先,让我们讨论一下人们为什么会问这个问题。主要有两个原因:
- ClickHouse 的开发速度相当快,通常每年有超过 10 个稳定版本发布。这让可选择的版本范围非常广泛,而这并不是一个简单的选择。
- 一些用户希望避免花时间搞清楚哪个版本最适合他们的用例,而只是跟随其他人的建议。
第二个原因更根本,所以我们将从这里开始,然后回到不同 ClickHouse 版本的选择。
你推荐哪个 ClickHouse 版本?
雇佣顾问或信任一些知名专家以摆脱对生产环境的责任是很有诱惑的。你安装一些其他人推荐的特定 ClickHouse 版本;如果出现问题,这不是你的错,是别人的。这种推理是一种大陷阱。没有任何外部人士比你更了解你公司生产环境中的情况。
那么你如何正确选择要升级到哪个 ClickHouse 版本?或者你如何选择第一个 ClickHouse 版本?首先,你需要投资于建立一个 真实的预生产环境。理想情况下,这可以是一个完全相同的影子副本,但这通常成本很高。
以下是一些在不那么高的成本下获得合理保真度的预生产环境的关键要点:
- 预生产环境需要运行与你打算在生产中运行的查询尽可能接近:
- 不要让它变为只读,使用一些冻结的数据。
- 不要让它变为只写,仅仅复制数据而不构建一些典型报表。
- 不要将其清空,而是要应用模式迁移。
- 使用一部分真实的生产数据和查询。尝试选择一个仍然具有代表性的样本,使得
SELECT
查询返回合理的结果。如果你的数据是敏感的且内部政策不允许其离开生产环境,请使用混淆技术。 - 确保预生产环境的监控和报警软件覆盖方式与生产环境相同。
- 如果你的生产跨越多个数据中心或地区,确保你的预生产环境也如此。
- 如果你的生产使用复杂的功能,比如复制、分布式表和级联物化视图,确保在预生产中配置相似。
- 使用与生产中数量大致相同但规模较小的服务器或虚拟机,或者使用数量更少但规模相同的服务器或虚拟机之间存在权衡。第一种选择可能会捕捉到额外的网络相关问题,而后者则更易于管理。
第二个需要投资的领域是 自动化测试基础设施。不要假设如果某种查询成功执行了一次,它将永远如此。拥有一些 ClickHouse 被模拟的单元测试是可以的,但确保你的产品具有合理的自动化测试集,这些测试是针对真实 ClickHouse 运行的,并检查所有重要用例是否仍按预期工作。
进一步的一个步骤是将那些自动化测试贡献给 ClickHouse 的开源测试基础设施,这些基础设施在其日常开发中持续使用。这肯定需要一些额外的时间和精力来学习 如何运行它,然后如何将你的测试适应这个框架,但它将确保 ClickHouse 发布在被宣布为稳定时已经经过这些测试,而不是在事后不断浪费时间报告问题,然后等待漏洞修复的实施、回溯和发布。一些公司甚至将这样的测试贡献作为内部政策(在 Google 被称为 碧昂丝法则)。
当你的预生产环境和测试基础设施就位后,选择最佳版本就变得简单明了:
- 定期对新的 ClickHouse 版本运行你的自动化测试。即使是对于标记为
testing
的 ClickHouse 版本,你也可以这么做,但不建议在后续步骤中继续使用它们。 - 部署通过测试的 ClickHouse 版本到预生产,并检查所有进程是否按预期运行。
- 将你发现的任何问题报告到 ClickHouse GitHub Issues。
- 如果没有主要问题,开始将 ClickHouse 版本部署到你的生产环境应该是安全的。投资于逐步发布自动化的机制,实现类似于 金丝雀发布 或 蓝绿部署 的方法,可能进一步减少生产中出现问题的风险。
正如你可能注意到的,上述方法并没有什么特别针对 ClickHouse 的内容 - 人们在认真对待生产环境时会为他们所依赖的任何基础设施这样做。
如何选择 ClickHouse 版本?
如果你查看 ClickHouse 软件包仓库的内容,你会看到两种类型的包:
stable
lts
(长期支持)
以下是一些选择它们之间的指导:
stable
是我们默认推荐的包类型。它们大约每月发布一次(因此以合理的延迟提供新功能),并且支持最近的三个稳定版本进行诊断和漏洞修复的回溯。lts
是每年发布两次,并在初始发布后的支持一年。在以下情况下,你可能更倾向于选择它们而不是stable
:- 你的公司有内部政策不允许频繁升级或使用非 LTS 软件。
- 你在一些副产品中使用 ClickHouse,而这些副产品不需要任何复杂的 ClickHouse 功能或没有足够的资源进行更新。
许多最初认为 lts
是最佳选择的团队,最终还是由于一些对他们产品重要的最新功能而转向 stable
。
在升级 ClickHouse 时还需记住的一点是:我们始终关注版本之间的兼容性,但有时保持某些细微的细节可能不是合理的。因此,在升级之前,请确保检查 changelog,以查看是否有关于向后不兼容更改的任何说明。