记录一下搭建MHA主从的完整过程,同时也把自己部署过程中遇到的坑写进来

参考链接:

https://blog.csdn.net/m0_49526543/article/details/109483659

https://blog.csdn.net/hahaxixi131/article/details/122282665

https://www.cnblogs.com/jiabrother/p/14108302.html

先说一下内网的环境,MHA要求至少一主二从,可以根据实际情况添加从服务器数量

mysql主服务器地址: 192.168.100.151

mysql从服务器地址(2台):192.168.100.152 192.168.100.158

mha manager服务器: 192.168.100.161

分别在主服务器和从服务器安装mysql服务,这里就不写具体安装细节了

1. 配置mysql主从

主服务器:

mysql配置添加:

$ vim /usr/local/mysql/my.cnf

[mysqld]
server-id = 1 //指定id号,服务器的唯一标识,不能相同
log-bin=master-bin //主服务器日志文件
log-slave-updates=true

重启服务:

$ systemctl restart mysqld

两台从服务器

$ vim /usr/local/mysql/my.cnf
[mysqld]
server-id = 3
log-bin=master-bin //slave1 里加上 ,slave2 不用加
relay-log=relay-log-bin //从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index //定义relay-log的位置和名称

重启服务

$ systemctl restart mysqld

给三台服务器做软链接

$ ln -s /usr/local/mysql/bin/mysql /usr/sbin/
$ ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

数据库的授权。在所有的数据库节点上授权两个用户,一个是从库同步使用,另外一个是 manager 使用监控,即在master、slave1、slave2 上搭建。

mysql-root> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
mysql-root> CREATE USER 'mha'@'%' IDENTIFIED BY '123456';
mysql-root> grant replication slave on *.* to 'slave'@'%';
mysql-root> grant all privileges on *.* to 'mha'@'%';
mysql-root> flush privileges;     //刷新数据库的权限相关表

从服务器上登录mysql 执行命令:

mysql-slave> change master to master_host='192.168.100.201',master_user='slave',master_password='123456',master_log_file='master-bin.000002',master_log_pos=1562;
mysql-slave> start slave;
#查看slave状态
mysql-slave> show slave status\G

必须设置从库为只读:

mysql-slave> set global read_only=1;
mysql-slave> flush privileges;
2 安装并配置keepalived

安装keepalived的目的是把主从数据库的ip地址映射到一个统一的虚拟IP地址 这样主节点一旦宕机会自动把新升级为主节点的机器ip映射到这个虚拟IP上,项目只要通过这个固定的虚拟IP访问数据库就可以了。

安装keepalived

$ yum install -y keepalived

配置keepalived

主数据库节点

! Configuration File for keepalived

global_defs {

notification_email {

xxxxx@123.com.cn ######定义接受邮件的邮箱

}

notification_email_from jiankong@staff.tuge.com ######定义发送邮件的邮箱

smtp_server 127.0.0.1

smtp_connect_timeout 10

}

vrrp_instance vrrptest { ######定义vrrptest实例

state BACKUP ######服务器状态 采用 backup -> backup 模式 全部配置成BACKUP

interface ens192 ######使用的接口 通过ip addr 或 ifconfig查询 不同的机器配置的网卡不一样

virtual_router_id 61 ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换 不要使用默认的51 需要更换一个其他的

priority 100 ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER

advert_int 1 ######服务器之间的存活检查时间

nopreempt

authentication {

auth_type PASS ######认证类型
auth_pass 1111 ######认证密码,一组lvs 服务器的认证密码必须一致

}

virtual_ipaddress { ######虚拟IP地址

192.168.100.190/24

}
}

从数据库节点

! Configuration File for keepalived
global_defs {

notification_email {

xxxxx@123.com.cn

}

notification_email_from jiankong@staff.tuge.com

smtp_server 127.0.0.1

smtp_connect_timeout 10

}

vrrp_instance vrrptest {

state BACKUP

interface ens192

virtual_router_id 61

priority 80

advert_int 1

nopreempt

authentication {

auth_type PASS
auth_pass 1111

}

virtual_ipaddress {

192.168.100.190/24

}

}

启动keepalived

$ sudo systemctl start keepalived  #启动keepalived
$ sudo systemctl status keepalived #查看状态

验证keepalived是否生效

关闭主节点上的keepalived服务

$ systemctl stop keepalived
$ systemctl status keepalived

在每台从节点上执行ip addr,看VIP是否漂移到优先级第二高的节点上了

手动启动原主节点上的keepalived服务

$ systemctl start keepalived
$ systemctl status keepalived

3. 安装MHA

所有的服务器都需要mha的依赖环境 首先安装epel源

$ yum install epel-release --nogpgcheck -y

$ yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN

Centos系统 mha只支持到7.9 Centos8以上的版本不支持

manager节点需要先安装mha4mysql-node 然后安装mha4mysql-manager 顺序不要搞反

其他服务器只需要安装mha4mysql-node就可以了

安装包下载地址:

mha官网:https://code.google.com/archive/p/mysql-master-ha/

github下载地址

https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58

https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58

解压安装包

$ tar zxvf mha4mysql-node-0.57.tar.gz
$ cd mha4mysql-node-0.57/
$ perl Makefile.PL
$ make && make install

manager节点安装manager

$ tar zxvf mha4mysql-manager-0.57.tar.gz
$ cd mha4mysql-manager-0.57/
$ perl Makefile.PL
$ make && make install
4. 建立SSH互信

manager节点(1主+两从的互信):

$ ssh-keygen -t rsa     //一路按回车键
$ ssh-copy-id 192.168.100.151 //按yes回车输入ssh登录密码
$ ssh-copy-id 192.168.100.152
$ ssh-copy-id 192.168.100.158

主服务器(配置两个从服务器的互信):

$ ssh-keygen -t rsa     //一路按回车键
$ ssh-copy-id 192.168.100.151 //按yes回车输入ssh登录密码
$ ssh-copy-id 192.168.100.152
$ ssh-copy-id 192.168.100.158

从服务器1(主+从2):

$ ssh-keygen -t rsa     //一路按回车键
$ ssh-copy-id 192.168.100.151 //按yes回车输入ssh登录密码
$ ssh-copy-id 192.168.100.158

从服务器2(主+从1):

$ ssh-keygen -t rsa     //一路按回车键
$ ssh-copy-id 192.168.100.151 //按yes回车输入ssh登录密码
$ ssh-copy-id 192.168.100.152

显示如下信息表示建立完成:

测试一下:

$ ssh 192.168.100.151 #能够正常登录即为互信连接成功

5 配置MHA

 在manager节点上复制相关脚本到/usr/local/bin 的目录
$ cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

创建目录 /etc/masterha/

创建配置文件 /etc/masterha/app1.cnf

复制以下内容到配置文件中:

注意 配置项的key value以及等于号之间不能有空格 不然无法执行 并且没有报错信息 这是个大坑!!!

[server default]
#manager日志
manager_log=/etc/masterha/manager.log
#manager工作目录
manager_workdir=/etc/masterha
#master保存binlog的位置
master_binlog_dir=/usr/local/mysql/data
#设置自动failover时候的切换脚本 后边来改
master_ip_failover_script=/usr/local/bin/master_ip_failover
#设置mysql中root用户的密码
ssh_user=root
#从库访问主库的账号
repl_user=slave
#从库访问主库的密码
repl_password=123456
#mha_manager访问主库的账号
user=mha
#mha_manager访问主库的密码
password=123456
# 主节点
[server1]
hostname=192.168.100.151
port=3306
candidate_master=1
#从节点1
[server2]
candidate_master=1
hostname=192.168.100.152
port=3306
#从节点2
[server3]
hostname=192.168.100.158
port=3306

配置MHA与keepalived联动脚本

$ vim /usr/local/bin/master_ip_failover

内容如下:

#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
my $vip = '192.168.100.190';
my $ssh_start_vip ="sudo systemctl start keepalived";
my $ssh_stop_vip ="sudo systemctl stop keepalived";
GetOptions(
'command=s' =>\$command,
'ssh_user=s' =>\$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' =>\$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' =>\$new_master_host,
'new_master_ip=s' =>\$new_master_ip,
'new_master_port=i' =>\$new_master_port,
);
exit &main();
sub main {
print "\n\nIN SCRIPTTEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host\n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIPon the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status--orig_master_host=host --orig_master_ip=ip --orig_master_port=port--new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}

赋予该脚本权限

$ chmod +x /usr/local/bin/master_ip_failover
6 测试MHA是否正确配置

测试ssh互信

$  masterha_check_ssh -conf=/etc/masterha/app1.cnf
#返回 All SSH connection tests passed successfully.表示正常

测试mha健康状态

$  masterha_check_repl -conf=/etc/masterha/app1.cnf
#返回 MySQL Replication Health is OK. 表示正常

启动MHA

$ nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

启动成功后,可用过如下命令来查看master节点的状态(启动完成需要一段时间):

$ masterha_check_status --conf=/etc/mha_master/app1.cnf

如果要停止MHA,需要使用master_stop命令。

$ masterha_check_status --conf=/etc/masterha/app1.cnf
6 存在的坑

MHA构建中的报错集中解决方案:

https://blog.csdn.net/weixin_49228721/article/details/110879425

https://blog.51cto.com/u_14557905/2466478

我遇到的问题如下:

  1. app1.cnf的配置中 key value 和等号之间不能有空格

    错误写法:

    [server default]
    manager_log = /etc/masterha/manager.log
    manager_workdir = /etc/masterha

    正确写法:

    [server default]
    manager_log=/etc/masterha/manager.log
    manager_workdir=/etc/masterha
  2. 测试时报错: There is no alive server. We can't do failover...

    解决方法:

    在主库执行命令:

    mysql-master>ALTER USER 'mha'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    mysql-master>FLUSH PRIVILEGES;
    mysql-master>ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    mysql-master>FLUSH PRIVILEGES;

    从库执行命令

    mysql-master>ALTER USER 'mha'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
    mysql-master>FLUSH PRIVILEGES;
  3. 安装MHA的服务器要关闭防火墙的端口限制

  4. 报错:sh: mysql: command not found

    不知道为什么会导致软连接失效 重新建立一下软连接即可

记录一下配置mysql高可用(MHA)的过程及踩到的坑的更多相关文章

  1. Mysql 高可用(MHA)-读写分离(Atlas)-分布式架构(Mycat)

    Mysql 高可用(MHA)-读写分离(Atlas) 1. 搭建主从复制(一主两从) 1.1 准备环境 1 主库:10.0.0.51/db01 2 从库:10.0.0.52/db02,10.0.0.5 ...

  2. 第九章 MySQL 高可用(MHA)

    MySQL 高可用(MHA) 一 MHA高可用部署 需要使用的前提: 当普通主从复制不能满足我们的需求,  主节点宕机  影响业务的不间断运行.这里就需要用到MHA 高可用 1. MHA高可用的介绍 ...

  3. MySQL高可用MHA实战

    MySQL高可用架构MHA介绍 简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职 ...

  4. MySQL 高可用MHA安装部署以及故障转移详细资料汇总 转

    http://blog.itpub.net/26230597/cid-87082-list-2/ 1,简介 .1mha简介 MHA,即MasterHigh Availability Manager a ...

  5. MySQL高可用方案-PXC环境部署记录

    之前梳理了Mysql+Keepalived双主热备高可用操作记录,对于mysql高可用方案,经常用到的的主要有下面三种: 一.基于主从复制的高可用方案:双节点主从 + keepalived 一般来说, ...

  6. 配置drbd高可用集群

    前期准备: 同步时间 (两个节点) 节点一(172.16.21.6) [root@stu21 heartbeat2]# ntpdate 172.16.0.1 31 Dec 20:59:25 ntpda ...

  7. MySQL 高可用:mysql+Lvs+Keepalived 负载均衡及故障转移

    系统信息: mysql主库 mysql从库 VIP 192.168.1.150 mysql 主主同步都设置 auto-increment-offset,auto-increment-increment ...

  8. MySQL高可用架构-MHA环境部署记录

    一.MHA介绍 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司) ...

  9. MySQL高可用架构之MHA

    简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是 ...

  10. MySQL高可用之MHA的搭建 转

     http://www.cnblogs.com/muhu/p/4045780.html http://www.cnblogs.com/gomysql/p/3675429.html http://www ...

随机推荐

  1. [啊哈!算法] 零基础彻底弄懂"并查集"

    今天是算法数据结构专题的第5篇文章,我们一起来学习一下「并查集」. 并查集被很多ACMer认为是最简洁而优雅的数据结构之一,主要用于解决一些元素分组的问题.并支持两种操作: 合并(Union):把两个 ...

  2. 传统能源转型:数字孪生智慧火电厂 3D 可视化

    前言 火力发电厂满足了全世界将近五成的电力需求,在我国超过半数以上的电力来源于火力发电.随着双碳政策的推行,在国家清洁能源消纳和环保的需求下,对火电厂在深度调峰.超低排放.灵活运行等方面提出了更高要求 ...

  3. 构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

    作者|柳下 概述 随着企业规模和数据量的增长,数据的价值越来越受到重视.数据的变化和更新变得更加频繁和复杂,因此及时捕获和处理这些变化变得至关重要.为了满足这一需求,数据库 CDC(Change Da ...

  4. 如何用 7 分钟击破 Serverless 落地难点?

    当前,Serverless 覆盖的技术场景正在不断变广.Serverless 已在微服务.在线应用.事件驱动.任务处理等众多场景被验证且广泛应用 .当你想要部署一个网站时,需要自己购买服务器并花费时间 ...

  5. <vue 基础知识 6、条件判断标签v-if>

    代码结构 一.     01-v-if用法 1.效果 根据分数的不同展现不同的汉字 2.代码 01-v-if用法.html <!DOCTYPE html> <html lang=&q ...

  6. vue学习笔记 一、环境搭建

    系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...

  7. 当ChatGPT遇上了CoT

    最近在看CoT(Chain-of-Thought,思维链)方面的论文<Chain-of-Thought Prompting Elicits Reasoning in Large Language ...

  8. 使用Amber计算单点能三步走

    技术背景 Amber是一个在分子动力学中非常常用的一个软件,可以用于进行分子动力学模拟计算,可以与一些软件配合进行增强采样.这里我们简单介绍一下如何使用Amber去计算一个分子构象的单点势能值,及其对 ...

  9. P1914 小书童——凯撒密码

    1.题目介绍 小书童--凯撒密码 题目背景 某蒟蒻迷上了 "小书童",有一天登陆时忘记密码了(他没绑定邮箱 or 手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但 ...

  10. 【Linux】技术收集

    Linux进程间通信(六)---信号量通信之semget().semctl().semop()及其基础实验 https://blog.csdn.net/mybelief321/article/deta ...