目录
一、MHA概念
MHA 的组成
MHA 的特点
MHA工作原理
二、部署MySQL数据库MHA高可用
第一步 关闭所有防火墙和安全机制
第二步 修改主数据库配置文件
第三步 修改从数据库的配置文件
第四步 重启服务
第五步 优化所有数据库路径
第六步 授权所有数据库节点
第七步 设置授权连接
第八步 刷新权限表
第九步 查看Master节点
第十步 设置从数据库规则
第十一步 设置从数据库只读模式
第十二步 查看从数据库节点信息
第十三步 安装EPLE源
第十四步 安装MHA依赖环境
第十五步 导入Node组件并安装
第十六步 在MHA Manager节点上安装Manager组件
第十七步 配置所有数据库节点无密码进行认证
第十八步 配置三台数据库无密码认证
第十九步 拷贝执行文件
第二十步 复制脚本文件
第二十一步 修改脚本文件
第二十二步 修改脚本文件内容
第二十三步 创建MHA软件目录并拷贝配置文件
第二十四步 修改配置文件
第二十五步 手动开启虚拟IP
第二十六步 测试SSH无密码认证
第二十七步 测试主从连接情况
第二十八步 在Manager上启动MHA
第二十九步 查看MHA状态
第三十步 查看MHA日志
MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。
MHA Node(数据节点) MHA Node 运行在每台 MySQL 服务器上。
MHA Manager(管理节点) MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。 MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master 然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。
自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
目前MHA支持一主多从架构,最少三台服务,即一主两从
MHA Manger 管理多组主从复制。
MHA工作原理总结如下:
1、从宕机崩溃的master 保存二进制日志事件(binlog events); 2、识别含有最新的更新 slave 日志 3、应用差异的中继日志(relay log)到其他的slave 4、应用从master保存的二进制日志事件 5、提升一个 salve 为新的master 6、使其他的slave连接行的master 进行复制。
命令:systemctl stop firewalld
systemctl disable firewalld
setenforce 0
命令:vim /etc/my.cnf
命令:vim /etc/my.cnf
命令:systemctl restart mysqld
命令:ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
命令:grant replication slave on *.* to 'myslave'@'网段' identified by '密码';
grant all slave on *.* to 'mha'@'网段' identified by 'manager';
命令:grant all privileges on *.* to 'mha'@'master' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
命令:flush privileges;
命令:show master status;
命令:change master to master_host='主数据库IP地址',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=1743;
命令:set global read_only=1;
命令:show slave status\G
命令:yum -y install epel-release --nogpgchec
命令:yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
命令:tar xf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
命令:tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install
命令:ssh-keygen -t rsa
ssh-copy-id 主数据库IP
ssh-copy-id 从数据库IP
ssh-copy-id 从数据库IP
命令:cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
命令:cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
命令:vim /usr/local/bin/master_ip_failover
内容:my $vip = '192.168.80.200'; #指定vip的地址
my $brdc = '192.168.80.255'; #指定vip的广播地址
my $ifdev = 'ens33'; #指定vip绑定的网卡
my $key = '1'; #指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #代表此变量值为ifconfig ens33:1 192.168.80.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; #代表此变量值为ifconfig ens33:1 192.168.80.200 down
my $exit_code = 0; #指定退出状态码为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 {
"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";
}
命令:mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha
命令:vim /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 192.168.80.11 -s 192.168.80.12
shutdown_script=""
ssh_user=root
user=mha[server1]
hostname=主数据库IP
port=3306[server2]
candidate_master=1
check_repl_delay=0
hostname=从数据库IP
port=3306[server3]
hostname=从数据库IP
port=3306
命令:/sbin/ifconfig ens33:1 192.168.80.200/24
命令:masterha_check_ssh -conf=/etc/masterha/app1.cnf
命令:masterha_check_repl -conf=/etc/masterha/app1.cnf
命令: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 &
命令:masterha_check_status --conf=/etc/masterha/app1.cnf
命令:cat /var/log/masterha/app1/manager.log | grep "current master"