[Zookeeper] 소스 분석 서버(3)의 LeaderZooKeeperServer

11646 단어
1. 앞말
앞에서 ZooKeeperServer 원본을 분석했는데 QuorumZooKeeperServer의 원본이 상대적으로 간단하기 때문에 LeaderZooKeeperServer를 직접 분석했다.
2. LeaderZooKeeperServer 소스 분석
2.1류의 계승 관계
public class LeaderZooKeeperServer extends QuorumZooKeeperServer {}

설명: LeaderZooKeeperServer는 QuorumZooKeeperServer 추상 클래스를 계승하고 ZooKeeperServer의 많은 방법을 계승합니다.
2.2 클래스의 속성
public class LeaderZooKeeperServer extends QuorumZooKeeperServer {
    //  
    CommitProcessor commitProcessor;
}

설명: 커밋 프로세서 클래스는 하나만 있습니다. 요청 프로세서를 제출하는 것을 나타냅니다. 처리 체인의 위치는 Proposal Request Processor 다음, To Be Applied Request Processor 이전입니다.
2.3 클래스의 구조 함수
    LeaderZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self,
            DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException {
        super(logFactory, self.tickTime, self.minSessionTimeout,
                self.maxSessionTimeout, treeBuilder, zkDb, self);
    }

설명: 상위 클래스 QuorumZooKeeper Server의 구조 함수를 직접 호출한 다음 ZooKeeper Server의 구조 함수를 단계별로 호출합니다.
2.4 핵심 함수 분석
  1.setupRequestProcessors 함수
    protected void setupRequestProcessors() {
        //  FinalRequestProcessor
        RequestProcessor finalProcessor = new FinalRequestProcessor(this);
        //  ToBeAppliedRequestProcessor
        RequestProcessor toBeAppliedProcessor = new Leader.ToBeAppliedRequestProcessor(
                finalProcessor, getLeader().toBeApplied);
        //  CommitProcessor
        commitProcessor = new CommitProcessor(toBeAppliedProcessor,
                Long.toString(getServerId()), false);
        //  CommitProcessor
        commitProcessor.start();
        //  ProposalRequestProcessor
        ProposalRequestProcessor proposalProcessor = new ProposalRequestProcessor(this,
                commitProcessor);
        //  ProposalProcessor
        proposalProcessor.initialize();
        // firstProcessor PrepRequestProcessor
        firstProcessor = new PrepRequestProcessor(this, proposalProcessor);
        //  PrepRequestProcessor
        ((PrepRequestProcessor)firstProcessor).start();
    }

설명: 이 함수는 처리 체인을 생성하는 것을 나타냅니다. 처리 체인의 순서는 PrepRequestProcessor-> ProposalRequestProcessor-> CommitProcessor-> Leader입니다.ToBeAppliedRequestProcessor -> FinalRequestProcessor.
  2.registerJMX 함수
    protected void registerJMX() {
        // register with JMX
        try {
            //  DataTreeBean
            jmxDataTreeBean = new DataTreeBean(getZKDatabase().getDataTree());
            //  
            MBeanRegistry.getInstance().register(jmxDataTreeBean, jmxServerBean);
        } catch (Exception e) {
            LOG.warn("Failed to register with JMX", e);
            jmxDataTreeBean = null;
        }
    }

설명: 이 함수는 JMX 서비스를 등록하는 데 사용됩니다. 먼저 DataTree를 사용하여 DataTreeBean을 초기화한 다음에 DataTreeBean과 ServerBean을 사용하여register 함수를 호출하여 등록합니다. 그 원본은 다음과 같습니다.
    public void register(ZKMBeanInfo bean, ZKMBeanInfo parent)
        throws JMException
    {
        //  bean 
        assert bean != null;
        String path = null;
        if (parent != null) { // parent(ServerBean) 
            //  parent bean2Path path
            path = mapBean2Path.get(parent);
            //  path 
            assert path != null;
        }
        //  
        path = makeFullPath(path, parent);
        if(bean.isHidden())
            return;
        //  
        ObjectName oname = makeObjectName(path, bean);
        try {
            //  Server
            mBeanServer.registerMBean(bean, oname);
            //  bean path mapBean2Path
            mapBean2Path.put(bean, path);
            //  name bean mapName2Bean
            mapName2Bean.put(bean.getName(), bean);
        } catch (JMException e) {
            LOG.warn("Failed to register MBean " + bean.getName());
            throw e;
      

설명:parent를 통해 경로를 가져와 이름을 만들고 bean을 등록한 다음 해당 필드를 mBeanServer와mapBean2Path에 넣으면 등록 과정이 완료됩니다.
  3.unregisterJMX 함수
    protected void unregisterJMX() {
        // unregister from JMX
        try {
            if (jmxDataTreeBean != null) {
                //  
                MBeanRegistry.getInstance().unregister(jmxDataTreeBean);
            }
        } catch (Exception e) {
            LOG.warn("Failed to unregister with JMX", e);
        }
        jmxDataTreeBean = null;
    }

설명: 이 함수는 JMX 서비스 등록을 취소하는 데 사용되며, unregister 함수를 호출합니다. 원본은 다음과 같습니다.
    public void unregister(ZKMBeanInfo bean) {
        if(bean==null)
            return;
        //  
        String path=mapBean2Path.get(bean);
        try {
            //  
            unregister(path,bean);
        } catch (JMException e) {
            LOG.warn("Error during unregister", e);
        }
        //  mapBean2Path mapName2Bean bean
        mapBean2Path.remove(bean);
        mapName2Bean.remove(bean.getName());
    }

설명: unregister와register의 과정은 정반대이고 bean을 제거하는 과정입니다.
3. 총결산
이 편은 LeaderZooKeeperServer의 원본 코드를 배웠습니다. 그 원본 코드는 매우 간단합니다. 주로 등록 및 등록 취소 서비스와 관련됩니다. 대부분의 논리는 ZooKeeperServer의 방법을 직접 사용할 수 있습니다. 또한 원우 여러분의 시청에 감사드립니다~

좋은 웹페이지 즐겨찾기