mirror of
https://github.com/zalando/postgres-operator.git
synced 2026-10-22 11:31:25 +02:00
choose switchover candidate based on lag and role (#1700)
* choose switchover candidate based on lowest lag in MB and role (in synchronous mode)
This commit is contained in:
@@ -21,6 +21,7 @@ import (
|
||||
const (
|
||||
failoverPath = "/failover"
|
||||
configPath = "/config"
|
||||
clusterPath = "/cluster"
|
||||
statusPath = "/patroni"
|
||||
restartPath = "/restart"
|
||||
apiPort = 8008
|
||||
@@ -29,6 +30,7 @@ const (
|
||||
|
||||
// Interface describe patroni methods
|
||||
type Interface interface {
|
||||
GetClusterMembers(master *v1.Pod) ([]ClusterMember, error)
|
||||
Switchover(master *v1.Pod, candidate string) error
|
||||
SetPostgresParameters(server *v1.Pod, options map[string]string) error
|
||||
GetMemberData(server *v1.Pod) (MemberData, error)
|
||||
@@ -175,6 +177,20 @@ func (p *Patroni) SetConfig(server *v1.Pod, config map[string]interface{}) error
|
||||
return p.httpPostOrPatch(http.MethodPatch, apiURLString+configPath, buf)
|
||||
}
|
||||
|
||||
// ClusterMembers array of cluster members from Patroni API
|
||||
type ClusterMembers struct {
|
||||
Members []ClusterMember `json:"members"`
|
||||
}
|
||||
|
||||
// ClusterMember cluster member data from Patroni API
|
||||
type ClusterMember struct {
|
||||
Name string `json:"name"`
|
||||
Role string `json:"role"`
|
||||
State string `json:"state"`
|
||||
Timeline int `json:"timeline"`
|
||||
LagInMb int `json:"lag"`
|
||||
}
|
||||
|
||||
// MemberDataPatroni child element
|
||||
type MemberDataPatroni struct {
|
||||
Version string `json:"version"`
|
||||
@@ -246,6 +262,27 @@ func (p *Patroni) Restart(server *v1.Pod) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetClusterMembers read cluster data from patroni API
|
||||
func (p *Patroni) GetClusterMembers(server *v1.Pod) ([]ClusterMember, error) {
|
||||
|
||||
apiURLString, err := apiURL(server)
|
||||
if err != nil {
|
||||
return []ClusterMember{}, err
|
||||
}
|
||||
body, err := p.httpGet(apiURLString + clusterPath)
|
||||
if err != nil {
|
||||
return []ClusterMember{}, err
|
||||
}
|
||||
|
||||
data := ClusterMembers{}
|
||||
err = json.Unmarshal([]byte(body), &data)
|
||||
if err != nil {
|
||||
return []ClusterMember{}, err
|
||||
}
|
||||
|
||||
return data.Members, nil
|
||||
}
|
||||
|
||||
// GetMemberData read member data from patroni API
|
||||
func (p *Patroni) GetMemberData(server *v1.Pod) (MemberData, error) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user