我一直在尝试在Google Compute Engine上设置ZooKeeper群集,并在使用机器的外部IP时遇到了一些问题。我的群集由GCE上各自独立实例上的3个节点组成。
现在,当我将每个节点配置为使用实例的外部IP时,它们似乎无法相互通信。
zoo.cfg
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=externalIp1:2888:3888
server.2=externalIp2:2888:3888
server.3=externalIp3:2888:3888
如果我使用内部IP配置它们,一切都运行得很好。我的猜测是,当ZooKeeper启动时,无论配置如何,它都会将自身绑定到实例的内部IP。因此,当每个节点尝试使用配置的外部IP查找其他2时,他们无法找到它们。
所以我的问题是,有没有办法让ZooKeeper使用机器的外部IP而不是内部IP?我对Google Cloud Platform相对较新,并且总体上设置硬件,所以我不确定像ip转发,防火墙规则或其他什么东西能达到我想做的事情(假设它是均匀的)可能的)。
答案 0 :(得分:1)
根据Zookeeper 3.4.5 docs,您需要指定以下选项:
clientPortAddress
3.3.0中新增:侦听客户端连接的地址(ipv4,ipv6或hostname);也就是客户端尝试连接的地址。这是可选的,默认情况下我们以这样的方式绑定,即接受服务器上任何地址/接口/ nic的 clientPort 的任何连接。
虽然看起来默认情况下它会绑定到服务器上的所有可用IP,所以理论上它应该已经设置好了。
重要说明:如果Zookeeper实例使用外部IP而不是内部IP相互通信,则会向data egress收费,而如果所有通信都通过内部网络(使用内部IP)在同一区域内,你不会。