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集群 的相关文章

  • Zend Mysql 获取 ENUM 值

    I use Zend Framework在我的应用程序中 我想知道如何从 ENUM 字段中获取值MySQL table 例如 我有permissions field ENUM 删除管理员 edit admin 如何以最佳方式获取数组 删除管
  • 如何合并不同 MySQL 列中的日期和时间以与完整的 DateTime 进行比较?

    Column d是日期 列t是时间 列v例如 是 INT 假设我需要 2012 年 2 月 1 日 15 00 及之后记录的所有值 如果我写 SELECT FROM mytable WHERE d gt 2012 02 01 AND t g
  • 在php中循环多维数组并执行mysql插入(股票数据)

    我有一个多维数组 我希望循环遍历它并为数组中的值执行 mysql 数据库插入 我需要插入到 sql 查询中的数组值是 candles 0 complete candles 0 volume candles 0 mid h candles 0
  • Mysql - 如何搜索26条以字母开头的记录?

    基本上 我正在尝试创建一个查询 该查询可以根据英语字母表中的字母 26 个字母 从表中检索 26 个单词 所以 苹果 香蕉 椰子 等等 我一直在使用 like a 所以 SELECT from word WHERE word name li
  • MySQL - 将字段的默认值设置为字符串连接函数

    我有一个看起来有点像这个的表 actor forename surname stage name 我想将 stage name 更新为默认值 forename surname So that insert into actors foren
  • SQL IN 子句比单个查询慢

    我正在使用 Hibernate 的 JPA 实现和 MySQL 5 0 67 MySQL 配置为使用 InnoDB 在执行 JPA 查询 转换为 SQL 时 我发现使用IN子句比执行单个查询慢 例子 SELECT p FROM Person
  • 使用 JdbcTemplate 进行动态查询

    我有一个关于使用 JdbcTemplate 进行动态查询的问题 我的代码如下 String insertQueries INSERT INTO tablename StringJoiner joiner new StringJoiner S
  • 在MySQL中永久设置auto_increment_offset

    我以 root 身份运行命令 set auto increment offset 2 但从其他连接上看不到效果 为什么不 它是全球性的 From http dev mysql com doc refman 5 1 en replicatio
  • GROUP_CONCAT 逗号分隔符 - MySQL

    我有一个疑问 我在哪里使用GROUP CONCAT和自定义分隔符 因为我的结果可能包含逗号 这一切都运行良好 但它仍然以逗号分隔 所以我的输出是 Result A Result B Result C 我怎样才能做到这一点 输出是 Resul
  • 如何在 Eclipse 中使用 MySql 数据库

    我对编程非常陌生 所以请耐心等待 如果一开始我没有理解的话 请提前道歉 我正在做一个本科编程项目 需要在 Java 程序中创建一些数据库 我正在使用 eclipse galilo 来编写我的程序 我已经下载了一个连接器 J 但还不知道应该如
  • 在带有 OR 条件的 LEFT JOIN 中使用索引

    考虑以下查询 SELECT FROM table1 LEFT JOIN table2 ON table2 some primary key table1 some primary key LEFT JOIN table3 ON table3
  • SQL Server到Mysql迁移(使用Mysql Workbench)数据传输错误

    我正在使用 Mysql Work bench 6 3 将数据库从 MS Sql server 2008 迁移到 Mysql 在 批量数据传输 期间出错并出现以下警告 这种情况仅发生在像 varchar char 这样的列类型上 当我尝试使用
  • 将表与同一个表的前一条记录连接起来

    我有一个包含历史记录的表 由主表中的多个触发器发布到那里 我想在历史表上创建一个 select 语句 其中每个记录都由其先前的记录 由相同的 LineID 和最高的 ActionDate 标识 连接 这样我就可以提取这两者之间的差异 我尝试
  • 工厂模式数据库连接

    我正在尝试使用 MySQL 实现数据库连接上的工厂模式 SQL Server 面临奇怪的错误 你调用的对象是空的 在 SQL 命令对象上 internal class SqlServerDB IDatabase private SqlCon
  • 一次将多个值插入MySQL [重复]

    这个问题在这里已经有答案了 谁能解释一下为什么这个 PHP MySQL 不起作用 基本上我需要从表单中一次插入大量行 因此会有多个名称字段 多个短 中 长字段等 我收到此错误 Notice Undefined variable Short1
  • SimpleSAMLPHP 重定向循环

    我们正在尝试使用自定义 mysql 数据库设置 sso 但它在以下两个请求之间进入无限循环 POST http 192 168 0 15 simplesaml module php core loginuserpass php 设置Cook
  • 我应该为 MySQL 使用什么 python 3 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 据我所知 MySQLdb 仍然没有移植到 Python 3 pypy 上似乎有另一个名为 PyMySQL
  • 在无文本搜索查询中使用 sphinx 与 MySQL

    我有这样的疑问 假设我有一个大表 与一个较小的用户表有关系 这个想法是在那个真正的大表中搜索大于给定日期的日期并按分数 例如大整数 排序 并同时获取相关的用户信息 此查询的结果大约每 10 分钟就会更改一次 所以 没有文本搜索 但我有一个非
  • 在 MySQL 中搜索多个单词

    我使用 HTML 表单来允许用户查找数据库表中的条目
  • PHP 中的嵌套 JSON 输出

    我正在为 iOS 应用程序构建 API 并尝试将 mySQL 数据转换为 JSON 字符串进行处理 所需的输出将需要顶级订单详细信息 例如客户名称和地址 然后是订购的产品子数组 我需要的两个表中有相当多的字段 我希望拥有所有字段 我已经构建

随机推荐