数据库MySQL相关

13 MySQL MHA集群

2019-02-12  本文已影响17人  Kokoronashi

MySQL MHA 集群

[toc]

MHA 简介

MHA ( Master High Availability )

MHA 组成

MHA 工作过程

部署 MHA 集群

部署MySQL 高可用集群 ( MHA + 主从同步 )

1549818084936

拓扑结构

拓扑图

1549817915989

IP 规划

角色 IP地址 主机名
Master主节点 192.168.1.101 test1
备用1主节点 192.168.1.102 test2
备用2主节点 192.168.1.103 test3
第一台slave 192.168.1.104 test4
第二台slave 192.168.1.105 test5
MHA_manager (无mysqld) 192.168.1.106 test6
VIP地址 192.168.1.100

开始部署

部署 数据主机

101 ~ 105

  1. 配置一主多从

    主机 角色
    数据主机 192.168.1.101 master
    数据主机 192.168.1.102 slave 备用1主节点
    数据主机 192.168.1.103 slave 备用2主节点
    数据主机 192.168.1.104 slave
    数据主机 192.168.1.105 slave
    管理主机 192.168.1.106 manager
  2. 安装依赖的 perl 软件包

#配置好 epel 源,yum node节点时,可自动安装以下 perl 依赖包
perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
perl-Data-Dumper-2.145-3.el7.x86_64.rpm
perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
perl-DBI-1.627-4.el7.x86_64.rpm
perl-IO-Compress-2.061-2.el7.noarch.rpm
perl-Net-Daemon-0.48-5.el7.noarch.rpm
perl-PlRPC-0.2020-14.el7.noarch.rpm
  1. 安装软件 mha-node
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
  1. 配置数据节点 ssh 认证,彼此之间 root 用户无密码登陆
#配置好后可测试, mha_check_ssh 脚本也可测试.
ssh host hostname;
  1. 授权监控用户
# 为所有数据主机授权 root用户 管理主机访问监控使用
grant all on *.* to 'root'@'%' identified by '123456';
  1. 所有数据主机服务器启用不自动删除本机的中继日志文件
# 101~105
set global relay_log_purge=off;
# 永久配置
[mysqld]
relay_log_purge=off
  1. 主库 及 备用主库 特殊配置
# 为主库 和 备用主库 创建主从复制用户 repl
# 此拓扑中 为 192.168.1.102 和 103 添加 repl 用户,当默认主库宕机,接管主库的机器需要此用户用作新的主从同步.
grant replication slave on *.* to 'repl'@'%' identified by '123456'

# 为主库 和 备用主库 半同步复制 101~103
# 高可用架构下,master和slave需同时启动,以便在主从切换后能继续使用半同步复制
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1

配置 管理主机

  1. 安装依赖的 perl 软件包
#配置好 epel 源,yum node节点时,可自动安装以下 perl 依赖包
perl-Compress-Raw-Bzip2-2.061-3.el7.x86_64.rpm
perl-Compress-Raw-Zlib-2.061-4.el7.x86_64.rpm
perl-Data-Dumper-2.145-3.el7.x86_64.rpm
perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
perl-DBI-1.627-4.el7.x86_64.rpm
perl-IO-Compress-2.061-2.el7.noarch.rpm
perl-Net-Daemon-0.48-5.el7.noarch.rpm
perl-PlRPC-0.2020-14.el7.noarch.rpm
  1. 安装 node 和 manager 软件包
#先安装 node 节点包,manager 依赖 node 
yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
  1. 配置 ssh 认证, manager 主机,可以 使用 root 用户访问所有数据主机

  2. 修改配置文件

MHA 配置文件 app1.cnf

mkdir -p /etc/mha/
cat > /etc/mha/app1.cnf <<EOF
#默认配置 可单独写入 /etc/masterha_default.cnf
[server default]
manager_workdir=/etc/mha
manager_log=/etc/mha/manager.log
master_ip_failover_script=/etc/mha/master_ip_failover

# ssh 认证用户 端口
ssh_user=root
ssh_port=22

#主从用户 密码
repl_user=repl
repl_password=123123

# manager 主机监控用户 密码 访问所有 数据主机
user=root
password=123456

[server1]
hostname=192.168.1.101
#默认3306,可省略
port=3306   
candidate_master=1

[server2]
hostname=192.168.1.102
#设置为候选master
candidate_master=1

[server3]
hostname=192.168.1.103
candidate_master=1

[server4]
hostname=192.168.1.104
#不竞选master
no_master=1

[server5]
hostname=192.168.1.105
no_master=1

EOF

master_ip_failover 脚本

脚本修改 25 - 28

my $vip = '192.168.1.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

完整脚本,默认脚本无法正常执行

cat > /etc/mha/master_ip_failover << EOF
#!/usr/bin/env perl

#  Copyright (C) 2011 DeNA Co.,Ltd.
#  You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#  Foundation, Inc.,
#  51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

## Note: This is a sample script and is not complete. Modify the script based on your environment.

use strict;
use warnings FATAL => 'all';

use Getopt::Long;
use MHA::DBHelper;

my (
  $command,        $ssh_user,         $orig_master_host,
  $orig_master_ip, $orig_master_port, $new_master_host,
  $new_master_ip,  $new_master_port,  $new_master_user,
  $new_master_password
);

my $vip = '192.168.1.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";

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,
  'new_master_user=s'     => \$new_master_user,
  'new_master_password=s' => \$new_master_password,
);

exit &main();

sub main {
    print "\n\nIN SCRIPT TEST====$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 \"`;
}
sub stop_vip() {
     return 0  unless  ($ssh_user);
    `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";
}

测试配置文件

测试 ssh 认证

masterha_check_ssh --conf=/etc/mha/app1.cnf

测试 主从 状态

masterha_check_repl --conf=/etc/mha/app1.cnf

启动服务

手动部署 vip 至 当前主库上

ifconfig eth0:1 192.168.1.100/24

常用参数

--remove_dead_master_conf

--ignore_last_failover

启动命令

masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover

查看MHA运行状态

masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:8842) is running(0:PING_OK), master:192.168.1.101

测试高可用集群

  1. 客户端连接vip地址访问数据库
mysql -uweb -p123123 -h192.168.1.100
  1. 测试高可用

把主机 101 数据库服务停止,自动切换主库,和vip

mysql -uweb -p123123 -h192.168.1.100
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| test1      |
+------------+

# 停止mysql 当前主库
systemctl stop mysqld

mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| test2      |
+------------+

恢复 MHA 集群

  1. 把宕机的数据库 A 服务器修复.

  2. 重新设置已修复 A 服务器 为当前主库的从库,保证数据主从同步.

    生产环境,需要保证 A 数据先和 当前主库数据保持一致.

  3. 重新添加服务器 A 配置文件.至app1.cnf

  4. 重新启动MHA,测试

上一篇下一篇

猜你喜欢

热点阅读