&1"">&1"">
当前位置:   article > 正文

Mysql 数据库 --------- MHA高可用群集部署 --------- 故障切换_"nohup ./growth-transformers --conf=\"/test/app.co

"nohup ./growth-transformers --conf=\"/test/app.conf\" 2>&1"

MHA简介

  • MHA 是一套优秀的Mysql 高可用环境下故障切换和主从复制的软件,能最大程度上保证数据库的一致性,以达到真正意义上的高可用
  • Mysql故障过程中,MHA能做到 0-30秒内自动完成故障切换,在不影响、中断业务的情况下能够快速的将故障机器剔除出去,切换到工作正常的备选机器上,并且容易安装,不改变现有部署
  • MHA 由两二个部分组成:即 MHA Manager(管理节点)和 MHA Node(数据节点组成)

MHA的特点

  • 自动故障切换过程中,MHA视图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
  • 使用半同步复制,可以大大降低数据丢失的风险
  • 目前MHA支持一主多从架构,最少三台服务,即一主两从。生产环境下,可以多主多备。

MHA高可用部署

部署规划

在这里插入图片描述

服务器IP地址bobe版本manager版本
master(主)20.0.0.105mha4mysql-node-0.57
slave(从/主备)20.0.0.106mha4mysql-node-0.57
slave(从/主备)20.0.0.107mha4mysql-node-0.57
manager20.0.0.183mha4mysql-node-0.57mha4mysql-manager-0.57
  • 使用的操作系统为: CentOS 7.6 、Mysql数据库为5.7版本
  • 部署前环境:关闭防火墙、关闭核心防护、已安装 5.7 版本的 Mysql数据库

部署 MHA

部署主从同步

一、分别给主、从三单台服务器设置主机名,做地址映射

[root@localhost ~]# hostnamectl set-hostname mysql1
[root@localhost ~]# su
[root@mysql1 ~]# vi /etc/hosts
20.0.0.105      mysql1
20.0.0.106      mysql2
20.0.0.107      mysql3

(三台都要设置;名称对应地址)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

二、修改master 20.0.0.105 服务器上主配置文件

[root@mysql1 ~]# vi /etc/my.cnf

[client]
port = 3306
#default-character-set=utf8             ####“#”号注释这一行掉
socket = /usr/local/mysql/mysql.sock

[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1               ####master 服务器id号,三台不能为相同;并且添加以下两行
log_bin = master-bin
log-slave-updates = true
           ...........省略内容


[root@mysql1 ~]# systemctl restart mysqld
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

三、分别修改从服务器20.0.0.106 和 20.0.0.107 上的主配置文件

[root@mysql2 ~]# vi /etc/my.cnf

[client]
port = 3306
#default-character-set=utf8           ####注释掉这一行
socket = /usr/local/mysql/mysql.sock

[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 2               ####id号不能相同,并添加下面三行
log_bin = master-bin
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
  
           ...........省略内容

[root@mysql1 ~]# systemctl restart mysqld
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

四、Mysql1、Mysql2、Mysql3 分别做两个软链接,给启动文件进行优化

[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
  • 1
  • 2
[root@Mysql2 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@Mysql2 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
  • 1
  • 2
[root@Mysql3 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@Mysql3 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
  • 1
  • 2

五、在所有数据库节点上授权两个用户,一个是从库同步使用,另外一个是 manager 使用。(主、从服务器上都做授权)

mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123';
mysql> grant all privileges on *.* to 'mha'@'20.0.0.%' identified by 'manager';
mysql> flush privileges;        ###刷新生效
  • 1
  • 2
  • 3

六、在 mysql1 上查看二进制文件和同步点,去 mysql2 和 mysql3 分别做日志同步,查看I/O、SQL线程是否同步正常

Mysql1:
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000004 |      855 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
mysql> change master to master_host='20.0.0.105',master_user='myslave',master_password='123',master_log_file='master-bin.000004',master_log_pos=885; 
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 20.0.0.105
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000004
          Read_Master_Log_Pos: 855
               Relay_Log_File: mysql1-relay-bin.000003
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

七、设置 mysql2 和 mysql3 为只读模式

mysql> set global read_only=1;
  • 1

八、验证
在 master 上创建一个库的同时,两台slave 上也同时创建了,证明主从同步了

安装 MHA

一、将四台服务器上的yum本地源换成官网源

mv /etc/yum.repos.d/backup/CentOS-Base.repo /etc/yum.repos.d/
mv /etc/yum.repos.d/local.repo /etc/yum.repos.d/backup/  
  • 1
  • 2

二、安装 epel 源

[root@MHA-manager ~]# 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

三、上传 mha4mysql-node-0.57.tar.gz 安装包在四台服务器上并安装 node 组件(四台都要装)

[root@Mysql1 ~]# tar zxvf mha4mysql-node-0.57.tar.gz
[root@Mysql1 ~]# cd mha4mysql-node-0.57
[root@Mysql1 mha4mysql-node-0.57]# perl Makefile.PL
[root@Mysql1 mha4mysql-node-0.57]# make
[root@Mysql1 mha4mysql-node-0.57]# make install
  • 1
  • 2
  • 3
  • 4
  • 5

四、上传 mha4MHA-manager-0.57.tar.gz 安装包在 manager 服务器上,并安装 manager 组件

[root@MHA-manager ~]# tar zxvf mha4MHA-manager-0.57.tar.gz 
[root@MHA-manager ~]# cd mha4MHA-manager-0.57
[root@MHA-manager mha4MHA-manager-0.57]# perl Makefile.PL
[root@MHA-manager mha4MHA-manager-0.57]# make
[root@MHA-manager mha4MHA-manager-0.57]# make install
  • 1
  • 2
  • 3
  • 4
  • 5

五、在 manager 上配置无密码认证

1. 在 manager 上配置到所有数据库节点的无密码认证
[root@MHA-manager ~]# ssh-keygen -t rsa                #####一路按回车键
[root@MHA-manager ~]# ssh-copy-id 20.0.0.105        #### 输入 yes    ;  输入进入虚拟机的密码 ;显示 added:1OK
[root@MHA-manager ~]# ssh-copy-id 20.0.0.106
[root@MHA-manager ~]# ssh-copy-id 20.0.0.107

2. 在 Mysql1 上配置到数据库节点Mysql2和Mysql3的无密码认证
[root@Mysql1 ~]# ssh-keygen -t rsa                #####一路按回车
[root@Mysql1 ~]# ssh-copy-id 20.0.0.106         #### 输入 yes    ;  输入进入虚拟机的密码 ;显示 added:1OK
[root@Mysql1 ~]# ssh-copy-id 20.0.0.107       #### 输入 yes    ;  输入进入虚拟机的密码 ;显示 added:1OK

3. 在 Mysql2 上配置到数据库节点Mysql1和Mysql3的无密码认证
[root@Mysql2 ~]# ssh-keygen -t rsa                  #####一路按回车
[root@Mysql2 ~]# ssh-copy-id 20.0.0.105          #### 输入 yes    ;  输入进入虚拟机的密码 ;显示 added:1OK
[root@Mysql2 ~]# ssh-copy-id 20.0.0.107           #### 输入 yes    ;  输入进入虚拟机的密码 ;显示 added:1OK

4. 在 Mysql3 上配置到数据库节点Mysql1和Mysql2的无密码认证
[root@Mysql3 ~]# ssh-keygen -t rsa                #####一路按回车
[root@Mysql3 ~]# ssh-copy-id 20.0.0.105           #### 输入 yes    ;  输入进入虚拟机的密码 ;显示 added:1OK
[root@Mysql3 ~]# ssh-copy-id 20.0.0.106           #### 输入 yes    ;  输入进入虚拟机的密码 ;显示 added:1OK
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

六、配置 MHA(manager 服务器上)

1. 复制相关脚本到/usr/local/bin 目录。
[root@MHA-manager ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

2. 复制上述的自动切换时 VIP 管理的脚本到/usr/local/bin 目录,这里使用脚本管理 VIP[root@MHA-manager ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

3、修改配置文件(全文删除,添加以下内容)
[root@MHA-manager ~]# vi /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 = '20.0.0.100';
my $brdc = '20.0.0.255';
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
##################################################################################
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 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 \"`;
}
# A simple system call that disable the VIP on 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";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

七、创建 MHA 软件目录并拷贝配置文件

[root@MHA-manager ~]# mkdir /etc/masterha
[root@MHA-manager ~]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
[root@MHA-manager ~]# vi /etc/masterha/app1.cnf             #####删除原文,将下列内容全部复制粘贴

[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
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
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.106 -s 20.0.0.107
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=20.0.0.105
port=3306

[server2]
candidate_master=1
check_repl_delay=0
hostname=20.0.0.106
port=3306

[server3]
hostname=20.0.0.107
port=3306
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

八、测试 ssh 无密码认证,如果正常最后会输出 successfully

[root@MHA-manager ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf
       ......省略内容
Thu Oct 22 01:45:39 2020 - [debug]  Connecting via SSH from root@20.0.0.106(20.0.0.106:22) to root@20.0.0.105(20.0.0.105:22)..
Thu Oct 22 01:45:39 2020 - [debug]   ok.
Thu Oct 22 01:45:39 2020 - [debug]  Connecting via SSH from root@20.0.0.106(20.0.0.106:22) to root@20.0.0.107(20.0.0.107:22)..
Thu Oct 22 01:45:40 2020 - [debug]   ok.
Thu Oct 22 01:45:41 2020 - [info] All SSH connection tests passed successfully.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

九、测试主从连接,出现 is ok

[root@MHA-manager ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf
       ..............省略内容
IN SCRIPT TEST====/sbin/ifconfig ens33:1 down==/sbin/ifconfig ens33:1 20.0.0.100===

Checking the Status of the script.. OK 
Thu Oct 22 01:48:59 2020 - [info]  OK.
Thu Oct 22 01:48:59 2020 - [warning] shutdown_script is not defined.
Thu Oct 22 01:48:59 2020 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

十、在主服务器上设置一个虚拟IP

[root@Mysql1 ~]# /sbin/ifconfig ens33:1 20.0.0.100/24

[root@Mysql1 ~]# ifconfig
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:00:62:91  txqueuelen 1000  (Ethernet)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

十一、在 manager 服务器上启动 MHA

[root@MHA-manager ~]# 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 &

[1] 129929
(解释:  nohup :是一种启动方式  ; masterha_manager:用manager来进行启动 ; /etc/masterha/app1.cnf :关联上的配置文件  ;--remove_dead_master_conf :移除挂掉的master  ;--ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 :忽略宕机的主机并将信息导入到< /dev/null >文件中,并把日志记录下来)
  • 1
  • 2
  • 3
  • 4

十二、查看 MHA 状态,可以看到当前的 master 是 Mysql1 节点

[root@MHA-manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:107906) is running(0:PING_OK), master:20.0.0.105
  • 1
  • 2

故障模拟

1、在 manager 服务器上开启监控观察日志,并关闭 mysql1 数据库模拟 mysql1 宕机,再查看 mysql1中的 VIP地址是否还在
[root@MHA-manager ~]# tailf /var/log/masterha/app1/manager.log
[root@Mysql1 ~]# systemctl stop mysqld
[root@Mysql1 ~]# ifconfig   
vip地址不见了

2、会发现master上的ens33:1/接口不见了,manager上的监控日志发生了变化,等待一会就能看到 VIP地址漂移到了从服务器20.0.0.106上,去从服务器20.0.0.106上,输入
ifconfig 会先发 vip地址就在上面,如此就完成了地址漂移
[root@mysql2 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.106  netmask 255.255.255.0  broadcast 20.0.0.255
        inet6 fe80::68ab:77b8:dfb0:9cf2  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:da:d4:93  txqueuelen 1000  (Ethernet)
        RX packets 87633  bytes 92667957 (88.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 40292  bytes 10435831 (9.9 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.0.0.0  broadcast 20.255.255.255
        ether 00:0c:29:da:d4:93  txqueuelen 1000  (Ethernet)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这里插入图片描述

故障修复

1、在原先的master服务器上 systemctl start mysqld 启动数据库,然后进入 manager 中在配置文件 /etc/masterha/app1.con 中添加  [server1]段,由于manager中有移除挂掉的master的模块,
所以需要重新添加 [server1]段 ,添加如下:
[server1]
hostname=20.0.0.105
port=3306

2、在master数据库中添加一条重新定位的语句

show master status;          ###查看20.0.0.106 新master的定位值;并在20.0.0.105插入下面内容。要和master 的定位置,日志文件名相同
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000003 |     1189 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+

change master to master_host='20.0.0.106',master_user='myslave',master_password='123',master_log_file='master-bin.000003',master_log_pos=1189;

start slave;

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 20.0.0.106
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000003
          Read_Master_Log_Pos: 1189
               Relay_Log_File: mysql1-relay-bin.000002
                Relay_Log_Pos: 321
        Relay_Master_Log_File: master-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

以上关于 Mysql-- MHA高可用的部署到此结束,感谢浏览

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/490392
推荐阅读
相关标签
  

闽ICP备14008679号