如果要让zk以集群模式启动,就必须在zoo.cfg中这样配置
dataDir=/data/zookeeper dataLogDir=/data/zookeeper/version-2 # the port at which the clients will connect clientPort=2181 server.1=10.243.55.100:2888:3888 server.2=10.243.55.101:2888:3888 server.3=10.243.55.102:2888:3888
解释一下为啥是两个端口号
修改配置文件 server.id=host:port:port id的取值范围:1~255,用id来标识该机器在集群中的机器序号 2888表示follower节点与leader节点交换信息的端口号 3181表示leader选举的端口,如果leader节点挂掉了, 需要一个端口来重新选举 server.1=192.168.11.129:2888:3181 server.2=192.168.11.131:2888:3181 server.3=192.168.11.135:2888:3181
在dataDir下必须有一个myid文件,该文件中必须有值就是server.后面的数字
而且该值还必须在第一个行开始
现在就看看源码这部分是怎么读取的
QuorumPeerConfig # parseProperties
File myIdFile = new File(dataDir, "myid");//你敢相信嘛 zk竟然用最low的File,而没有用nio,而且myid文件名固定 if (!myIdFile.exists()) { throw new IllegalArgumentException(myIdFile.toString() + " file is missing"); } BufferedReader br = new BufferedReader(new FileReader(myIdFile)); String myIdString; try { myIdString = br.readLine();//只读第一行 } finally { br.close(); } try { serverId = Long.parseLong(myIdString); MDC.put("myid", myIdString);
还有一段是解析server配置的
else if (key.startsWith("server.")) { int dot = key.indexOf('.'); long sid = Long.parseLong(key.substring(dot + 1)); String parts[] = value.split(":"); if ((parts.length != 2) && (parts.length != 3) && (parts.length !=4)) { LOG.error(value + " does not have the form host:port or host:port:port " + " or host:port:port:type"); } InetSocketAddress addr = new InetSocketAddress(parts[0], Integer.parseInt(parts[1])); if (parts.length == 2) { servers.put(Long.valueOf(sid), new QuorumServer(sid, addr)); } else if (parts.length == 3) { InetSocketAddress electionAddr = new InetSocketAddress( parts[0], Integer.parseInt(parts[2]));//取第二个端口比如 该端口才是选举端口 servers.put(Long.valueOf(sid), new QuorumServer(sid, addr, electionAddr)); } else if (parts.length == 4) { InetSocketAddress electionAddr = new InetSocketAddress( parts[0], Integer.parseInt(parts[2])); LearnerType type = LearnerType.PARTICIPANT; if (parts[3].toLowerCase().equals("observer")) { type = LearnerType.OBSERVER; observers.put(Long.valueOf(sid), new QuorumServer(sid, addr, electionAddr,type)); } else if (parts[3].toLowerCase().equals("participant")) { type = LearnerType.PARTICIPANT; servers.put(Long.valueOf(sid), new QuorumServer(sid, addr, electionAddr,type)); } else { throw new ConfigException("Unrecognised peertype: " + value); } }
如果指定一个server是observer的话要这么写
server.1 = localhost:2181:3181:observer