从ZooKeeper多服务器配置文档中,他们显示了以下配置,可以放在zoo.cfg
(ZK的配置文件)在每个服务器上:
tickTime=2000
dataDir=/var/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
此外,它们声明您需要在每个ZK节点上有一个myid
文件,其内容与上面的server.id
值之一匹配。例如,在3个节点的"集成"(ZK集群)中,第一个节点的myid
文件将只包含值1
。第二个节点的myid
文件将包含2
,以此类推。
我有几个实际的问题,关于这在现实世界中是什么样子的:
1。可以使用localhost
吗?如果zoo.cfg
必须在集成中的每个节点上重复,是否可以将当前服务器定义为localhost
?例如,在一个3节点集合中,服务器#2的zoo.cfg
看起来像这样是否可以:
tickTime=2000
dataDir=/var/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=localhost:2888:3888 # Afterall, we're on server #2!
server.3=zoo3:2888:3888
或者这是不建议/不可能的?
2。服务器id必须是数字吗?例如,我可以有一个5节点集合,其中每个服务器的zoo.cfg
看起来像:
tickTime=2000
dataDir=/var/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.red=zoo1:2888:3888
server.green=zoo2:2888:3888
server.blue=zoo3:2888:3888
server.orange=zoo1:2888:3888
server.purple=zoo2:2888:3888
并且,假设服务器1的myid
将包含值red
在它里面(等等)?
1。可以使用localhost吗?
这是一个很好的问题,因为ZooKeeper文档没有明确说明配置文件是否只接受IP地址。它只表示hostname
,这可能意味着IP地址,DNS或hosts
文件中的名称,例如localhost
。
服务器。x =(主机名):nnnnn [: nnnnn],等
组成ZooKeeper集合的
(无Java系统属性)服务器。当服务器启动时,它通过在数据目录中查找文件myid来确定它是哪个服务器。该文件包含ASCII格式的服务器编号,它应该与server中的x匹配。
但是,请注意ZooKeeper建议在所有主机中使用完全相同的配置文件:
ZooKeeper的行为是由ZooKeeper配置文件控制的。这个文件被设计成完全相同的文件可以被所有组成ZooKeeper服务器的服务器使用,假设磁盘布局是相同的。如果服务器使用不同的配置文件,必须注意确保所有不同配置文件中的服务器列表匹配。
所以只要输入机器的IP地址,一切就应该工作了。此外,我亲自测试使用0.0.0.0
(在接口IP地址与公共IP地址不同的情况下),它确实有效。
2。服务器id必须是数字吗?
在ZooKeeper多服务器配置文档中,myid
需要是1到255之间的数值:
myid文件由单行组成,仅包含该机器的id文本。因此,服务器1的myid将包含文本"1",而没有其他内容。id在集合中必须是唯一的,的值应该在1到255之间
由于myid
必须匹配server.x
参数中的x
,因此我们可以推断x
也必须是一个数值