Replication Manager 管理多个MySQL集群

2023-10-27

Replication Manager 管理多集群

1.Replication Manager最新版本下载安装

##下载地址
vi /etc/yum.repos.d/signal18.repo
[signal18]
name=Signal18 repositories
baseurl=http://repo.signal18.io/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

yum install replication-manager-osc --downloadonly --downloaddir=/opt/
cd /opt
rpm -ivh replication-manager-osc-.2.2.25-1.x86_64.rpm

2. 后端DB集群的Master节点创建用户并授权

#修改本地root密码
alter user root@'localhost' identified with mysql_native_password by '123';

#创建复制用户
create user 'repuser'@'172.31.0.%' identified with mysql_native_password by 'repuser123'; 
grant replication slave on *.* to 'repuser'@'172.31.0.%'; 

#创建replication_manager管理用户
create user 'manager'@'172.31.0.%' identified with mysql_native_password by 'manager123';   
grant select,reload,process,super,replication slave,replication client on *.* to 'manager'@'172.31.0.%';

3. 编辑全局配置文件

全局配置文件中配置的参数,会对 include 参数设置的路径下的所有 .toml 文件生效

vim /etc/replication-manager/config.toml
[Default]
include = "/etc/replication-manager/cluster.d" #所有集群配置文件的目录,该参数必须设置
monitoring-save-config = false
log-file = "/var/log/replication-manager.log"
log-level = 3 #1-7,>3会非常详细,仅用于调试
log-rotate-max-age = 7 #保存7天的日志
monitoring-datadir = "/var/lib/replication-manager" #一些监控文件的保存路径,会以集群名在该路径下创建目录
db-servers-connect-timeout = 5  #数据库连接超时时间(以秒为单位)。如果在该值之前无法建立连接,服务器将超时。
db-servers-read-timeout = 10 #数据库 I/O 读取超时(以秒为单位)。 如果在已经建立的连接上,在等于该选项值的时间段内没有收到数据,服务器将超时。
##########
## HTTP ##
##########
http-server = true
http-bind-address = "0.0.0.0"
http-port = "10001"
http-auth = false
http-session-lifetime =   3600
http-bootstrap-button = false
http-refresh-interval = 4000
##############
## FAILOVER ##
##############
failover-at-sync = true #仅当状态半同步为最后状态同步时才进行故障转移。配合半同步使用,保证切换时数据不丢失
failover-max-slave-delay = 0 #切换选主时,如果从库延时大于此值,则不进行切换
failover-limit = 0  #故障转移的最大次数,超过此值则不再进行故障转移,0表示无限制
failover-mode = "automatic"  #故障转移模式为自动,想要手动使用参数"manual"
failover-readonly-state = true #故障转移后重新构建的主从关系,将从库设置为只读
failover-falsepositive-ping-counter=5  #5次ping探活失败后进行failover
failover-falsepositive-heartbeat = true #如果一个从站仍然可以从主站获取事件,则取消故障转移。
failover-falsepositive-heartbeat-timeout = 2 #心跳检测的超时时间
failover-time-limit=0      #该值时间(秒)内再次发生故障不切换,防止硬件问题或网络问题,默认值0
#########
## API ##
#########
api-credentials = "admin:repman"
api-port = "10005"
api-https-bind = false

4. 编辑每个集群的配置文件

#集群1配置文件
vim /etc/replication-manager/cluster.d/cluster_5733.toml 
[cluster_5733]                    #定义集群名称
title = "test_cluster_5733"              #托管集群的明确描述
db-servers-hosts = "172.31.0.101:5733,172.31.0.102:5733,172.31.0.103:5733"  #定义集群主机列表
db-servers-prefered-master = "172.31.0.102:5733"  #指定切换后的master
db-servers-ignored-hosts = "172.31.0.103:5733"    #指定切换选主时忽略的主机,如果本组件在集群中某个节点安装,则可设置此选项
db-servers-credential = "manager:manager123"     #replication-manger管理账号与密码
replication-credential = "repuser:repuser123"   #主从账号
db-servers-binary-path = "/usr/local/mysql_5733/bin"  #指定本集群二进制包的位置
failover-post-script = "/etc/replication-manager/vip_up_5733.sh"  #指定vip漂移脚本

#集群2配置文件
vim /etc/replication-manager/cluster.d/cluster_5738.toml 
[cluster_5738]                    #定义集群名称
title = "test_cluster_5738"              #托管集群的明确描述
db-servers-hosts = "172.31.0.101:5738,172.31.0.102:5738,172.31.0.103:5738"  #定义集群主机列表
db-servers-prefered-master = "172.31.0.102:5738"  #指定切换后的master
db-servers-ignored-hosts = "172.31.0.103:5738"    #指定切换选主时忽略的主机,如果本组件在集群中某个节点安装,则可设置此选项
db-servers-credential = "manager:manager123"     #replication-manger管理账号与密码
replication-credential = "repuser:repuser123"   #主从账号
db-servers-binary-path = "/usr/local/mysql_5738/bin"  #指定本集群二进制包的位置
failover-post-script = "/etc/replication-manager/vip_up_5738.sh"  #指定vip漂移脚本

5. 故障转移脚本

vim /etc/replication-manager/vip_up.sh
#!/bin/bash
# 当前脚本适用于中间件为 replication-manager 的高可用VIP切换
# 接收传入参数 cluster.oldMaster.Host cluster.master.Host cluster.oldMaster.Port cluster.master.Port
 
orig_master=$1
new_master=$2
old_port=$3
new_port=$4
emailaddress="email@example.com"
sendmail=0
 
# 根据环境配置,interface,vip ,ssh_options,ssh_user 需要根据实际情况更改。
# 网卡名称
interface=eth0
# VIP
vip=172.31.0.188
# ssh用户
ssh_options=''
ssh_user='root'
 
# discover commands from our path
ssh=$(which ssh)
arping=$(which arping)
ip2util=$(which ip)
 
# command for adding our vip
cmd_vip_add="sudo -n $ip2util address add ${vip}/24 dev ${interface}"
# command for deleting our vip
cmd_vip_del="sudo -n $ip2util address del ${vip}/24 dev ${interface}"
# command for discovering if our vip is enabled
cmd_vip_chk="sudo -n $ip2util address show dev ${interface} to ${vip%/*}/32"
# command for sending gratuitous arp to announce ip move
cmd_arp_fix="sudo -n $arping -c 1 -I ${interface} ${vip%/*}"
# command for sending gratuitous arp to announce ip move on current server
cmd_local_arp_fix="sudo -n $arping -c 1 ${vip%/*}"
 
vip_stop() {
rc=0
 
 # ensure the vip is removed
 $ssh ${ssh_options} -tt ${ssh_user}@${orig_master} \
 "[ -n \"\$(${cmd_vip_chk})\" ] && ${cmd_vip_del} && sudo ${ip2util} route flush cache || [ -z \"\$(${cmd_vip_chk})\" ]"
 rc=$?
 return $rc
}
 
vip_start() {
 rc=0
 # ensure the vip is added
 # this command should exit with failure if we are unable to add the vip
 # if the vip already exists always exit 0 (whether or not we added it)
 $ssh ${ssh_options} -tt ${ssh_user}@${new_master} \
 "[ -z \"\$(${cmd_vip_chk})\" ] && ${cmd_vip_add} && ${cmd_arp_fix} || [ -n \"\$(${cmd_vip_chk})\" ]"
 rc=$?
 $cmd_local_arp_fix
 return $rc
}
vip_status() {
 $arping -c 1 ${vip%/*}
    if ping -c 1 -W 1 "$vip"; then
        return 0
    else
        return 1
    fi
}
echo "`date +'%Y-%m-%d %T'` Master is dead, failover"
# make sure the vip is not available 
if vip_status; then 
    if vip_stop; then
        if [ $sendmail -eq 1 ]; then mail -s "$vip is removed from orig_master." "$emailaddress" < /dev/null &> /dev/null  ; fi
    else
        if [ $sendmail -eq 1 ]; then mail -s "Couldn't remove $vip from orig_master." "$emailaddress" < /dev/null &> /dev/null  ; fi
        exit 1
    fi
fi
if vip_start; then
      echo "`date +'%Y-%m-%d %T'` $vip is moved to $new_master."
      if [ $sendmail -eq 1 ]; then mail -s "$vip is moved to $new_master." "$emailaddress" < /dev/null &> /dev/null  ; fi
else
      echo "`date +'%Y-%m-%d %T'` Can't add $vip on $new_master!"
      if [ $sendmail -eq 1 ]; then mail -s "Can't add $vip on $new_master!" "$emailaddress" < /dev/null &> /dev/null  ; fi
      exit 1
fi
 
(2)赋予vip漂移脚本执行权限
[root@lpn002082 opt]# chmod +x /etc/replication-manager/vip_up.sh

6 普通用户操作故障转移

需要在visudo中添加相关权限,并在vip漂移脚本中指定添加好权限的用户

[root@qilin-03 replication-manager]# visudo   #添加以下权限
wanglu   ALL=(ALL)       NOPASSWD: /usr/sbin/ip address add 172.31.0.188/24 dev eth0 , /usr/sbin/ip address del 172.31.0.188/24 dev eth0 , /usr/sbin/ip address show dev eth0 to 172.31.0.188/24 , /usr/sbin/arping -c 1 -I eth0 172.31.0.188 , /usr/sbin/arping -c 1 172.31.0.188 , /usr/sbin/ip route flush cache

7. 服务启停

/etc/init.d/replication-manager start
/etc/init.d/replication-manager stop

或 replication-manager-osc --config=/etc/replication-manager/config.toml monitor  #不常用

8. console界面进行快捷操作

#进入某集群的console界面
replication-manager-cli console --cluster=cluster_5733

#快捷操作
Ctrl + S 执行 switchover
Ctrl-(N|P) 切换集群

在这里插入图片描述

9. 命令行操作

#某集群进行switchover
replication-manager-cli switchover --cluster='test_cluster'

#某集群进行switchover,并指定新主节点
replication-manager-cli switchover --cluster='cluster_5738' --db-servers-prefered-master='172.31.0.102:5738'

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Replication Manager 管理多个MySQL集群 的相关文章

  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • 在 MySQL 中存储表情符号的编码问题:如何使用 Prisma ORM 在 NodeJS 中定义字符排序规则?

    亲爱的 Nodejs 专家和数据库专家 我们在 MySQL 数据库中存储表情符号和其他特殊字符时遇到问题 我们使用 Prisma 得到一个错误 这是我们使用的 ORM 参数无法从排序规则 utf8 general ci 转换为 utf8mb
  • 从按日期时间排序的 MySQL 表中获取用户的最后一个条目

    我有一张看起来像这样的桌子 USERNAME DATA DATETIME Jhon text1 2010 06 01 16 29 43 Mike text2 2010 06 01 16 29 22 Silver text3 2010 05
  • 在 C# 中,当有人插入、删除或修改记录时,如何从 MySQL 获取事件?

    我正在 WPF Net 中开发一个程序 我需要知道何时有人对数据库的任何表进行更改 这个想法是在数据库发生更改时从数据库接收一个事件 我读了很多文章 但找不到解决我的问题的方法 亲切的问候 最好的解决方案是使用消息队列 在您的应用程序向数据
  • MySQL - 从临时表插入

    这看起来非常简单 但我坚持使用简单的插入语句 见下文 begin work CREATE TEMPORARY TABLE IF NOT EXISTS insert table AS select r resource id fr file
  • 不允许在 php 中连接到此 MariaDB 服务器

    我尝试在 php 中连接远程服务器数据库 但出现以下错误 Host xx xxx xx xx is not allowed to connect to this MariaDB server in 我的连接代码是这样的 servername
  • 如何优化这个MySQL慢(非常慢)查询?

    我有一个 2 GB 的 mysql 表 包含 500k 行 我在没有负载的系统上运行以下查询 select from mytable where name in n1 n2 n3 n4 bunch more order by salary
  • Windows 8.1 升级后 Apache 无法工作 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 今天从 Windows 8 升级到 Windows 8 1 后 Apache 不再工作 我上次从 Windows 7 升级到 Window
  • 从另一台计算机访问 MYSQL

    我想开发一个java桌面应用程序 我想在其中设置服务器 这意味着我在这里使用mysql db 该数据库将仅存储在一台电脑上 其余所有用户都可以访问该数据库 所以 我听说了mysql远程连接 其中尝试了一些事情 这些措施如下 我的电脑已连接w
  • MySQL 和 Hibernate 之间的主键自增由谁负责?

    MySQL CREATE TABLE role id role INT 11 unsigned NOT NULL AUTO INCREMENT PRIMARY KEY id role AUTO INCREMENT 1 休眠 Entity p
  • Google Cloud SQL 在重新启动时卡住

    我的云 sql 实例长时间处于重新启动状态 在操作窗格中 重新启动的状态显示为待处理 并且还发生了导出 其状态仍为Running 有没有办法可以强制重新启动或取消重新启动或从常规备份中恢复数据 不 没有办法 如果您向 Google 支付高级
  • 只获取倒数第二条记录 - mysql-query

    我有一个如下表记录 my table id rating description 1 0 0 bed 2 1 0 good 3 0 0 bed 4 1 0 good 5 0 0 bed 6 0 0 bed 7 0 0 bed 现在我通过评级
  • PHP MYSQL文件内容转义问题

    我正在尝试使用 php 将 pdf 文件上传到 mysql 数据库中 除了文件内容之外 一切都很好 无论我如何尝试转义特殊字符 查询总是失败 主要是 未知命令 n 我使用过addslashes mysql real escape strin
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 如何在 MySQL 中测试 Select for Update

    我正在表演SELECT FOR UPDATE或 InnoDB 表的行级锁定 我的目的是只有一个请求可以读取同一行 因此 如果两个用户同时请求相同的数据 其中只有一个人获取数据 即第一个触发查询的人 但是我如何测试锁定是否已放置 因为我正在通
  • mysql 中的二进制、十六进制和八进制值

    我对在 mysql 数据库中使用二进制 十六进制和八进制系统非常感兴趣 首先 请给我一个建议 为什么我们在存储信息时需要它们 因为信息太多 或者为什么 另外 哪种类型的值必须存储在标记系统中 另外这里还有像 这是例子 gt SELECT 5
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • MySQL 与日语字符

    我试图弄清楚如何创建一个表 以便我可以在其中插入日语名字 现在我有 Type InnoDB Encoding UTF 8 Unicode utf8 Collation utf8 general ci 但是 当我插入字符时 它显示为 当我使用
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同

随机推荐