MHA高可用配置及故障切换

MHA概述

传统的MySQL主从架构存在的问题

MySQL主服务器出故障后就无法写入数据了

MHA简介

一套优秀的MySQL高可用环境下故障切换和主从复制的软件
MySQL故障过程中,MHA能做到0-30秒内自动完成故障切换

MHA组成

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

MHA特点(优势)

在 MHA 自动故障切换过程中,MHA 试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过 SSH 访问,MHA 没法保存二进制日志,就会出现只进行故障转移但丢失了最新的数据的情况。
使用 MySQL 5.5 的半同步复制,可以大大降低数据丢失的风险。MHA 可以与半同步复 制结合起来。如果只有一个 slave 已经收到了最新的二进制日志,MHA 可以将最新的二进 制日志应用于其他所有的 slave 服务器上,因此可以保证所有节点的数据一致性。

MHA架构

目前MHA支持一主多从架构,最少三台服务,即一主两从

MHA高可用案例

在这里插入图片描述

部署过程

实验需求

MHA 监控 MySQL数据库健康状态,在主服务器故障时进行自动切换,不影响业务。

实验思路

MHA架构

1)数据库安装
2)一主两从
3)MHA搭建

故障模拟

1)主库失效
2)备选主库成为主库
3)从库2将备选主库指向为主库

故障修复

1)坏库修复,启动
2)在修复好的库上建立新主从关系
3)修改manager配置文件,添加修好的库的记录
4)重启mha

实验环境

主机名IP地址角色软件包
Master20.0.0.11主服务器node数据节点软件包
Slave120.0.0.12主备/从服务器node数据节点软件包
Slave220.0.0.13从服务器node数据节点软件包
Manger20.0.0.14从服务器node数据节点软件包/Manger管理节点软件包

部署步骤

安装MySQL-5.6

安装编译依赖的环境

[root@Mysql1 ~]# yum -y install ncurses-devel gcc-c++ perl-Module-Install 

安装 gmake 编译软件

[root@Mysql1 ~]# tar zxvf cmake-2.8.6.tar.gz
[root@Mysql1 ~]# cd cmake-2.8.6
[root@Mysql1 cmake-2.8.6]# ./configure
[root@Mysql1 cmake-2.8.6]# gmake && gmake install

安装 MySQL 数据库

[root@Mysql1 ~]# tar -zxvf mysql-5.6.36.tar.gz

[root@Mysql1 ~]# cd mysql-5.6.36
[root@Mysql1 mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
[root@Mysql1 mysql-5.6.36]# make && make install

[root@Mysql1 mysql-5.6.36]# cp support-files/my-default.cnf /etc/my.cnf
[root@Mysql1 mysql-5.6.36]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

[root@server1 mysql-5.6.36]# cd

[root@Mysql1 ~]# chmod +x /etc/rc.d/init.d/mysqld
[root@Mysql1 ~]# chkconfig --add mysqld

[root@Mysql1 ~]# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
[root@Mysql1 ~]# source /etc/profile
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin

[root@Mysql1 ~]# groupadd mysql
[root@Mysql1 ~]# useradd -M -s /sbin/nologin mysql -g mysql
[root@Mysql1 ~]# chown -R mysql.mysql /usr/local/mysql

[root@Mysql1 ~]# mkdir -p /data/mysql

[root@Mysql1 ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

修改MySQL5.6配置文件
修改 Master 的主配置文件
/etc/my.cnf 文件,三台服务器的 server-id 不能一样,另外两台写 2 和 3 即可!写入内容如下:

[root@Mysql1 ~]# cat /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true

配置从服务器:
在/etc/my.cnf 中修改或者增加下面内容。

[root@Mysql2 ~]# vim /etc/my.cnf
[mysqld]
server-id = 2 #增加
log_bin = master-bin
relay-log = relay-log-bin #增加
relay-log-index = slave-relay-bin.index #增加
这里要注意 server-id 不能相同。
需要删除字符集utf8的语句

软链接

[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@Mysql1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

Mysql1、Mysql2、Mysql3 启动 MySQL

[root@Mysql1 ~]# /usr/local/mysql/bin/mysqld_safe --user=mysql &
[1] 35152
[root@server1 ~]# Logging to '/usr/local/mysql/data/server1.err'.
201231 09:37:31 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
^C
[root@server1 ~]# netstat -anpt | grep mysql
tcp6       0      0 :::3306                 :::*                    LISTEN      35267/mysqld

配置 MySQL 一主两从

首先修改MySQL登录密码

[root@server1 ~]# mysqladmin -uroot -p password '123456'

在所有数据库节点上授权两个用户,一个是从库同步使用,另外一个是 manager 使用。
[root@server1 ~]# mysqladmin -uroot -p password '123456'
mysql> grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on *.* to 'mha'@'20.0.0.%' identified by 'manager';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

做案例实验环境时候通过 MHA 检查
MySQL 主从有报错,报两个从库通过主机名连接不上主库,所以所有数据库加上下面的授
权。

mysql> grant all privileges on *.* to 'mha'@'server1' identified by 'manager';
Query OK, 0 rows affected (0.01 sec)

mysql> grant all privileges on *.* to 'mha'@'server2' identified by 'manager';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on *.* to 'mha'@'server3' identified by 'manager';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

在 Mysql1 主机上查看二进制文件和同步点

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |     1429 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

Mysql2 和 Mysql3 分别执行同步。

mysql> change master to master_host='20.0.0.11',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1429;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave; #启动
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G; #查看从节点状态
………………
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
………………

必须设置两个从库为只读模式

mysql> set global read_only=1;
Query OK, 0 rows affected (0.01 sec)

测试主从
Mysql1 主库插入两条数据,测试是否同步。

mysql> create database lcx;
Query OK, 1 row affected (0.00 sec)

mysql> use lcx;
Database changed
mysql> create table abc(id int(2), name char(32), age int(3));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into abc values(1,'zhangsan',19);
Query OK, 1 row affected (0.00 sec)

mysql> select * from abc;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   19 |
+------+----------+------+
1 row in set (0.00 sec)

从库上查看添加的内容

mysql> use lcx;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from abc;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   19 |
+------+----------+------+
1 row in set (0.00 sec)
主从正常

安装MHA软件

导入epel.repo、CentOS7-Base-163.repo到/etc/yum.repos.d/目录下

所有服务器(master、slave1、slave2、manager)上都安装 MHA 依赖的环境,首先安装 epel 源。

[root@MHA-manager ~]# yum install epel-release --nogpgcheck
[root@MHA-manager ~]# yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN

MHA 软件包对于每个操作系统版本不一样,这里 CentOS7.3 必须选择 0.57 版本,
在所有服务器(master、slave1、slave2、manager)上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,
因为 manager 依赖 node 组件,下面都是在 Mysql1 上操作演示安装 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
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::node
Writing MYMETA.yml and MYMETA.json

[root@Mysql1 mha4mysql-node-0.57]# make
[root@Mysql1 mha4mysql-node-0.57]# make install

node 安装后会在/usr/local/bin 下面会生成几个脚本

[root@Mysql1 ~]# ls /usr/local/bin
apply_diff_relay_logs  cmake  ctest               purge_relay_logs
ccmake                 cpack  filter_mysqlbinlog  save_binary_logs

###
这些工具通常由 MHAManager 的脚本触发,无需人为操作,主要如下:
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)
###

在 MHA-manager 上安装 manager 组件

[root@MHA-manager ~]# tar zxvf mha4mysql-manager-0.57.tar.gz 

[root@MHA-manager ~]# cd mha4mysql-manager-0.57/

[root@MHA-manager mha4mysql-manager-0.57]#perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- DBI                   ...loaded. (1.627)
- DBD::mysql            ...loaded. (4.023)
- Time::HiRes           ...loaded. (1.9725)
- Config::Tiny          ...loaded. (2.14)
- Log::Dispatch         ...loaded. (2.41)
- Parallel::ForkManager ...loaded. (1.18)
- MHA::NodeConst        ...loaded. (0.57)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::manager

[root@MHA-manager mha4MHA-manager-0.57]# make
[root@MHA-manager mha4MHA-manager-0.57]# make install

manager 安装后在/usr/local/bin 下面会生成几个工具

[root@server1 ~]# ls /usr/local/bin
apply_diff_relay_logs  masterha_conf_host        masterha_stop
filter_mysqlbinlog     masterha_manager          purge_relay_logs
masterha_check_repl    masterha_master_monitor   save_binary_logs
masterha_check_ssh     masterha_master_switch
masterha_check_status  masterha_secondary_check

###
主要包括以下几个:
masterha_check_ssh 检查 MHA 的 SSH 配置状况
masterha_check_repl 检查 MySQL 复制状况
masterha_manger 启动 manager的脚本
masterha_check_status 检测当前 MHA 运行状态
masterha_master_monitor 检测 master 是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的 server 信息
masterha_stop  关闭manager
###

配置无密码认证

在 manager 上配置到所有节点的无密码认证

[root@MHA-manager ~]# ssh-keygen -t rsa #一路按回车键
[root@MHA-manager ~]# ssh-copy-id 20.0.0.11
[root@MHA-manager ~]# ssh-copy-id 20.0.0.12
[root@MHA-manager ~]# ssh-copy-id 20.0.0.13

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

[root@Mysql1 ~]# ssh-keygen -t rsa
[root@Mysql1 ~]# ssh-copy-id 20.0.0.12
[root@Mysql1 ~]# ssh-copy-id 20.0.0.13

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

[root@Mysql2 ~]# ssh-keygen -t rsa
[root@Mysql2 ~]# ssh-copy-id 20.0.0.11
[root@Mysql2 ~]# ssh-copy-id 20.0.0.12

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

[root@Mysql3 ~]# ssh-keygen -t rsa
[root@Mysql3 ~]# ssh-copy-id 20.0.0.11
[root@Mysql3 ~]# ssh-copy-id 20.0.0.12

配置 MHA

在 manager 节点上复制相关脚本到/usr/local/bin 目录。

[root@MHA-manager ~]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts /usr/local/bin

拷贝后会有四个执行文件

[root@MHA-manager ~]#ll /usr/local/bin/scripts/
总用量 32
-rwxr-xr-x. 1 1001 1001  3648 531 2015 master_ip_failover
-rwxr-xr-x. 1 1001 1001  9870 531 2015 master_ip_online_change
-rwxr-xr-x. 1 1001 1001 11867 531 2015 power_manager
-rwxr-xr-x. 1 1001 1001  1360 531 2015 send_report

###
master_ip_failover #自动切换时 VIP 管理的脚本
master_ip_online_change #在线切换时 vip 的管理
power_manager #故障发生后关闭主机的脚本
send_report #因故障切换后发送报警的脚本
###

复制上述的自动切换时 VIP 管理的脚本到/usr/local/bin 目录,这里使用脚本管理 VIP,
也是推荐的一种方式,生产环境不太建议使用 keepalived。

[root@MHA-manager ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

修改内容如下:

[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;
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
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";
}

创建 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_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
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
user=mha
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=myslave
secondary_check_script= /usr/local/bin/masterha_secondary_check -s 20.0.0.11 -s 20.0.0.12 -s 20.0.0.13
shutdown_script="" 
ssh_user=root

[server1]
hostname=20.0.0.11
port=3306

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

[server3]
hostname=20.0.0.13
port=3306

测试 ssh 无密码认证

masterha_check_ssh --conf=/etc/masterha/app1.cnf
………………
[info] All SSH connection tests passed successfully. #成功

测试 MySQL 主从连接情况

[root@MHA-manager ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
………………
MySQL Replication Health is OK. #健康检查通过

启动 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] 52769

###
--remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
--manger_log 日志存放位置。
--ignore_last_failover 在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间
隔不足 8 小时的话,则不会进行 Failover,之所以这样限制是为了避免 ping-pong 效应。该
参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记
目录,也就是上面设置的日志 app1.failover.complete 文件,下次再次切换的时候如果发现
该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,
这里设置为–ignore_last_failover。
###

手动生成vip地址

[root@Mysql1 ~]# ifconfig ens33:1 20.0.0.100/24
[root@Mysql1 ~]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.11  netmask 255.255.255.0  broadcast 20.0.0.255
        inet6 fe80::ff21:1304:2937:51b3  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:46:3c:ae  txqueuelen 1000  (Ethernet)
        RX packets 898205  bytes 1321098250 (1.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 142935  bytes 13039482 (12.4 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:46:3c:ae  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 1  (Local Loopback)
        RX packets 36  bytes 4212 (4.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 36  bytes 4212 (4.1 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:9b:83:c1  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

查看 MHA 状态,可以看到当前的 master 是 Mysql1 节点。
[root@MHA-manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:52769) is running(0:PING_OK), master:20.0.0.11 #主库IP

查看 MHA 日志,也以看到当前的 master 是 192.168.8.134,如下所示。
[root@MHA-manager ~]# cat /var/log/masterha/app1/manager.log

查看 Mysql1 的 VIP 地址 192.168.8.200 是否存在?,这个 VIP 地址不会因为
manager 节点停止 MHA 服务而消失。

故障模拟

主库

[root@Mysql1 ~]# pkill -9 mysql
[1]+  已杀死               /usr/local/mysql/bin/mysqld_safe --user=mysql

从库1已设为主备,所以去从库2上查看是否转移

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 20.0.0.12
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 2388
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 284
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
………………

切换备选主库的算法:

1.一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。

2.数据一致的情况下,按照配置文件顺序,选择备选主库。

3.设定有权重(candidate_master=1),按照权重强制指定备选主。

  • 默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。
  • 如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。

故障修复步骤

修复db (数据库)
主库

[root@Mysql1 ~]# netstat -anpt | grep mysql
[root@Mysql1 ~]# /etc/init.d/mysqld start
Starting MySQL SUCCESS! 
[root@Mysql1 ~]# netstat -anpt | grep mysql
tcp6       0      0 :::3306                 :::*                    LISTEN      37245/mysqld  

manager节点

[root@MHA-manager ~]# vi /etc/masterha/app1.cnf 
………………
[server1]
candidate_master=1 #主备
check_repl_delay=0
hostname=20.0.0.11
port=3306

[server2]
hostname=20.0.0.12
port=3306

[server3]
hostname=20.0.0.13
port=3306

原master

mysql> change master to master_host='20.0.0.12',master_user='myslave',master_passwoord='123456',master_log_file='master-bin.000001',master_log_pos=2388; #重新指新master
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
………………
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
………………

测试主从
新master

insert into abc values(2,'wangwu',20);
Query OK, 1 row affected (0.00 sec)

mysql> select * from abc;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   19 |
|    2 | wangwu   |   20 |
+------+----------+------+
2 rows in set (0.00 sec)

原master

mysql> select * from abc;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   19 |
|    2 | wangwu   |   20 |
+------+----------+------+
2 rows in set (0.00 sec)

从2

mysql> select * from abc;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   19 |
|    2 | wangwu   |   20 |
+------+----------+------+
2 rows in set (0.00 sec)

测试正常

MHA
健康检查

[root@MHA-manager ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
………………
MySQL Replication Health is OK. #通过

启动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] 53736
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值