首页 > 数据库 >MHA设置mysql的主从及遇到的坑

MHA设置mysql的主从及遇到的坑

时间:2023-10-13 10:02:07浏览次数:41  
标签:keepalived 192.168 MHA manager master ssh mysql 主从

记录一下搭建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 {       
​
 [email protected]  ######定义接受邮件的邮箱
​
}
​
notification_email_from [email protected] ######定义发送邮件的邮箱
​
 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 {       
​
 [email protected]
​
}
​
notification_email_from [email protected]
​
 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

 

img

如果要停止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

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

标签:keepalived,192.168,MHA,manager,master,ssh,mysql,主从
From: https://www.cnblogs.com/seizedays/p/17761223.html

相关文章

  • Skywalking APM监控系列(二、Mysql、Linux服务器与前端JS接入Skywalking监听)
    前言上篇我们介绍了Skywalking的基本概念与如何接入.NetCore项目,感兴趣可以去看看:SkywalkingAPM监控系列(一丶.NET5.0+接入Skywalking监听)本篇我们主要讲解一下Skywalking如何接入mysql数据库监听与Linux服务器的监听其实从Skywalking设计之初应该只是单独的链路跟踪,发......
  • MYSQL GROUP BY 对多个字段进行分组
    在平时的开发任务中我们经常会用到MYSQL的GROUPBY分组,用来获取数据表中以分组字段为依据的统计数据。比如有一个学生选课表,表结构如下:Table:Subject_SelectionSubjectSemesterAttendeeITB0011JohnITB0011BobITB0011Micke......
  • 深入MySQL索引,这篇千万不能错过
    大家好,我是【码老思】,索引是一个数据库绕不开的话题,今天和大家一起聊聊。1.索引索引是对数据库表中一列或多列的值进行排序的一种结构。MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。索引只是提高效率的一个因素,如果你的MySQL有大数据量......
  • hive数据清洗,导入mysql
    --用于清洗的表createtabledata1(`ip`stringcomment'城市',`date1`stringcomment'日期',`day`stringcomment'天数',`traffic`doublecomment'流量',`type`stringcomment'类型:视频video或文章art......
  • sql注入(mysql的重要语句语法)
    查询当前数据库服务器所有数据库showdatabases;选中某个数据库use数据库名查询当前数据库所有的表showtables;查询某表所有数据select*fromt1;(whereid=2;)union合并查询2个特性:前面的查询语句和后面的查询语句结果互不干扰前面的查询语句的字段数量和后面......
  • mysql 物理备份xtrabackup
    1.优缺点优点:a.备份过程快速可靠b.支持增量备份c.备份过程不会打断正在执行的事务d.能够基于压缩等功能节约磁盘和空间e.自动实现备份验证f.还原速度快缺点:a.只能对innodb表进行增备,myisam表备份是全备b.对myisam表进行备份时要对全库加readlock,阻塞写操作,若备份在从库上进行会......
  • 【2023年10月12日】stf61-MySQL数据库
     stf61-MySQL数据库前言1)为什么学?● 常见的笔试题● 有利于更好的开展测试工作2)学什么?理论:基本的术语和概念实操:数据库操作、表操作、数据操作、其他常见数据库功能3)怎么学?多在实训环境里练习,在练习中掌握 理论 数据库系统: 表:8条记录/行,6个字段/列 ......
  • pt-slave-repair - 自动修复MySQL主从同步数据
    pt-slave-repair介绍MySQL主从复制作为一种常见的数据同步方式,有时候会出现同步错误导致同步中断的情况。手动修复这些同步错误通常需要耗费时间和精力,并且对于不熟悉MySQL复制的人来说比较困难。pt-slave-repair是对原有pt-slave-restart工具的补充,它提供自动修复MySQL主从同步......
  • MySQL命令行监控工具 - mysqlstat
    mysqlstat是一个命令行工具,用于实时监控和分析MySQL服务器的性能指标和相关信息。它可以帮助DBA(数据库管理员)和开发人员定位和解决数据库性能问题。以下是mysqlstat工具的主要功能:实时监控:mysqlstat可以实时监控MySQL服务器的QPS(每秒查询数)、TPS(每秒事务数)以及网络......
  • nacos开机自启无法连接上本机的Mysql
    nacos和mysql处于同一台服务器的情况下才会遇到我说的这个问题。一、遇到的问题如下:nacos在设置了开机自启动脚本/usr/lib/systemd/system/nacos.service,并且设置了systemctlenablenacos。mysql给nacos使用的用户开启了%和localhost均可连接的权限。这种情况下,nacos开机自......