博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于codis-ha的小改动,主备切换后刷新Slave
阅读量:7045 次
发布时间:2019-06-28

本文共 3192 字,大约阅读时间需要 10 分钟。

hot3.png

           不懂codis-ha策略的就不要使用了!!!!(否则会死很惨) 

            在项目中用了codis,发现官方提供的codis-ha 能够提供第一次的master-Slave切换,但是考虑,redis的Slaveof 的 同步策略,并未开放在Slave提升为master后 并未刷新其他Slave,导致新的maser没有Slave,综合本项目的考虑(项目部署环境恶劣)自己添加了一个了refreshSlave方法

servergroup.gopackage mainimport (	"github.com/juju/errors"	log "github.com/ngaut/logging"	"github.com/wandoulabs/codis/pkg/models"	"time")func GetServerGroups() ([]models.ServerGroup, error) {	var groups []models.ServerGroup	err := callHttp(&groups, genUrl(*apiServer, "/api/server_groups"), "GET", nil)	return groups, err}func PingServer(checker AliveChecker, errCtx interface{}, errCh chan<- interface{}) {	err := checker.CheckAlive()	log.Debugf("check %+v, result:%v, errCtx:%+v", checker, err, errCtx)	if err != nil {		errCh <- errCtx		return	}	errCh <- nil}func getSlave(master *models.Server) (*models.Server, error) {	var group models.ServerGroup	err := callHttp(&group, genUrl(*apiServer, "/api/server_group/", master.GroupId), "GET", nil)	if err != nil {		return nil, errors.Trace(err)	}	for _, s := range group.Servers {		if s.Type == models.SERVER_TYPE_SLAVE {			return s, nil		}	}	return nil, errors.Errorf("can not find any slave in this group: %v", group)}func refreshSlave(master *models.Server)  {	var group models.ServerGroup	err := callHttp(&group, genUrl(*apiServer, "/api/server_group/", master.GroupId), "GET", nil)	if err == nil {		for _, s := range group.Servers {			if s.Type == models.SERVER_TYPE_SLAVE {					err := callHttp(nil, genUrl(*apiServer, "/api/server_group/", master.GroupId,"/addServer"), "PUT", s)					if err != nil {						  	log.Errorf("slave  refresh failed:  %v error:v%",  s , errors.ErrorStack(err))					}			}		}	}else{			log.Errorf("slave  refresh failed:  %v",  errors.Trace(err))	}}func handleCrashedServer(s *models.Server) error {	switch s.Type {	case models.SERVER_TYPE_MASTER:		//get slave and do promote		slave, err := getSlave(s)		if err != nil {			log.Warning(errors.ErrorStack(err))			return err		}		log.Infof("try promote %+v", slave)		err = callHttp(nil, genUrl(*apiServer, "/api/server_group/", slave.GroupId, "/promote"), "POST", slave)		if err != nil {			log.Errorf("do promote %v failed %v", slave, errors.ErrorStack(err))			return err		}		refreshSlave(s) //refresh	case models.SERVER_TYPE_SLAVE:		log.Errorf("slave is down: %+v", s)	case models.SERVER_TYPE_OFFLINE:		//no need to handle it	default:		log.Fatalf("unkonwn type %+v", s)	}	return nil}//ping codis-server find crashed codis-serverfunc CheckAliveAndPromote(groups []models.ServerGroup) ([]models.Server, error) {	errCh := make(chan interface{}, 100)	var serverCnt int	for _, group := range groups { //each group		for _, s := range group.Servers { //each server			serverCnt++			rc := acf(s.Addr, 5*time.Second)			news := s			go PingServer(rc, news, errCh)		}	}	//get result	var crashedServer []models.Server	for i := 0; i < serverCnt; i++ {		s := <-errCh		if s == nil { //alive			continue		}		log.Warningf("server maybe crashed %+v", s)		crashedServer = append(crashedServer, *s.(*models.Server))		err := handleCrashedServer(s.(*models.Server))		if err != nil {			return crashedServer, err		}	}	return crashedServer, nil}

转载于:https://my.oschina.net/u/1538376/blog/489792

你可能感兴趣的文章
高级网络控制
查看>>
Lintcode40 Implement Queue by Two Stacks solution 题解
查看>>
Mysql_MHA高可用架构搭建
查看>>
聚合链接和防火墙策略管理(初级)
查看>>
Wireshark数据包分析之IP协议包解读
查看>>
网络工程师成长日记121-网管始终都是网管
查看>>
Java基础概述
查看>>
python Class:面向对象高级编程 元类:type
查看>>
洞悉物联网发展1000问之为什么智慧灯杆会大火?
查看>>
Spring Cloud--Honghu Cloud分布式微服务云系统—组件化
查看>>
质数的多种实现方法
查看>>
8招打造高质量社群,就是这么简单!
查看>>
干货来袭丨资产可用性真的是终极目标吗?
查看>>
今日博客
查看>>
【短信插件】 NiuShop单商户如何调用短信验证码接口
查看>>
MapReduce 调优
查看>>
【Infragistics教程】Sketch Prototypes的可用研究和用户视频
查看>>
用友云服务治理平台 助力企业微服务架构落地
查看>>
linux appear packet loss solution
查看>>
结构体大小的计算以及内存对其原则和修改默认对齐数
查看>>