在多个AWS EC2实例上安装Zookeeper

5

我是zookeeper和aws EC2的新手。我正在尝试在3个ec2实例上安装zookeeper。

根据zookeeper文档,我已经在所有3个实例上安装了zookeeper,并创建了zoo.conf文件,并添加以下配置:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
clientPort=2181
server.1=localhost:2888:3888
server.2=<public ip of ec2 instance 2>:2889:3889
server.3=<public ip of ec2 instance 3>:2890:3890

我在所有3个实例上创建了myid文件,路径为/opt/zookeeper/data/myid,符合指南要求。

以下是我的一些疑问:

  1. 每次在每个实例上启动zookeeper服务器时,它都会以独立模式启动。(根据日志)

  2. 上述配置是否真的可以相互连接?端口2889:3889和2890:38900 - 这些端口是什么意思。我需要在EC2机器上进行配置,还是需要提供其他端口?

  3. 我需要创建安全组来打开这些连接吗?我不确定如何在EC2实例中执行此操作。

  4. 如何确认所有3个zookeeper已经启动并且它们可以相互通信?

2个回答

10

ZooKeeper的配置被设计为可以在所有集群中的服务器上安装完全相同的配置文件,无需修改。这使得操作变得更加简单。指定本地节点配置的组件是myid文件。

您定义的配置不能在所有服务器之间共享。您服务器列表中的所有服务器都应该绑定到专用IP地址,该地址可被网络中的其他节点访问。因为您绑定了localhost,所以您看到您的服务器以独立模式启动。因此,问题在于集群中的其他服务器无法看到localhost

您的配置应类似于以下内容:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper/data
clientPort=2181
server.1=<private ip of ec2 instance 1>:2888:3888
server.2=<private ip of ec2 instance 2>:2888:3888
server.3=<private ip of ec2 instance 3>:2888:3888

每个服务器定义中列出的两个端口分别是ZooKeeper节点之间用于内部通信的仲裁和选举端口。通常不需要修改这些端口,应尝试在服务器之间保持它们相同以确保一致性。

此外,正如我所说,您应该能够在所有实例之间共享完全相同的配置文件。唯一需要更改的是 myid 文件。

您可能需要创建一个安全组,并打开客户端端口以供客户端使用,以及允许其他ZooKeeper服务器访问仲裁/选举端口。

最后,您可能需要查看一个UI来帮助管理集群。 Netflix提供了一个不错的界面,可以显示集群的视图,并帮助清理旧日志并将快照存储到S3(ZooKeeper会拍摄快照但不会删除旧的事务日志,因此如果没有正确删除,磁盘最终将填满)。但是,一旦配置正确,您应该能够在日志中看到ZooKeeper服务器彼此连接。

编辑

@czerasz指出,从3.4.0版本开始,您可以使用autopurge.snapRetainCountautopurge.purgeInterval指令来保持快照清洁。

@chomp指出,有些用户必须在EC2上使用0.0.0.0作为本地服务器IP,以使ZooKeeper配置正常工作。换句话说,在 instance 1 的配置文件中用 0.0.0.0 替换<private ip of ec2 instance 1>。这与ZooKeeper配置文件设计相反,但在EC2上可能是必要的。


1
从版本 3.4.0 开始,您可以使用 autopurge.snapRetainCountautopurge.purgeInterval 指令来保持快照的清洁。 - czerasz
在实例1的zoo.cfg文件中,应该使用“0.0.0.0”而不是机器的私有IP。 - chomp
@chomp 你是说如果这是server.1的配置文件,你可以在文件中为该特定条目放置0.0.0.0吗?ZooKeeper配置文件被设计成可以在不进行编辑的情况下在多台机器之间复制,这就是为什么myid文件是单独的。我们不能将所有服务器的IP都设置为0.0.0.0,因为无法以这种方式引用远程服务器。因此,配置文件应该有真实的IP地址。 - kuujo
在“正常”的Zookeeper环境中,这是正确的,但是在AWS中,如果不进行必要的修改,Zookeeper将无法使用,至少对我而言是这样。参考此链接https://dev59.com/GV0Z5IYBdhLWcg3w4zsm,获得更好的解释,我只知道按照此方法对我有效!;=) - chomp
我没有记得有任何问题,但知道这一点很有趣!我会更新我的答案。 - kuujo
我可能会建议不使用IP地址,而是使用指向ELB的链接,以防将来需要重新创建这些实例。亚马逊不能保证在重新创建实例时会分配相同的IP地址。 - MrDuk

1

添加有关Amazon VPC内Zookeeper集群的其他信息。

使用VPC的公共IP地址的解决方案应该是首选解决方案,因为Zookeeper和使用'0.0.0.0'应该是您的最后选择。如果您在EC2实例中使用docker,则在节点重新启动后,'0.0.0.0'将无法与Zookeeper 3.5.X正常工作。

问题在于解析'0.0.0.0'和节点地址和SID顺序的集合共享(如果您按降序启动节点,则可能不会出现此问题)。

到目前为止,唯一可行的解决方案是升级到3.6.2+版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接