在多个 AWS EC2 实例上安装 zookeeper

zookeeper installation on multiple AWS EC2instances

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

根据 zookeeper document,我已经在所有 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. 上面的配置真的可以互通吗? port 2889:3889 & 2890:38900 - 这些端口是什么意思。我需要在 ec2 机器上配置它还是需要给它一些其他端口?

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

  4. 如何确认3个zookeeper都已经启动并且可以互相通信了?

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 文件。

您可能需要创建一个安全组并打开客户端端口供客户端使用,并打开 quorum/election 端口供其他 ZooKeeper 服务器访问。

最后,您可能希望查看 UI 来帮助管理集群。 Netflix makes a decent UI 这将让您了解您的集群,还有助于清理旧日志并将快照存储到 S3(ZooKeeper 拍摄快照但不会删除旧事务日志,因此如果它们被删除,您的磁盘最终会填满没有正确删除)。但是一旦配置正确,您应该也能够在日志中看到相互连接的 ZooKeeper 服务器。

编辑

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

@chomp 指出,一些用户必须使用 0.0.0.0 作为本地服务器 IP 才能使 ZooKeeper 配置在 EC2 上运行。换句话说,将 instance 1 上的配置文件中的 <private ip of ec2 instance 1> 替换为 0.0.0.0。这与 ZooKeeper 配置文件的设计方式相反,但在 EC2 上可能是必需的。

在 Amazon 的 VPC 中添加有关 Zookeeper 集群的附加信息。

使用 VPC public IP 地址的解决方案应该是首选解决方案,因为 Zookeeper 和使用“0.0.0.0”应该是您最后的选择。 如果您在 EC2 实例中使用 docker,“0.0.0.0”将无法与 Zookeeper 3 一起正常工作。5.X 节点重启后。

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

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