美文网首页
Zeus-Master-选举

Zeus-Master-选举

作者: PunyGod | 来源:发表于2016-07-07 11:38 被阅读193次

Zeus负责调度的节点称之为 Master, Master节点是单点运作的,为了保持系统的高可用性,每台worker都可以去竞争当Master,但在系统之中同时只会存在一个Master。
Zeus和Zeus2中的使用的分布式锁选举主节点的方案是使用数据库的方案,
每台worker内设置一个定时线程,每隔一分钟查询一次数据库的zeus_lock表:

  • 如果没有记录,则认为目前环境中没有主节点,则朝表中写数据,谁写上谁就是主的;
  • 如果数据库表中显示自己是主节点,则更新心跳的时间;
  • 如果数据库标中显示的主节点不是自己,则判断表中的最新的心跳时间,如果最近更新时间在2分钟以上,则认为抢占的Master服务器已经失去连接,本服务器主动进行抢占;
  • 如果数据库中显示的主节点运转正常,则关闭自己的主节点角色功能【防止脑裂】;

如果作为worker角色,自己之前连接的主节点并不是数据库中的,则重新连接到新的master上并汇报自己的心跳信息;

部分代码如下:

/**
 * 定时扫描任务
 * 每隔一分钟扫描一次zeus_lock表
 * 判断ScheduleServer是否正常运行
 * @author zhoufang
 *
 */

private void update(){
   DistributeLock lock=(DistributeLock) getHibernateTemplate().execute(new HibernateCallback() {
      @Override
      public Object doInHibernate(Session session) throws HibernateException,
            SQLException {
         Query query=session.createQuery("from com.taobao.zeus.store.mysql.persistence.DistributeLock where subgroup=? order by id desc");
         query.setParameter(0, Environment.getScheduleGroup());
         query.setMaxResults(1);
         DistributeLock lock= (DistributeLock) query.uniqueResult();
         if(lock==null){
            lock=new DistributeLock();
            lock.setHost(host);
            lock.setServerUpdate(new Date());
            lock.setSubgroup(Environment.getScheduleGroup());
            session.save(lock);
            lock=(DistributeLock) query.uniqueResult();
         }
         return lock;
      }
   });
      if(host.equals(lock.getHost())){
      log.info("hold the locker and update time");
      lock.setServerUpdate(new Date());
      getHibernateTemplate().update(lock);
            zeusSchedule.startup(port);
   }else{//其他服务器抢占了锁
      log.info("not my locker");
      //如果最近更新时间在2分钟以上,则认为抢占的Master服务器已经失去连接,本服务器主动进行抢占
      if(System.currentTimeMillis()-lock.getServerUpdate().getTime()>1000*60*2L){
         log.error("rob the locker and update");
         lock.setHost(host);
         lock.setServerUpdate(new Date());
         lock.setSubgroup(Environment.getScheduleGroup());
         getHibernateTemplate().update(lock);
         zeusSchedule.startup(port);
      }else{//如果Master服务器没有问题,本服务器停止server角色
         zeusSchedule.shutdown();
      }
         }
      try {
      worker.connect(lock.getHost(),port);
   } catch (Exception e) {
      ScheduleInfoLog.error("start up worker fail", e);
   }
}

使用轮询的方式来选主,不可避免的会导致没办法在第一时间监测到主节点的不可用,会用一定的延迟性。目前主流的服务发现方案可以使用zk来实现主节点选择的策略;

相关文章

  • Zeus-Master-选举

    Zeus负责调度的节点称之为 Master, Master节点是单点运作的,为了保持系统的高可用性,每台worke...

  • Zeus-Master-主要组件

    MasterContext: Master上下文 内容说明: workers: 维护了与所有worker的rpc通...

  • zookeeper的实现原理(下)

    leader 选举 Leader选举会分两个过程:启动的时候的leader选举、 leader崩溃的时候的的选举 ...

  • [Zookeeper] 选举流程Fast Leader

    选举信息-选举流程-选举场景-源码分析 1 选举信息 <1> 服务器角色信息在Zookeeper集群提供服务时,集...

  • 关于日本的选举制度

    一、选举的种类 日本的选举分为参议院议员的选举、众议院议员的选举、包括地方(都道府县和市区町村)议会及首长的选举...

  • Zookeeper集群中leader选举

    Leader选举 Leader选举会分两个过程 启动时候的Leader选举 Leader崩溃的时候选举 服务器启动...

  • Elasticsearch的选举机制

    关于Elasticsearch的选举机制:ES选举master机制不像Hbase的HMaster选举, HMast...

  • zookeeper选举过程

    Leader 选举 选举算法 : leaderElection AuthFastLeaderElection Fa...

  • zookeeper leader选举和事务流程

    leader选举 zookeeper在集群启动或原leader宕机后会进行leader选举,选举过程大致如下: 每...

  • 选举

    (本故事纯属虚构,如有雷同,纯属巧合) 01 南澳村是个美丽的渔村。8月份的一场选举,吞噬了这个美丽渔村的祥和与安...

网友评论

      本文标题:Zeus-Master-选举

      本文链接:https://www.haomeiwen.com/subject/nfhljttx.html