从ZooKeeper multi-server config docs开始,他们会在每台服务器上显示以下配置文件,这些配置文件可以放在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必须是数字吗?例如,我可以在每个服务器的zoo.cfg
看起来像是一个5节点集合:
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
(等等)?
答案 0 :(得分:3)
<强> 1。可以使用localhost吗?
这是一个很好的问题,因为ZooKeeper文档没有明确说明配置文件是否只接受IP地址。它仅表示if (flag1 && flag2 && flag3 && flag4)) {
userTransaction = commit;
} else {
userTransaction = rollback;
}
,可能表示hostname
文件中的IP地址,DNS或名称,例如hosts
。
server.x = [hostname]:nnnnn [:nnnnn]等 (没有Java系统属性)
构成ZooKeeper集合的服务器。当服务器启动时,它通过在数据目录中查找文件myid来确定它是哪个服务器。该文件包含服务器编号(ASCII),它应与此设置左侧server.x中的x匹配。
但请注意,ZooKeeper建议在所有主机中使用完全相同的配置文件:
ZooKeeper的行为受ZooKeeper配置文件的控制。假设磁盘布局相同,则此文件的设计使得构成ZooKeeper服务器的所有服务器都可以使用完全相同的文件。如果服务器使用不同的配置文件,必须注意确保所有不同配置文件中的服务器列表匹配。
所以简单地把机器的IP地址和一切都应该工作。此外,我亲自使用localhost
进行了测试(在接口IP地址与公共IP地址不同的情况下),它确实有效。
<强> 2。他们的服务器ID必须是数字吗?
从ZooKeeper multi-server configuration docs开始,0.0.0.0
需要是1到255之间的数值:
myid文件由一行组成,只包含该机器id的文本。所以服务器1的myid将包含文本“1”而没有别的。 id必须在整体内是唯一的,的值应介于1到255之间。
由于myid
必须与myid
参数中的x
匹配,我们可以推断server.x
也必须是数值。