zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    mysql 15道语句练习题
    分组查询以及where和having的区别
    java初学复习
    Working with Excel Files in Python
    PIP常用命令
    pip install 提示代理连接失败原因及解决办法
    关于Encode in UTF-8 without BOM
    360极速浏览器Onetab插件存储位置
    使用夜神模拟器录制脚本
    微信小程序开发经验总结
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14886971.html
Copyright © 2011-2022 走看看