MySQL高可用解决方案(8)部署replication-manager v2.3.16 实现MySQL8自动化高可用

TangLu MySQL 2024-03-05 275 0

关于replication-manager(简称RM)的部署使用在之前已经发布过一篇《MySQL高可用解决方案(7)replication-manager数据库高可用》。近期公司MySQL升级到了8.0版本,然后在使用老版本的RM时由于数据库参数命名变化等原因(比如slave变为了replicate)导致了RM的异常检测会出现一定的异常,所以部署了最新版本的RM来实现数据库高可用,并且经过了生产测试。以下是RM  v2.3.16的部署步骤:


1、配置RM的YUM仓库

cat /etc/yum.repos.d/signal18.repo 
[signal18]
name=Signal18 repositories
baseurl=http://repo.signal18.io/centos/$releasever/$basearch/
gpgcheck=0
enabled=1


2、安装RM软件

yum install replication-manager-osc


3、配置RM全局设置

cat /etc/replication-manager/config.toml
[Default]
include = "/etc/replication-manager/cluster.d"
monitoring-save-config = false
monitoring-datadir = "/var/lib/replication-manager"
#monitoring-sharedir = "/usr/share/replication-manager"
monitoring-ticker = 5
monitoring-performance-schema = false
monitoring-processlist = false
monitoring-queries = false

#########
## LOG ##
#########
log-file = "/var/log/replication-manager.log"
log-heartbeat = false
verbose = 0
log-failed-election  = true
log-level = 7
log-rotate-max-age = 7
log-rotate-max-backup = 7
log-rotate-max-size = 256
log-sql-in-monitoring   = false
log-sst = false


##########
## HTTP ##
##########
http-server = true
http-bind-address = "0.0.0.0"
http-port = "10001"                         #web端端口
http-auth = false
http-session-lifetime =   3600

#########
## API ##
#########
api-credentials = "admin:repman"             #管理后台的账号密码
api-port = "10005"               
api-credentials-acl-allow = "admin:cluster db prov"
api-credentials-acl-discard = false
api-credentials-external = "dba:repman,foo:bar"



4、配置RM需要管理的数据库集群

cat /etc/replication-manager/cluster.d/test.toml   #为每个数据库集群创建的文件
[tanglu_test]   #数据库集群的名字
title = "测试"  #管理后台显示的数据库集群名
db-servers-hosts = "172.22.8.13:3333,172.22.8.14:3333,172.22.8.15:3333"   #数据库集群的每个节点和端口
db-servers-prefered-master = "172.22.8.15:3333"                           #failover优先被选举为主的节点
db-servers-credential = "root:123456"                                     #数据库管理账号 
db-servers-connect-timeout = 1
replication-credential = "repl:123456"                                    #主从账号

verbose = false
log-failed-election  = true
log-level = 3
log-rotate-max-age = 7
log-rotate-max-backup = 7
log-rotate-max-size = 5
log-sql-in-monitoring   = true
log-sst = true

##############
## TOPOLOGY ##
##############

replication-multi-master = false
replication-multi-tier-slave = false


##############
## FAILOVER ##
failover-mode = "automatic"                                               #发生故障后是否自动切换,manual为手动切换
failover-post-script = "/usr/local/shell/rm_failover_post_test.sh"        #发生故障后执行的脚本

failover-readonly-state = true
failover-max-slave-delay = 0
failover-event-scheduler = false
failover-event-status = false
failover-falsepositive-ping-counter = 10
failover-limit = 0
failover-time-limit = 3600
failover-at-sync = true
failover-restart-unsafe = false

# failover-falsepositive-heartbeat = true
# failover-falsepositive-heartbeat-timeout = 3
# failover-falsepositive-maxscale = false
# failover-falsepositive-maxscale-timeout = 14
# failover-falsepositive-external = false
# failover-falsepositive-external-port = 80

################
## SWITCHOVER ##
################
switchover-wait-kill = 5000
switchover-wait-trx = 10
switchover-wait-write-query = 10
switchover-at-equal-gtid = false
switchover-at-sync = false
switchover-max-slave-delay = 30

############
## REJOIN ##
############

autorejoin = false
#autorejoin-script = ""
#autorejoin-semisync = true
#autorejoin-backup-binlog = true
#autorejoin-flashback = false
#autorejoin-mysqldump = false

####################
## CHECKS & FORCE ##
####################

check-replication-filters = true
check-binlog-filters = true
check-replication-state = true

force-slave-heartbeat= false
force-slave-heartbeat-retry = 5
force-slave-heartbeat-time = 3
force-slave-gtid-mode = false
force-slave-semisync = false
force-slave-failover-readonly-state = false
force-binlog-row = false
force-binlog-annotate = false
force-binlog-slowqueries = false
force-binlog-compress = false
force-binlog-checksum = false
force-inmemory-binlog-cache-size = false
force-disk-relaylog-size-limit = false
force-disk-relaylog-size-limit-size = 1000000000
force-sync-binlog = false
force-sync-innodb = false



5、配置VIP切换脚本

cat /usr/local/shell/rm_failover_post_tanglu.sh 
#!/bin/bash
old_master=$1
new_master=$2
old_port=$3
new_port=$4
instance="测试"
interface=eth0
vip=172.22.8.88
ssh_user=root
ssh_password=123456
ssh_port=22
add_vip="sudo /sbin/ip address add ${vip} dev ${interface}"
del_vip="sudo /sbin/ip address del ${vip}/32 dev ${interface} && ip route flush cache"

vip_bind_check(){
  result=`sshpass -p ${ssh_password} ssh -p ${ssh_port} -tt -o StrictHostKeyChecking=no root@${old_master} "ip a | grep ${vip}" | wc -l`
  if [ $result -eq 1 ];then
    echo "节点VIP绑定检查:${vip} 绑定节点${old_master}正常!"
    return 0
  else
    echo "节点VIP绑定检查:${vip} 绑定节点${old_master}异常!"
    exit 12
  fi
}

vip_status(){
  if ping -c 1 -W 5 "$vip"; then
    return 0
  else
    return 1
  fi
}

vip_stop(){
    rc=0
    sshpass -p ${ssh_password} ssh -p ${ssh_port} -tt -o StrictHostKeyChecking=no ${ssh_user}@${old_master} "${del_vip}"
    rc=$?
    return $rc
}

vip_start(){
    rc=0
    sshpass -p ${ssh_password} ssh -p ${ssh_port} -tt -o StrictHostKeyChecking=no ${ssh_user}@${new_master} "${add_vip}"
    rc=$?
    return $rc
}

vip_bind_check

if vip_status;then
  echo "`date +'%Y-%m-%d %T'`:节点:${old_master} VIP:${vip} 即将下线......"
  if vip_stop;then
    if vip_status;then
      echo "`date +'%Y-%m-%d %T'`:VIP ${vip} 从 ${old_master} 删除失败!"
      exit 13
    else
      echo "`date +'%Y-%m-%d %T'`:VIP ${vip} 从 ${old_master} 删除成功!" 
    fi
  fi
fi


if vip_start; then
      echo "`date +'%Y-%m-%d %T'`:VIP ${vip} 漂移至 ${new_master}!"
else
      echo "`date +'%Y-%m-%d %T'`:VIP ${vip} 添加至 ${new_master} 失败,请进行手动修复!"
      exit 14
fi



6、通过RM管理后台可以看到配置的集群信息和关系,其中有大拇指图标的就是故障后会优先提升为主的节点

rm选举.jpg

评论