Zk是怎么解析zoo.cfg配置文件的

如果要让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 

posted on 2021-06-15 20:10  MaXianZhe  阅读(278)  评论(0编辑  收藏  举报

导航