最近,很多人,问我,Terraform,和,ZooKeeper,到底,该选,哪个?

说实话,第一次,听到,这个,问题,我,有点,懵。因为,这两个,工具,解决的,是,完全不同的,问题,根本,不是,一个,领域的,东西。

Terraform,是,基础设施即代码(Infrastructure as Code),工具,用来,管理,云资源,比如,虚拟机,网络,存储,等等。

ZooKeeper,是,分布式协调,服务,用来,解决,分布式系统,中的,协调问题,比如,配置管理,命名服务,分布式锁,leader选举,等等。

一个,管的是,基础设施,资源,一个,管的是,分布式系统,协调。两者,完全,不冲突,甚至,经常,一起,用。

但是,既然,很多人,问,说明,大家,对,这两个,工具,的,定位,还,不太,清楚。那,我,就,详细,对比一下,这两个,工具,包括,它们,的,定位,功能,原理,适用场景,优缺点,以及,如何,选择。

希望,这篇,文章,能,帮,大家,搞懂,这两个,工具,以后,不再,纠结,该选,哪个。

一、Terraform是什么?

先,说说,Terraform,是什么。

Terraform,是,HashiCorp,公司,出的,一个,开源,工具,用来,管理,基础设施,资源。

它,的,核心,思想,是,基础设施即代码(Infrastructure as Code,简称IaC)。就是,把,基础设施,的,配置,写成,代码,用,代码,来,定义,和,管理,基础设施。

比如,你,需要,一台,云服务器,一个,数据库,一个,负载均衡器,你,不用,去,云厂商的,控制台,手动,点来点去,创建。你,只,需要,写,一段,Terraform,的,配置,代码,然后,运行,terraform apply,Terraform,就,会,自动,帮你,创建,这些,资源。

而且,以后,需要,修改,比如,把,服务器,从,2核4G,升级到,4核8G,你,只,需要,修改,配置,代码,再,运行,terraform apply,Terraform,就,会,自动,帮你,修改。

Terraform,支持,很多,云厂商,比如,AWS,Azure,Google Cloud,阿里云,腾讯云,等等。而且,也,支持,很多,其他的,基础设施,比如,VMware,OpenStack,Kubernetes,等等。

它,用的,是,一种,叫,HCL(HashiCorp Configuration Language),的,配置语言,语法,比较,简洁,易读。

一个,简单的,Terraform,配置,例子:

provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "example-instance"
  }
}

这段,配置,定义了,一个,AWS,的,EC2实例。运行,terraform apply,就,会,创建,这台,实例。

二、ZooKeeper是什么?

再,说说,ZooKeeper,是什么。

ZooKeeper,是,Apache,基金会,的,一个,开源,分布式协调,服务。

它,的,作用,是,为,分布式系统,提供,协调,服务。分布式系统,中,有,很多,协调,问题,需要,解决,比如:

  1. 配置管理:分布式系统,中,很多,节点,需要,共享,配置。配置,变了,所有,节点,都,要,能,及时,感知到。
  2. 命名服务:分布式系统,中,需要,一个,统一的,命名,空间,让,各个,节点,能,找到,彼此。
  3. 分布式锁:分布式系统,中,多个,节点,需要,互斥,访问,某个,资源,需要,分布式锁。
  4. Leader选举:分布式系统,中,需要,选出,一个,leader,来,协调,其他,节点。
  5. 集群管理:分布式系统,中,需要,知道,哪些,节点,活着,哪些,节点,挂了。

这些,问题,看起来,简单,但是,自己,实现,起来,非常,难。因为,分布式系统,中,有,各种,异常,情况,比如,网络分区,节点宕机,消息丢失,等等。要,正确,处理,这些,异常,非常,不容易。

ZooKeeper,就是,为了,解决,这些,问题,而,设计的。它,提供了,一个,简单的,文件系统,样的,数据结构,和,一些,原语,让,你,能,很,容易地,实现,上面,说的,那些,协调,功能。

ZooKeeper,的数据模型,很,像,一个,文件系统。有,一个,根节点,/,下面,可以,有,子节点,每个,节点,叫,znode。每个,znode,可以,存储,数据,也,可以,有,子节点。

比如:

/
├── config
│   ├── db
│   └── cache
├── servers
│   ├── server1
│   ├── server2
│   └── server3
└── locks
    └── lock1

ZooKeeper,还,支持,watch,机制。你,可以,对,某个,znode,设置,watch,当,这个,znode,的,数据,变了,或者,子节点,变了,ZooKeeper,会,通知,你。

这,让,ZooKeeper,能,很,方便地,实现,配置管理,集群管理,等,功能。

ZooKeeper,本身,也是,分布式的,由,多个,节点,组成,集群。一般,是,奇数个,节点,比如,3个,5个,7个。它,用,ZAB协议(ZooKeeper Atomic Broadcast),来,保证,数据,的,一致性。

只要,集群中,超过,一半的,节点,活着,ZooKeeper,就能,正常,提供,服务。所以,它,的,可用性,很高。

三、两者的核心区别

介绍完了,Terraform,和,ZooKeeper,各自,是,什么,再,说说,两者,的,核心,区别。

其实,从,上面的,介绍,大家,应该,已经,能,看出来,这两个,工具,完全,不是,一个,领域的。

我,总结了,一下,两者,的,核心,区别:

1. 定位不同

Terraform,的,定位,是,基础设施即代码,工具。它,管的是,基础设施,资源,的,创建,修改,删除。

ZooKeeper,的,定位,是,分布式协调,服务。它,管的是,分布式系统,中,各个,节点,之间的,协调。

一个,是,管,资源,的,一个,是,管,协调,的。

2. 解决的问题不同

Terraform,解决的,问题,是,如何,用,代码,来,管理,基础设施,实现,基础设施,的,自动化,版本化,可重复。

ZooKeeper,解决的,问题,是,如何,在,分布式系统,中,实现,配置管理,命名服务,分布式锁,leader选举,集群管理,等,协调,功能。

3. 使用场景不同

Terraform,用在,基础设施,管理,的,场景。比如,你,要,在,云上,搭建,一套,环境,包括,虚拟机,网络,数据库,负载均衡,等等,你,就,可以,用,Terraform,来,管理。

ZooKeeper,用在,分布式系统,协调,的,场景。比如,你,开发了,一个,分布式,应用,需要,配置管理,分布式锁,集群管理,等,功能,你,就,可以,用,ZooKeeper,来,实现。

4. 技术栈不同

Terraform,是,一个,命令行,工具,用,Go语言,写的。你,写,HCL,配置,然后,用,terraform,命令,来,执行。

ZooKeeper,是,一个,服务,用,Java,写的。你,需要,部署,ZooKeeper,集群,然后,通过,客户端,来,连接,和,使用。

5. 两者不冲突,经常一起用

最重要的,一点,是,Terraform,和,ZooKeeper,完全,不冲突,甚至,经常,一起,用。

比如,你,用,Terraform,在,云上,创建了,一组,虚拟机,然后,在,这些,虚拟机,上,部署了,一个,分布式,应用,这个,分布式,应用,用,ZooKeeper,来,做,协调。

这,完全,是,两个,层面的,东西。Terraform,管的是,下面的,基础设施,ZooKeeper,管的是,上面的,应用,协调。

所以,根本,不存在,"该选哪个",的,问题。两个,都,需要,两个,都,要用。

四、Terraform的优缺点

既然,是,对比,那,就,分别,说说,两者,的,优缺点。

先,说说,Terraform,的,优缺点。

Terraform的优点:

  1. 基础设施即代码:把,基础设施,配置,写成,代码,可以,版本控制,code review,自动化,测试,等等。和,写,应用,代码,一样。
  2. 多云支持:支持,几乎,所有的,主流,云厂商,和,很多,其他的,基础设施。一套,工具,管理,所有的,云资源。
  3. 声明式语法:HCL,是,声明式的,你,只,需要,描述,你,想要,什么,状态,Terraform,会,帮你,达到,那个,状态。不用,关心,怎么,达到。
  4. 计划预览terraform plan,能,预览,将要,做的,修改,让你,确认,之后,再,执行。避免,误操作。
  5. 模块化:支持,模块,可以,把,常用的,配置,封装成,模块,复用。
  6. 状态管理:Terraform,会,记录,基础设施,的,状态,知道,当前,有,哪些,资源,是什么,状态。这样,修改的时候,只,修改,需要,改的,部分。

Terraform的缺点:

  1. 学习曲线:HCL,语法,虽然,简单,但是,Terraform,的,概念,比较,多,比如,provider,resource,data,module,state,等等,初学者,需要,一定的,时间,来,理解。
  2. 状态管理麻烦:Terraform,的,状态文件,很,重要,但是,管理,起来,有点,麻烦。需要,考虑,状态文件,的,存储,锁定,备份,等等。如果,状态文件,丢了,或者,损坏了,会,很,麻烦。
  3. 某些资源支持不好:虽然,Terraform,支持,很多,云厂商,和,资源,但是,某些,比较,新的,资源,或者,比较,小众的,资源,支持,可能,不及时,或者,有,bug。
  4. 错误信息不够友好:有时候,Terraform,的,错误信息,比较,晦涩,不容易,看懂,排查,问题,比较,费劲。
  5. 大规模项目性能问题:如果,项目,很大,资源,很多,terraform plan,和,apply,可能,会,比较,慢。

五、ZooKeeper的优缺点

再,说说,ZooKeeper,的,优缺点。

ZooKeeper的优点:

  1. 成熟稳定:ZooKeeper,已经,存在了,很多年,非常,成熟,稳定。很多,大公司,都,在用,经过了,大规模,生产环境,的,验证。
  2. 高可用:ZooKeeper,本身,是,分布式的,集群,部署,只要,超过,一半的,节点,活着,就能,正常,提供,服务。可用性,很高。
  3. 一致性保证:ZooKeeper,用,ZAB协议,保证,数据,的,强一致性。写操作,只要,成功,所有,节点,的,数据,就是,一致的。
  4. 功能丰富:基于,ZooKeeper,的,数据模型,和,watch机制,可以,实现,很多,分布式协调,功能,比如,配置管理,命名服务,分布式锁,leader选举,集群管理,等等。
  5. 性能好:ZooKeeper,的,性能,很好,读操作,特别,快。因为,读操作,可以,在,任意,节点,上,执行。写操作,虽然,需要,过半,节点,确认,但是,性能,也,不错,能,满足,大多数,场景。
  6. 客户端支持多语言:ZooKeeper,有,很多,语言,的,客户端,比如,Java,C,Python,Go,等等,几乎,所有的,主流,语言,都,支持。

ZooKeeper的缺点:

  1. 部署运维复杂:ZooKeeper,需要,部署,集群,还要,配置,参数,监控,运维,等等。对于,小团队,来说,运维,成本,比较,高。
  2. API比较底层:ZooKeeper,的,API,比较,底层,只是,提供了,znode,的,增删改查,和,watch。要,实现,分布式锁,leader选举,等,高级,功能,需要,自己,基于,这些,底层API,来,实现,有,一定的,难度。
  3. 不适合存储大量数据:ZooKeeper,的,数据,都,存在,内存里,所以,不适合,存储,大量的,数据。每个,znode,的,数据,建议,不超过,1MB。
  4. 写性能有限:虽然,ZooKeeper,的,读性能,很好,但是,写性能,相对,有限。因为,写操作,需要,过半,节点,确认,而且,所有的,写操作,都,由,leader,处理,顺序,执行。如果,写操作,很多,可能,会,成为,瓶颈。
  5. 网络分区问题:虽然,ZooKeeper,能,处理,网络分区,但是,在,网络分区,的,情况下,少数派,的,节点,不能,提供,写服务,读服务,也,可能,返回,旧数据。需要,注意。

六、到底该怎么选?

最后,回到,最初的,问题:Terraform,和,ZooKeeper,到底,该选,哪个?

我的,回答,是:这,根本,不是,一个,二选一,的,问题。两个,工具,解决的,是,完全不同的,问题,在,不同的,层面,完全,不冲突。

你,应该,根据,你的,需求,来,决定,是否,需要,用,它们。

什么时候,需要Terraform?

如果你,需要,管理,基础设施,资源,比如,在,云上,创建,虚拟机,网络,数据库,负载均衡,等等,那么,你,需要,Terraform。

特别是,如果,你的,基础设施,比较,复杂,环境,比较,多(开发,测试,生产),需要,频繁,创建,和,销毁,环境,那么,Terraform,能,大大,提高,效率,减少,人工,操作,的,错误。

如果你,只是,有,一台,服务器,跑,一个,小网站,不怎么,变,那么,可能,不需要,Terraform,手动,管理,就,够了。

什么时候,需要ZooKeeper?

如果你,在,开发,或者,使用,分布式系统,需要,配置管理,命名服务,分布式锁,leader选举,集群管理,等,协调,功能,那么,你,需要,ZooKeeper。

很多,分布式,中间件,本身,就,依赖,ZooKeeper。比如,Kafka,HBase,Dubbo,等等,都,用,ZooKeeper,来,做,协调。如果你,用,这些,中间件,那么,你,自然,就,需要,部署,ZooKeeper。

如果你,的,应用,是,单体的,或者,简单的,分布式,不需要,复杂的,协调,功能,那么,可能,不需要,ZooKeeper。

两者可以一起用

很多,时候,两者,是,一起,用的。

比如,你,用,Terraform,在,云上,创建了,一组,虚拟机,和,相关的,网络,存储,等,资源。然后,在,这些,虚拟机,上,部署了,Kafka,集群,和,你的,分布式,应用。Kafka,需要,ZooKeeper,来,做,协调,你的,应用,也,可能,需要,ZooKeeper,来,做,配置管理,和,集群管理。

这,时候,Terraform,和,ZooKeeper,都,需要,都,要用。它们,在,不同的,层面,各司其职,一起,支撑,你的,系统。

所以,不要再,纠结,"该选哪个",了。搞清楚,你的,需求,需要,哪个,就,用,哪个,两个,都,需要,就,两个,都,用。

七、写在最后

以上,就是,Terraform,和,ZooKeeper,的,详细,对比。

总结,一下:

  • Terraform,是,基础设施即代码,工具,用来,管理,基础设施,资源。
  • ZooKeeper,是,分布式协调,服务,用来,解决,分布式系统,中的,协调问题。
  • 两者,解决的,是,完全不同的,问题,在,不同的,层面,完全,不冲突。
  • 不存在,"该选哪个",的,问题,需要,哪个,就,用,哪个,两个,都,需要,就,都,用。

希望,这篇,文章,能,帮,大家,搞懂,这两个,工具,以后,不再,纠结。

如果,有,什么,问题,或者,不同的,看法,欢迎,在,评论区,留言,我们,一起,交流。