MySQL MHA高可用配置及故障切换

1、什么是MHA

MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。
MHA的出现就是解决MySQL 单点的问题。
MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。
MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。

2、MHA组成

MHA Node(数据节点)

MHA Node运行在每台MySQL服务器上。

MHA Manager(管理节点)

MHA Manager可以单独部署在一台独立的机器上,管理多个master-slave集群;也可以部署在一台slave节点上。
MHA Manager会定时探测集群中的master节点。当master出现故障时,它可以自动将最新数据的slave提升为新的master, 然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

3、MHA特点

自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
目前MHA支持一主多从架构,最少三台服务,即一主两从

4、MHA工作原理

MHA Node 部署在每台MySQL服务器上,MHA Manger 可以单独部署在一台独立服务器 上或者某个从库服务器上。
MHA Manger 会定时探测MySQL集群中主库的状态,当主库出现故障,MHA Manger会自动将一台拥有最新数据的从库提升为新的主库,也会在新的主库生成写入VIP,然后还会将其他的从库重新指向新的主库做主从复制,从而保证MySQL集群的高可用。整个故障转移过程对客户端应用来说是完全透明的。

5、案例实施:搭建MySQL MHA高可用及故障切换

(1)准备工具

20.0.0.10:主服务器

20.0.0.20:从服务器1

20.0.0.30:从服务器2

20.0.0.40:MAH服务器,为主从服务器提供时钟源

(2)系统初始化

(3)主从复制配置

1)主从服务器设置时间同步

MAH服务器(20.0.0.40)配置提供时钟源

开启chronyd

注销官方源,添加本地源,重启chronyd,时间已同步

主从三台服务器(20.0.0.10/20/30)操作一致

注释原本官方源,添加本地提供时钟源的IP

使用timedatectl查看三台服务器时间是否一致

2)服务器修改主机名

主服务器(20.0.0.10)

从服务器1(20.0.0.20)

从服务器2(20.0.0.30)

MHA服务器(20.0.0.40)

主从服务器安装并开启mysql

 systemctl start mysqld

设置参数实现通过主机名管理这些主机(四台服务器同时修改,操作一致)

3)修改/etc/my.cnf文件,开启二进制日志和中继日志

主服务器(20.0.0.10)

server-id = 1 
log-bin=mysql-bin
binlog_format=mixed
relay-log=relay-log-bin    
relay-log-index=relay-log-bin.index
log-slave-updates = 1 

从服务器1(20.0.0.20)

server-id = 2 
log-bin=mysql-bin
binlog_format=mixed
relay-log=relay-log-bin    
relay-log-index=relay-log-bin.index
log-slave-updates = 1  

从服务器2(20.0.0.30)

server-id = 3
log-bin=mysql-bin
binlog_format=mixed
relay-log=relay-log-bin    
relay-log-index=relay-log-bin.index
log-slave-updates = 1

4)主从服务器创建mysql和mysqlbinlog的软链接(三台服务器同样操作)

ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqladmin /usr/sbin/

5)主从服务器创建并授权数据库主从复制和MHA用户

主服务器(20.0.0.10)

mysql -u root -pabc123
create user 'myslave'@'20.0.0.%' identified by 'myslave123';
grant replication slave on *.* to 'myslave'@'20.0.0.%';
create user 'manger'@'20.0.0.%' identified by 'manger123';
grant all on *.* to 'manger'@'20.0.0.%';
flush privileges;
show master status;

从服务器1(20.0.0.20)

mysql -u root -pabc123
create user 'myslave'@'20.0.0.%' identified by 'myslave123';
grant replication slave on *.* to 'myslave'@'20.0.0.%';
create user 'manger'@'20.0.0.%' identified by 'manger123';
grant all on *.* to 'manger'@'20.0.0.%';
flush privileges;
change master to master_host='20.0.0.10', master_port=3306, master_user='myslave', master_password='myslave123', master_log_file='mysql-bin.000001', master_log_pos=1223; ##file和pos值为主服务器查询的值
start slave;  
show slave status\G   #检查状态
set global read_only=1;   #设置为只读

从服务器2(20.0.0.30)

mysql -u root -pabc123
create user 'myslave'@'20.0.0.%' identified by 'myslave123';
grant replication slave on *.* to 'myslave'@'20.0.0.%';
create user 'manger'@'20.0.0.%' identified by 'manger123';
grant all on *.* to 'manger'@'20.0.0.%';
flush privileges;
change master to master_host='20.0.0.10', master_port=3306, master_user='myslave', master_password='myslave123', master_log_file='mysql-bin.000001',master_log_pos=1223; ##file和pos值为主服务器查询的值
start slave;
show slave status\G   #检查状态
set global read_only=1;   #设置为只读

6)主服务器验证

主服务器创建库和表,并插入数据

两台从服务器数据会同步

从服务器1(20.0.0.20)

从服务器2(20.0.0.30)

(4)部署MHA

1)安装MHA依赖的环境,首先安装epel源

MHA服务器(20.0.0.40)

[root@manger ~]# cd /etc/yum.repos.d/
[root@manger yum.repos.d]# ls
local.repo  repo.bak
[root@manger yum.repos.d]# mv repo.bak/* ./
[root@manger yum.repos.d]# mv local.repo repo.bak
[root@manger yum.repos.d]# yum install -y epel-release
[root@manger yum.repos.d]# yum install -y perl-DBD-MySQL \
  perl-Config-Tiny \
  perl-Log-Dispatch \
  perl-Parallel-ForkManager \
  perl-ExtUtils-CBuilder \
  perl-ExtUtils-MakeMaker \
  perl-CPAN

主服务器(20.0.0.10)

[root@mysql1 ~]# cd /etc/yum.repos.d/
[root@mysql1 yum.repos.d]# ls
local.repo  repo.bak
[root@mysql1 yum.repos.d]# mv repo.bak/* ./
[root@mysql1 yum.repos.d]# mv local.repo repo.bak
[root@mysql1 yum.repos.d]# yum install -y epel-release
[root@mysql1 yum.repos.d]# yum install -y perl-DBD-MySQL \
  perl-Config-Tiny \
  perl-Log-Dispatch \
  perl-Parallel-ForkManager \
  perl-ExtUtils-CBuilder \
  perl-ExtUtils-MakeMaker \
  perl-CPAN

从服务器1(20.0.0.20)

[root@mysql2 ~]# cd /etc/yum.repos.d/
[root@mysql2 yum.repos.d]# ls
local.repo  repo.bar
[root@mysql2 yum.repos.d]# mv repo.bar/* ./
[root@mysql2 yum.repos.d]# mv local.repo repo.bar
[root@mysql2 yum.repos.d]# yum install -y epel-release
[root@mysql2 yum.repos.d]# yum install -y perl-DBD-MySQL \
  perl-Config-Tiny \
  perl-Log-Dispatch \
  perl-Parallel-ForkManager \
  perl-ExtUtils-CBuilder \
  perl-ExtUtils-MakeMaker \
  perl-CPAN

从服务器2(20.0.0.30)

[root@mysql3 ~]# cd /etc/yum.repos.d/
[root@mysql3 yum.repos.d]# ls
local.repo  repos.bak
[root@mysql3 yum.repos.d]# mv repos.bak/* ./
[root@mysql3 yum.repos.d]# mv local.repo repos.bak
[root@mysql3 yum.repos.d]# yum install -y epel-release
[root@mysql3 yum.repos.d]# yum install -y perl-DBD-MySQL \
  perl-Config-Tiny \
  perl-Log-Dispatch \
  perl-Parallel-ForkManager \
  perl-ExtUtils-CBuilder \
  perl-ExtUtils-MakeMaker \
  perl-CPAN

2) 安装node组件

主服务器(20.0.0.10)

[root@mysql1 yum.repos.d]# cd /opt
[root@mysql1 opt]# ls
mha4mysql-node-0.57.tar.gz  mysql-5.7.44  mysql-boost-5.7.44.tar.gz  rh
[root@mysql1 opt]# tar xf mha4mysql-node-0.57.tar.gz
[root@mysql1 opt]# cd mha4mysql-node-0.57/
[root@mysql1 mha4mysql-node-0.57]# ls
AUTHORS  bin  COPYING  debian  inc  lib  Makefile.PL  MANIFEST  META.yml  README  rpm  t
[root@mysql1 mha4mysql-node-0.57]# perl Makefile.PL && make && make install

从服务器1(20.0.0.20)

[root@mysql2 yum.repos.d]# cd /opt/
[root@mysql2 opt]# ls
mha4mysql-node-0.57.tar.gz  mysql-5.7.44  mysql-boost-5.7.44.tar.gz  rh
[root@mysql2 opt]# tar xf mha4mysql-node-0.57.tar.gz
[root@mysql2 opt]# cd mha4mysql-node-0.57/
[root@mysql2 mha4mysql-node-0.57]# perl Makefile.PL && make && make install

从服务器2(20.0.0.30)

[root@mysql3 yum.repos.d]# cd /opt/
[root@mysql3 opt]# ls
mha4mysql-node-0.57.tar.gz  mysql-5.7.44  mysql-boost-5.7.44.tar.gz  rh
[root@mysql3 opt]# tar xf mha4mysql-node-0.57.tar.gz
[root@mysql3 opt]# cd mha4mysql-node-0.57/
[root@mysql3 mha4mysql-node-0.57]# perl Makefile.PL && make && make install

MHA服务器(20.0.0.40)

[root@manger yum.repos.d]# cd /opt/
[root@manger opt]# ls
mha4mysql-manager-0.57.tar.gz  mha4mysql-node-0.57.tar.gz  rh
[root@manger opt]# tar xf mha4mysql-node-0.57.tar.gz
[root@manger opt]# cd mha4mysql-node-0.57/
[root@manger mha4mysql-node-0.57]# perl Makefile.PL && make && make install
[root@manger mha4mysql-node-0.57]# cd ..
[root@manger opt]# tar xf mha4mysql-manager-0.57.tar.gz
[root@manger opt]# cd mha4mysql-manager-0.57/
[root@manger mha4mysql-manager-0.57]# perl Makefile.PL && make && make install

3)所有服务器配置无密码认证

MHA服务器(20.0.0.40)

在 manger 节点上配置到所有数据库节点的无密码认证

[root@manger mha4mysql-manager-0.57]# ssh-keygen -t rsa   ##一路回车
[root@manger mha4mysql-manager-0.57]# ssh-copy-id root@20.0.0.10
[root@manger mha4mysql-manager-0.57]# ssh-copy-id root@20.0.0.20
[root@manger mha4mysql-manager-0.57]# ssh-copy-id root@20.0.0.30

主服务器(20.0.0.10)

在 mysql1 上配置到数据库节点 mysql2 和 mysql3 的无密码认证

[root@mysql1 mha4mysql-node-0.57]# ssh-keygen -t rsa  ##一路回车
[root@mysql1 mha4mysql-node-0.57]# ssh-copy-id root@20.0.0.20
[root@mysql1 mha4mysql-node-0.57]# ssh-copy-id root@20.0.0.30

从服务器1(20.0.0.30)

在 mysql2 上配置到数据库节点 mysql1 和 mysql3 的无密码认证

[root@mysql2 mha4mysql-node-0.57]# ssh-keygen -t rsa  ##一路回车
[root@mysql2 mha4mysql-node-0.57]# ssh-copy-id root@20.0.0.10
[root@mysql2 mha4mysql-node-0.57]# ssh-copy-id root@20.0.0.30

从服务器2(20.0.0.30)

在 mysql3 上配置到数据库节点 mysql1 和 mysql2 的无密码认证

[root@mysql3 mha4mysql-node-0.57]# ssh-keygen -t rsa  ##一直回车
[root@mysql3 mha4mysql-node-0.57]# ssh-copy-id root@20.0.0.10
[root@mysql3 mha4mysql-node-0.57]# ssh-copy-id root@20.0.0.20

4)manger节点配置MHA

[root@manger mha4mysql-manager-0.57]# cd /opt/mha4mysql-manager-0.57/samples/scripts/
[root@manger scripts]# ls
master_ip_failover  master_ip_online_change  power_manager  send_report
[root@manger scripts]# cd ..
[root@manger samples]# ls
conf  scripts
[root@manger samples]# cp -a scripts/ /usr/local/bin
[root@manger samples]# cd !$
cd /usr/local/bin
[root@manger bin]# cp scripts/master_ip_failover /usr/local/bin/
[root@manger bin]# ls
apply_diff_relay_logs  masterha_check_repl  masterha_check_status  masterha_manager         masterha_master_switch    masterha_stop       purge_relay_logs  scripts
filter_mysqlbinlog     masterha_check_ssh   masterha_conf_host     masterha_master_monitor  masterha_secondary_check  master_ip_failover  save_binary_logs
[root@manger bin]# vim master_ip_failover
清空原来内容,进入命令模式,输入 :set paste 进入粘贴模式,将下面内容粘贴


#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
 
use Getopt::Long;
 
my (
    $command, $orig_master_host, $orig_master_ip,$ssh_user,
    $orig_master_port, $new_master_host, $new_master_ip,$new_master_port,
    $orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);
 
# 这里定义的虚拟IP配置要注意,这个ip必须要与你自己的集群在同一个网段,否则无效
my $vip = '20.0.0.100/24';
my $key = '1';
# 这里的网卡名称 “ens33” 需要根据你机器的网卡名称进行修改
# 如果多台机器直接的网卡名称不统一,有两种方式,一个是改脚本,二是把网卡名称修改成统一
# 我这边实际情况是修改成统一的网卡名称
my $ssh_start_vip = "sudo /sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig ens33:$key down";
my $ssh_Bcast_arp= "sudo /sbin/arping -I ens33 -c 3 -A $vip";
 
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,
    'orig_master_ssh_port=i' => \$orig_master_ssh_port,
    'new_master_host=s'  => \$new_master_host,
    'new_master_ip=s'    => \$new_master_ip,
    'new_master_port=i'  => \$new_master_port,
    'new_master_ssh_port' => \$new_master_ssh_port,
    'new_master_user' => \$new_master_user,
    'new_master_password' => \$new_master_password
 
);
 
exit &main();
 
sub main {
    $ssh_user = defined $ssh_user ? $ssh_user : 'root';
    print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$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();
        &start_arp();
            $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 \"`;
}
sub stop_vip() {
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
 
sub start_arp() {
    `ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {
    print
    "Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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";
}

5)创建MHA软件目录并拷贝配置文件

创建相关目录(所有节点)

MHA服务器(20.0.0.40)

[root@manger bin]# cd /usr/local/bin/scripts
[root@manger scripts]# cp master_ip_online_change power_manager /usr/local/bin/
[root@manger scripts]# cd /usr/local/bin/
[root@manger bin]# chmod +x master_ip_failover
[root@manger bin]# cd /opt/
[root@manger opt]# mkdir /opt/mysql-mha
[root@manger opt]# cd mysql-mha/
[root@manger mysql-mha]# mkdir mha-manger
[root@manger mysql-mha]# mkdir mha-node
[root@manger mysql-mha]# ls
mha-manger  mha-node
[root@manger mysql-mha]#
[root@manger mysql-mha]# vim mysql_mha.cnf
[root@manger mysql-mha]#

[server default]
manager_log=/opt/mysql-mha/manager.log
manager_workdir=/opt/mysql-mha/mha-manager
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=manger
password=manger123
port=3306
ping_interval=1
remote_workdir=/opt/mysql-mha/mha-node
repl_user=myslave
repl_password=myslave123
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.20 -s 20.0.0.30
shutdown_script=""
ssh_user=root

[server1]
hostname=20.0.0.10
port=3306

[server2]
hostname=20.0.0.20
port=3306

[server3]
hostname=20.0.0.30
port=3306

主服务器(20.0.0.10)

[root@mysql1 mha4mysql-node-0.57]# ifconfig ens33:1 20.0.0.100/24 ##跟你设置的vip一致
[root@mysql1 mha4mysql-node-0.57]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.10  netmask 255.255.255.0  broadcast 20.0.0.255
        inet6 fe80::947:89f3:4c57:3a9e  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:53:65:31  txqueuelen 1000  (Ethernet)
        RX packets 94145  bytes 112723820 (107.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 30645  bytes 3506206 (3.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.100  netmask 255.255.255.0  broadcast 20.0.0.255
        ether 00:0c:29:53:65:31  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 656  bytes 56848 (55.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 656  bytes 56848 (55.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:8f:c7:54  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@mysql1 mha4mysql-node-0.57]#

6)在manager节点上测试ssh无密码认证

MHA服务器(20.0.0.40)

[root@manger mysql-mha]# masterha_check_ssh -conf=/opt/mysql-mha/mysql_mha.cnf
Wed Jun 26 22:13:10 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Jun 26 22:13:10 2024 - [info] Reading application default configuration from /opt/mysql-mha/mysql_mha.cnf..
Wed Jun 26 22:13:10 2024 - [info] Reading server configuration from /opt/mysql-mha/mysql_mha.cnf..
Wed Jun 26 22:13:10 2024 - [info] Starting SSH connection tests..
Wed Jun 26 22:13:11 2024 - [debug]
Wed Jun 26 22:13:10 2024 - [debug]  Connecting via SSH from root@20.0.0.10(20.0.0.10:22) to root@20.0.0.20(20.0.0.20:22)..
Wed Jun 26 22:13:10 2024 - [debug]   ok.
Wed Jun 26 22:13:10 2024 - [debug]  Connecting via SSH from root@20.0.0.10(20.0.0.10:22) to root@20.0.0.30(20.0.0.30:22)..
Wed Jun 26 22:13:11 2024 - [debug]   ok.
Wed Jun 26 22:13:12 2024 - [debug]
Wed Jun 26 22:13:11 2024 - [debug]  Connecting via SSH from root@20.0.0.30(20.0.0.30:22) to root@20.0.0.10(20.0.0.10:22)..
Wed Jun 26 22:13:11 2024 - [debug]   ok.
Wed Jun 26 22:13:11 2024 - [debug]  Connecting via SSH from root@20.0.0.30(20.0.0.30:22) to root@20.0.0.20(20.0.0.20:22)..
Wed Jun 26 22:13:12 2024 - [debug]   ok.
Wed Jun 26 22:13:12 2024 - [debug]
Wed Jun 26 22:13:10 2024 - [debug]  Connecting via SSH from root@20.0.0.20(20.0.0.20:22) to root@20.0.0.10(20.0.0.10:22)..
Wed Jun 26 22:13:11 2024 - [debug]   ok.
Wed Jun 26 22:13:11 2024 - [debug]  Connecting via SSH from root@20.0.0.20(20.0.0.20:22) to root@20.0.0.30(20.0.0.30:22)..
Wed Jun 26 22:13:11 2024 - [debug]   ok.
Wed Jun 26 22:13:12 2024 - [info] All SSH connection tests passed successfully.
[root@manger mysql-mha]#

主从服务器(三台服务器都设置)

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

7)在 manager 节点上测试 mysql 主从连接情况

[root@manger mysql-mha]# masterha_check_repl -conf=/opt/mysql-mha/mysql_mha.cnf

8)在manager节点上启动MHA


nohup masterha_manager \
--conf=/opt/mysql-mha/mysql_mha.cnf \
--remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &
 
----------------------------------------------------------------------------------------------------------
--remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
--ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在 app1.failover.complete 日志文件中记录,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换, 除非在第一次切换后删除该文件,为了方便,这里设置为--ignore_last_failover。
----------------------------------------------------------------------------------------------------------
●使用&后台运行程序:结果会输出到终端;使用Ctrl+C发送SIGINT信号,程序免疫;关闭session发送SIGHUP信号,程序关闭。
●使用nohup运行程序:结果默认会输出到nohup.out;使用Ctrl+C发送SIGINT信号,程序关闭;关闭session发送SIGHUP信号,程序免疫。
●使用nohup和&配合来启动程序nohup ./test &:同时免疫SIGINT和SIGHUP信号。

[root@manger mysql-mha]# nohup masterha_manager \
> --conf=/opt/mysql-mha/mysql_mha.cnf \
> --remove_dead_master_conf \
> --ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &
[1] 13289
[root@manger mysql-mha]# masterha_check_status -conf=/opt/mysql-mha/mysql_mha.cnf
mysql_mha (pid:13289) is running(0:PING_OK), master:20.0.0.10
[root@manger mysql-mha]#

(3)模拟故障切换

MHA服务器(20.0.0.40)

mha故障切换后会自动退出进程

[root@manger mysql-mha]# ps -aux | grep mha
root      14015  0.0  0.0 112824   984 pts/2    S+   00:08   0:00 grep --color=auto mha
[root@manger mysql-mha]#
[root@manger mysql-mha]# vim mysql_mha.cnf


从服务器1(20.0.0.20)

从服务器2(20.0.0.30)

若原master修复完成,如何加入到集群中?

如何恢复原先20.0.0.10做主服务器?

修改MHA服务器(20.0.0.40)

[root@manger mysql-mha]# vim mysql_mha.cnf
[root@manger mysql-mha]#


###启动MHA
nohup masterha_manager --conf=/opt/mysql-mha/mysql_mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &
###检查状态
masterha_check_status -conf=/opt/mysql-mha/mysql_mha.cnf
[root@manger mysql-mha]# nohup masterha_manager --conf=/opt/mysql-mha/mysql_mha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &
[1] 14351
[root@manger mysql-mha]# masterha_check_status -conf=/opt/mysql-mha/mysql_mha.cnf
mysql_mha (pid:14351) is running(0:PING_OK), master:20.0.0.20
[root@manger mysql-mha]#

(4)mysql集群(MHA高可用集群)部署总结

1.采用一主两从架构
2.一主两从先做主从复制
3.给MHA进行登录授权,访问数据库的授权
4.所有数据库节点安装mha node 组件,manager服务器还要安装mha manager 组件
5.所有服务器相互组件做ssh免交互登录
6.manager上准备好VIP故障转移脚本和MHA配置文件
7.在master上创建VIP地址
8.启动MHA进程并做故障转移测试

主从复制步骤

(1)主从服务器先做时间同步
(2)修改主从数据库的配置文件,主库开启二进制日志,从库开启中继日志
(3)在主库创建主从复制的用户,并授予主从复制的权限
(4)在从库使用 change master to 对接主库,并 start slave 开启同步
(5)在从库使用 show slave status\G 查看 IO线程和 SQL线程的状态是否都为 YES

  • 22
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值