首页 > 其他分享 >Orchestrator global recovery disable 全局开关

Orchestrator global recovery disable 全局开关

时间:2022-10-23 13:23:29浏览次数:54  
标签:... Orchestrator recovery global 开关 disable func 全局

目录

Orchestrator中,在MySQL集群粒度,有故障自动恢复开关,在全局粒度,也有一个全局的开关(global recovery disable)。

本文主要介绍全局开关(global recovery disable)的基本实现方式。

下面分别从几个层面阐述。

1. DB 层

在DB层定义一个数据表,用于存储全局开关状态。

global_recovery_disable 数据表:

CREATE TABLE IF NOT EXISTS global_recovery_disable (
			disable_recovery tinyint unsigned NOT NULL COMMENT 'Insert 1 to disable recovery globally',
			PRIMARY KEY (disable_recovery)
		) ENGINE=InnoDB DEFAULT CHARSET=ascii

相应的,有操作DB的相关接口,查询、插入记录(关闭开关)、删除记录(打开开关)。

func IsRecoveryDisabled() (disabled bool, err error) {}
func DisableRecovery() error {}
unc EnableRecovery() error {}

2. raft 同步层

为了在Orchestrator 集群节点之间同步全局开关状态,定义raft同步接口:

func (applier *CommandApplier) disableGlobalRecoveries(value []byte) interface{} {}
func (applier *CommandApplier) enableGlobalRecoveries(value []byte) interface{} {}

3. API 层

在HTTP 层,提供相关接口,供外部使用。

查询开关状态

// CheckGlobalRecoveries checks whether
func (this *HttpAPI) CheckGlobalRecoveries(params martini.Params, r render.Render, req *http.Request) {}

关闭全局开关

// DisableGlobalRecoveries globally disables recoveries
func (this *HttpAPI) DisableGlobalRecoveries(params martini.Params, r render.Render, req *http.Request, user auth.User) {}

打开全局开关

// EnableGlobalRecoveries globally enables recoveries
func (this *HttpAPI) EnableGlobalRecoveries(params martini.Params, r render.Render, req *http.Request, user auth.User) {}

4. snapshot 层

从数据表中查询记录,写入snapshot:

func CreateSnapshotData() *SnapshotData {
	snapshotData := NewSnapshotData()
    ... ...
	snapshotData.RecoveryDisabled, _ = IsRecoveryDisabled()
    ... ...
}

从snapshot中恢复到数据表中:

func (this *SnapshotDataCreatorApplier) Restore(rc io.ReadCloser) error {
	snapshotData := NewSnapshotData()
	... ...
	// recovery disable
	{
		SetRecoveryDisabled(snapshotData.RecoveryDisabled)
	}
	... ...

5. 自动故障恢复

自动故障恢复发起前,检查全局开关状态,如果全局禁用,则直接返回,不继续执行:

func executeCheckAndRecoverFunction(analysisEntry inst.ReplicationAnalysis, candidateInstanceKey *inst.InstanceKey, forceInstanceRecovery bool, skipProcesses bool) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error) {
    ... ...
    	// Check for recovery being disabled globally
	if recoveryDisabledGlobally, err := IsRecoveryDisabled(); err != nil {
		// Unexpected. Shouldn't get this
		log.Errorf("Unable to determine if recovery is disabled globally: %v", err)
	} else if recoveryDisabledGlobally {
		if !forceInstanceRecovery {
			log.Infof("CheckAndRecover: Analysis: %+v, InstanceKey: %+v, candidateInstanceKey: %+v, "+
				"skipProcesses: %v: NOT Recovering host (disabled globally)",
				analysisEntry.Analysis, analysisEntry.AnalyzedInstanceKey, candidateInstanceKey, skipProcesses)

			return false, nil, err
		}
		log.Infof("CheckAndRecover: Analysis: %+v, InstanceKey: %+v, candidateInstanceKey: %+v, "+
			"skipProcesses: %v: recoveries disabled globally but forcing this recovery",
			analysisEntry.Analysis, analysisEntry.AnalyzedInstanceKey, candidateInstanceKey, skipProcesses)
	}
    
    ... ...
}

6. Dashboard 页面

在Dashboard上,通过调用HTTP接口查看和操作。
如下图所示:
在这里插入图片描述

标签:...,Orchestrator,recovery,global,开关,disable,func,全局
From: https://www.cnblogs.com/lanyangsh/p/16818407.html

相关文章

  • Codeforces Global Round 23-C
    C题目链接:https://codeforces.com/contest/1746/problem/C此题着实不难,就是看你自己能不能想到那种构造的方法。自己做的时候没有很好的思路,所以参考了官方的解析()。个人......
  • drools_04_global
    关于global属性drl文件中可以设置任意多个global对象,语法是globaldataTypevariable,dataType不能是int/double等原始类型.global作用:用于Java和规则之......
  • [Typescript] Tips: Use 'declare global' to allow types to cross module boundarie
    GlobalsinTypeScript?!......
  • Codeforces Global Round 23 -D.Paths on the Tree
    题意给定一个树,树上每个节点i有一个权值s[i]。一共有k条从1(一定是根节点)开始的简单路径。设i点有c条路径通过,则其总权值为c*s.现在在限制:如果p[u]=i,p[v]=i,则abs(c[u]......
  • Codeforces Global Round 16 D
    D2.SeatingArrangements(hardversion)题意我们要先按照a来排序然后再来安排d的位置最开始都能想到的一点就是我们可以每一组内按照逆序排序我们就可以让组内是0贡......
  • gin recovery 与 goroutine recover
    GinRecoveryRecovery返回一个中间件,该中间件从任何恐慌中恢复,并写入500(如果有)。当你的程序出现一些你未考虑到的异常时,程序就会退出,服务就停止了,所以这个中间件是有必要......
  • [题解] Codeforces Global Round 23 1746 A B C D E1 F 题解
    点我看题求点赞A.Maxmina首先序列全0的情况肯定是NO。否则,如果\(k\ge3\),则在序列中随便找一个1,把他左边和右边分别用第一种操作不断缩,直到序列长度为k为止,最后用一次2......
  • Codeforces Global Round 23
    A.Maxmina显然结果全为0时,结果为NO,若有1,我们通过操作1使长度变为k,里面包含至少1,通过操作2,结果即为YES1#include<bits/stdc++.h>2usingnamespacestd;3consti......
  • Codeforces Global Round 23题解
    T1link大水题,不想说最后一定可以把一个序列消成长度为\(k\)的带一序列,前提是其原来就有一所以贪心就是如果有一,就行,反之不行codeT2linkwssb,考试的时候居然想了大......
  • Codeforces Global Round 23 (A-E1)个人题解
    A-Maxmina给定一个01串,我们可以将k个数变为他们的最大值(k个数变成1个数),或者将相邻的两个数变为他们的最小值(2个数变成1个数),询问是否可以将这个01串变成仅含有一个1的......