美国汽车服务应用程序开发商Jerry公司使用人工智能(AI)和机器学习(ML)来简化汽车保险和汽车贷款的比较和购买过程。随着数据的增长,该公司在使用AWS Redshift时遇到了一些问题,例如速度缓慢且价格昂贵。在该公司改用ClickHouse之后加快了查询性能,并大幅地降低了成本,但这也带来了磁盘故障和数据恢复等存储方面的挑战。
为了避免大量的维护工作,Jerry公司采用了高性能的分布式文件系统JuiceFS,创新地使用其快照功能来实现ClickHouse的主-副本架构。该架构保证了数据的高可用性和稳定性,同时显著提高了系统性能和数据恢复能力。一年多来,JuiceFS一直在持续运行,并且没有发生停机和复制错误,提供了预期的性能。
本文将深入探讨Jerry公司采用的应用程序面临的挑战、采用的解决方案以及未来实施的计划。希望这篇文章能为初创公司和大公司的开发团队提供有价值的见解。
最初,Jerry公司选择Redshift进行分析查询。然而,随着数据量的增长,遇到了严重的性能和成本挑战。例如,当生成漏斗和A/B测试报告时,面临着长达数十分钟的加载时间。即使在规模合理的Redshift集群上,这些操作也太慢了,这使得该公司的数据服务不可用。
因此,Jerry公司急需寻求一个更快、更经济的解决方案,因此选择了ClickHouse,尽管它在实时更新和删除方面存在局限性。而切换到ClickHouse带来了显著的好处:
Jerry公司的设计以ClickHouse为中心,使用Snowflake作为ClickHouse无法处理的1%数据处理的备份。这个设置实现了ClickHouse和Snowflake之间的无缝数据交换。
图1 Jerry公司的数据架构
Jerry公司最初保持独立部署有以下几个原因:
因此,考虑到内存、CPU和存储带宽,独立的ClickHouse是一个可接受的解决方案,在可预见的未来将是有效的。
然而,ClickHouse方法也存在一些固有问题:
在部署ClickHouse之后,Jerry公司遇到了以下问题:
Jerry公司采用JuiceFS来解决其痛点,原因如下:
Jerry公司提出了将ClickHouse迁移到基于JuiceFS的共享存储环境的想法。《探索ClickHouse的存储和计算分离》一文提供了一些见解。
为了验证这种方法,Jerry公司进行了一系列测试。结果表明,在启用缓存之后,JuiceFS的读取性能接近本地磁盘的读取性能,这与本文中的测试结果类似。
虽然写入性能下降到磁盘写入速度的10%到50%,但这是可以接受的。
Jerry公司对JuiceFS安装所做的调整如下:
提高缓存命中率是Jerry公司的优化目标。使用JuiceFS云服务将缓存命中率提高到95%。如果需要进一步改进,会考虑添加更多的磁盘。
ClickHouse和JuiceFS的结合大幅减少了Jerry公司的运营工作量,并且不再需要频繁地扩展磁盘空间。与其相反,Jerry公司专注于监控缓存命中率。这显著地缓解了磁盘扩展的紧迫性。此外,在发生硬件故障时不需要进行数据迁移。这显著地降低了可能的风险和损失。
Jerry公司从JuiceFS快照功能提供的简单数据备份和恢复选项中受益匪浅。借助快照,可以查看数据的原始状态,并在将来的任何时候恢复数据库服务。这种方法通过在文件系统级别实现解决方案来解决以前在应用程序级别处理的问题。此外,快照功能非常快速和经济,因为只存储数据的一个副本。JuiceFS社区版的用户可以使用克隆功能来实现类似的功能。
此外,在不需要数据迁移的情况下,停机时间显著减少。Jerry公司可以快速响应故障或允许自动系统将目录挂载到另一台服务器上,从而确保服务的连续性。值得一提的是,ClickHouse的启动时间只有几分钟,这进一步提高了系统恢复速度。
此外,读性能在迁移后保持稳定,Jerry公司的员工都没有发现任何差异。这证明了该解决方案的性能稳定性。
最后,Jerry公司的成本大幅下降。
在迁移到ClickHouse之后遇到了几个问题,促使Jerry公司考虑构建主-副本架构:
JuiceFS支持在不同位置的多个挂载点。Jerry公司尝试在其他地方挂载JuiceFS文件系统,并在同一位置运行ClickHouse。然而,在实施过程中遇到了一些问题:
因此,Jerry公司使用JuiceFS快照来设置主-副本架构。这种方法的工作原理类似于常规的主备份系统。主实例处理所有数据更新,包括同步和提取、转换和加载(ETL)操作。副本实例主要关注查询功能。
图2 ClickHouse主-副本架构
(1)创建快照
使用JuiceFS快照命令从主实例上的ClickHouse数据目录创建快照目录,并在该目录上部署ClickHouse服务。
(2)暂停Kafka消费者队列
在启动ClickHouse实例之前,必须停止使用来自其他数据源的有状态内容。这意味着暂停Kafka消息队列,以避免与主实例竞争Kafka数据。
(3)在快照目录下执行ClickHouse命令
在启动ClickHouse服务之后,注入了一些元数据,向用户提供有关ClickHouse创建时间的信息。
(4)删除ClickHouse数据突变
在副本实例上,删除了所有数据突变,以提高系统性能。
(5)执行连续复制
快照只保存创建时的状态。为了确保它读取最新的数据,Jerry公司定期用副本替换原始实例。这种方法使用简单且高效,因为每个副本实例都以两个副本和指向其中一个副本的指针开始。即使需要10分钟或更长时间,通常也会每小时运行一次以满足Jerry公司的需求。
Jerry公司的ClickHouse主-副本架构已经稳定运行了一年多,完成2万多次无故障复制操作,证明了其高可靠性。工作负载隔离和数据副本的稳定性是提高性能的关键。在没有任何应用层优化的情况下,Jerry公司成功地将总体报告可用性从不到95%提高到99%。此外,该架构支持弹性扩展,极大地增强了灵活性。这使Jerry公司能够根据需要开发和部署新的ClickHouse服务,而无需复杂的操作。