我是动物园管理员和aws EC2的新手。我正在尝试在3个ec2实例上安装zookeeper。
根据zookeeper文档,我已经在所有3个实例上安装了zookeepper,创建了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
按照指导方针。。
我有几个问题如下:
每当我在每个实例上启动zookeeper服务器时,它都会以独立模式启动。(根据日志)
上面的配置真的能互相连接吗?端口2889:3889&2890:38900-这些端口是怎么回事。我需要在ec2机器上配置它吗?或者我需要给它一些其他端口?
我需要创建安全组来打开这些连接吗?我不知道如何在ec2实例中做到这一点。
如何确认3名动物园管理员都已开始工作,并且他们可以相互交流?
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制作了一个不错的UI,可以让你看到集群的视图,还可以帮助清理旧日志并将快照存储到S3(ZooKeeper会拍摄快照,但不会删除旧的事务日志,所以如果没有正确删除,你的磁盘最终会满)。但一旦正确配置,您应该能够在日志中看到ZooKeeper服务器之间的连接。
编辑
@czerasz指出,从3.4.0版本开始,您可以使用autopurge.snapRetainCount
和autopurge.purgeInterval
指令来保持快照的干净。
@chomp指出,一些用户不得不使用0.0.0.0
作为本地服务器IP,以使ZooKeeper配置在EC2上工作。换句话说,在instance 1
上的配置文件中将<private ip of ec2 instance 1>
替换为0.0.0.0
。这与ZooKeeper配置文件的设计方式相反,但在EC2上可能是必要的。
添加有关亚马逊专有网络内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+版本。