文章目录

  • Mysql高可用架构(MHA)简介
    • MySQL高可用系统
    • MHA技术介绍
    • MHA提供了如下功能
    • MHA工作原理
    • MHA的优点
    • MHA组件介绍
      • Manager工具包主要包括以下工具
      • Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)
  • 实验环境
  • 实验过程
    • server1~3主机配置基于gtid的半同步复制
      • 基于gtid的主从配置
      • 测试
    • server4主机MHA的配置
    • MHA的检测
      • 手动切换
        • 当master节点的mysqld服务关闭时的切换
        • 当master节点和slave(备master)节点的mysqld服务都正常时的切换
      • 自动切换
        • VIP的配置
        • 自动切换

Mysql高可用架构(MHA)简介

MySQL高可用系统

  • MySQL高可用,顾名思义就是当MySQL主机或服务发生任何故障时能够立马有其他主机顶替其工作,并且最低要求是要保证数据一致性。因此,对于一个MySQL高可用系统需要达到的目标有以下几点:
  • 数据一致性保证,这个是最基本的同时也是前提,如果主备的数据不一致,那么切换就无法进行,当然这里的一致性也是一个相对的,但是要做到最终一致性。
  • 故障快速切换,当master故障时这里可以是机器故障或者是实例故障,要确保业务能在最短时间切换到备用节点,使得业务受影响时间最短。
  • 简化日常维护,通过高可用平台来自动完成高可用的部署、维护、监控等任务,能够最大程度的解放DBA手动操作,提高日常运维效率。
  • 统一管理,当复制集很多的情况下,能够统一管理高可用实例信息、监控信息、切换信息等。
  • 高可用的部署要对现有的数据库架构无影响,如果因为部署高可用,需要更改或者调整数据库架构则会导致成本增加。目前MySQL高可用方案可以一定程度上实现数据库的高可用,比如MMM,heartbeat+drbd,NDB Cluster等。还有MariaDB的Galera Cluster,以及MySQL 5.7.17 Group Replication等。这些高可用软件各有优劣。在进行高可用方案选择时,主要是看业务对数据一致性方面的要求。最后出于对数据库的高可用和高可靠的要求,目前推荐使用MHA架构,因为MySQL GP还不能在生产使用,但是相信以后慢慢就会被用到生产环境的。

MHA技术介绍

  • MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。除了failover之外,MHA还支持在线master切换,非常安全和高效,大概只需要(0.5 ~ 2秒)的阻塞写时间。该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当slave。

MHA提供了如下功能

  • master自动监控,故障转移一体化(Automated master monitoring and failover)
  • MHA可以在一个复制组中监控master的状态,如果挂了,就可以自动的做failover。
  • MHA通过所有slave的差异relay-log来保证数据的一致性。
  • MHA在做故障转移,日志补偿这些动作的时候,通常只需要10~30秒。
  • 通常情况下,MHA会选择最新的slave作为new master,但是你也可以指定哪些是候选maser,那么新master选举的时候,就从这些host里面挑。
  • 导致复制环境中断的一致性问题,在MHA中是不会发生的,请放心使用。在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5及以上版本的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
  • 手工-交互式master故障转移(Interactive manually initiated Master Failover)MHA可以配置成手工-交互式方式进行故障转移,不支持监控master的状态。
  • 非交互式master故障转移 (Non-interactive master failover)非交互式,自动的故障转移,不提供监控master状态功能,监控可以交给其他组件做(如:Pacemaker heartbeat)。
  • 在线master切换 (Online switching master to a different host)如果你有更快,更好的master,计划要将老master替换成新的master,那么这个功能特别适合这样的场景。这不是master真的挂掉了,只是我们有很多需求要进行master例行维护。

MHA工作原理

  • 从宕机崩溃的Master保存二进制日志事件(binlog event);
  • 识别含有最新更新的Slave;
  • 应用差异的中继日志(relay log)到其他Slave;
  • 应用从Master保存的二进制日志事件;
  • 提升一个Slave为新的Master;
  • 使其他的Slave连接新的Master进行复制;

MHA的优点

  • master failover和slave promotion非常快速。
  • 自动探测,多重检测,切换过程中支持调用其他脚本的接口。
  • master crash不会导致数据不一致,自动补齐数据,维护数据一致性。
  • 不需要修改复制的任何设置,简单易部署,对现有架构无影响。
  • 不需要增加很多额外的机器来部署MHA,支持多实例集中管理。
  • 没有任何性能影响。
  • 支持在线切换。
  • 跨存储引擎,支持任何引擎。

MHA组件介绍

MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下。

Manager工具包主要包括以下工具
  • (1)masterha_check_ssh 检查MHA的SSH配置状况;
  • (2)masterha_check_repl 检查MySQL复制状况;
  • (3)masterha_manger 启动MHA;
  • (4)masterha_check_status 检测当前MHA运行状态;
  • (5)masterha_master_monitor 检测master是否宕机;
  • (6)masterha_master_switch 控制故障转移(自动或者手动);
  • (7)masterha_conf_host 添加或删除配置的server信息;
Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)
  • (1)save_binary_logs 保存和复制master的二进制日志;
  • (2)apply_diff_relay_logs #识别差异的中继日志事件并将其差异的事件应用于其他的slave;
  • (3)purge_relay_logs #清除中继日志(不会阻塞SQL线程);
  • (4)filter_mysqlbinlog:去除不必要的ROOLBACK事件(已经废弃)
    注意:为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL半同步复制。

实验环境

主机名(ip) 功能
server1(172.25.24.1) master
server2(172.25.24.2) slave(备master)
server3(172.25.24.3) slave
server4(172.25.24.4) MHA

实验过程

server1~3主机配置基于gtid的半同步复制

  • 删除数据库目录下原有的数据,重新生成密码进行安全初始化。(server1~3步骤相同,不再赘述)
[root@server1 ~]# cd /var/lib/mysql
[root@server1 mysql]# systemctl stop mysqld
[root@server1 mysql]# rm -fr *
[root@server1 mysql]# ls
[root@server1 mysql]# systemctl start mysqld
[root@server1 mysql]# grep password /var/log/mysqld.log[root@server1 mysql]# mysql -uroot -p
mysql> alter user root@localhost identified by 'Wsp+123ld';
mysql> exit


  • 修改server1的配置文件为如下,重启服务。
[root@server1 mysql]# vim /etc/my.cnf29 server_id=130 log-bin=mysql-bin31 gtid_mode=ON32 enforce_gtid_consistency=ON33 log_slave_updates=ON[root@server1 mysql]# systemctl restart mysqld

  • 修改server2的配置文件为如下,重启服务。
[root@server2 mysql]# vim /etc/my.cnf29 server_id=230 log-bin=mysql-bin31 gtid_mode=ON32 enforce_gtid_consistency=ON33 log_slave_updates=ON[root@server2 mysql]# systemctl restart mysqld
  • 修改server3的配置文件为如下,重启服务。
[root@server3 mysql]# vim /etc/my.cnf29 server_id=330 log-bin=mysql-bin31 gtid_mode=ON32 enforce_gtid_consistency=ON33 log_slave_updates=ON[root@server3 mysql]# systemctl restart mysqld
基于gtid的主从配置

注:因为进行MHA搭建每一个主机都有可能是主也有可能是从,所以都要安装主从设备的插件。

  • server1(master)
[root@server1 mysql]# mysql -uroot -p
mysql> grant replication slave on *.* to repl@'172.25.24.%' identified by 'Wsp+123ld';
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_master_enabled =1;
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
mysql> SET GLOBAL rpl_semi_sync_master_timeout =10000000000000000000;
mysql> show variables like '%rpl%';

  • server2和3(slave)
[root@server2 mysql]# mysql -uroot -p
mysql> change master to master_host='172.25.24.1',master_user='repl',master_password='Wsp+123ld',master_auto_position=1;
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled =1;
mysql> SET GLOBAL rpl_semi_sync_master_enabled =1;
mysql> grant replication slave on *.* to repl@'172.25.24.%' identified by 'Wsp+123ld';
mysql> flush privileges;
mysql> stop slave io_thread;
mysql> start slave io_thread;
mysql> start slave;
mysql> show slave status\G;
mysql> show global variables like '%gtid%';


测试
  • 在server1新建数据库和表,向表中插入数据。
mysql> create database zyw;
mysql> use zyw;
mysql> create table userlist(-> username varchar(10) not null,-> password varchar(10) not null);
mysql> insert into userlist values('lhr','111');
mysql> select * from userlist;

  • server2和server3登陆数据库查看,异步复制成功。
mysql> select * from zyw.userlist;
+----------+----------+
| username | password |
+----------+----------+
| lhr      | 111      |
+----------+----------+
1 row in set (0.00 sec)mysql> select * from zyw.userlist;
+----------+----------+
| username | password |
+----------+----------+
| lhr      | 111      |
+----------+----------+
1 row in set (0.00 sec)

server4主机MHA的配置

  • 获取需要用到的安装包,并安装。[root@server4 MHA-7]# yum install mha4mysql-manager-0.58-0.el7.centos.noarch.rpm mha4mysql-node-0.58-0.el7.centos.noarch.rpm perl-* -y
  • 由于MHA中的master节点和slave节点之间是通过ssh服务来进行保存二进制日志的,所以要保证server1~4之间要做到免密登陆。
  • 在server4生成钥匙和锁,并将钥匙发给server1~3.
[root@server4 MHA-7]# vim /etc/hosts     #首先查看解析有没有做好。
[root@server4 MHA-7]# ssh-keygen
[root@server4 MHA-7]# ssh-copy-id server1
[root@server4 MHA-7]# ssh-copy-id server2
[root@server4 MHA-7]# ssh-copy-id server3
  • 将server4上数据节点的安装包分别发给server1~3。(不用输入密码,我们的server4对server1~3的免密操作成功。)
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server1:
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server2:
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server3:

  • 在server1~3上分别安装节点node的安装包。
[root@server1 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
[root@server2 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
[root@server3 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
  • 在server4上编辑高可用的配置文件
  • 创建高可用配置文件的目录[root@server4 ~]# mkdir /etc/masterha
  • 编辑配置文件,配置文件以及参数含义如下:
[root@server4 ~]# cd /etc/masterha/
[root@server4 masterha]# vim master.cnf    #配置文件内容如下:[server default]
manager_workdir=/etc/masterha     #设置manager的工作目录
manager_log=/var/log/masterha.log    #设置manager的日志
master_binlog_dir=/etc/masterha     #设置master保存二进制日志的位置,以便MHA可以找到master的日志password=Wsp+123ld    #设置mysql中root用户的密码
user=root    #设置监控用户root
ping_interval=1    #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp   #设置远端mysql在发生切换时binlog的保存位置
repl_password=Wsp+123ld   #设置复制用户的密码
repl_user=repl   #设置复制环境中的复制用户名
ssh_user=root   #设置ssh的登录用户名[server1]
hostname=172.25.24.1
port=3306[server2]
hostname=172.25.24.2
port=3306
candidate_master=1      #设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
check_repl_delay=0        #默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master。[server3]
hostname=172.25.24.3
port=3306
no_master=1       #设置server3不能成为master
  • 检测ssh连接是否成功。
[root@server4 masterha]# masterha_check_ssh --conf=/etc/masterha/master.cnf

  • 连接失败,因为我们只是解决了server4可以直接连接server1~3,而server1~3之间是无法直接链接的,所以我们需要将公钥和私钥都发给server1~3。
[root@server4 masterha]# scp -r ~/.ssh server1:
[root@server4 masterha]# scp -r ~/.ssh server2:
[root@server4 masterha]# scp -r ~/.ssh server3:

  • 再次检查ssh连接。
[root@server4 masterha]# masterha_check_ssh --conf=/etc/masterha/master.cnf

  • 在server4检查复制情况[root@server4 masterha]# masterha_check_repl --conf=/etc/masterha/master.cnf

    出现了错误,因为我们在数据库安全初始化的时候设置了禁止超户远程登陆。
  • 在server1重新授权,并刷新授权表。
[root@server1 ~]# mysql -uroot -p
mysql> grant all on *.* to root@'%' identified by 'Wsp+123ld';
mysql> flush privileges;

  • 再次检查复制的情况。
 [root@server4 masterha]# masterha_check_repl --conf=/etc/masterha/master.cnf


补充:启动参数介绍

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

  • 在server4执行[root@server4 masterha]# nohup masterha_manager --conf=/etc/masterha/master.cnf --remove_dead_master_conf --ignore_last_failover </dev/null > /var/log/masterha.log 2>&1 &,并查看进程ps ax

  • server4执行[root@server4 masterha]# masterha_stop --conf=/etc/masterha/master.cnf查看进程ps ax

MHA的检测

手动切换
当master节点的mysqld服务关闭时的切换
  • 关闭server1的mysql服务即master然后在server4上将手动将master转到server2上
    注:在server4上进行手动切换前必须先关掉server1上的mysql否则,手动切换不成功。
[root@server1 ~]# systemctl stop mysqld
[root@server4 masterha]# masterha_master_switch --master_state=dead --conf=/etc/masterha/master.cnf --dead_master_host=172.25.24.1 --dead_master_ip=172.25.24.1 --dead_master_port=3306 --new_master_host=172.25.24.2 --new_master_port=3306
  • 输入三次yes后,可以看到切换成功。
  • 因为此时server2已经为master,不能查看slave的状态。
  • 我们在server3上查看,master已经切换为server2
  • 打开server1的mysqld,因为server1的服务再次开启默认已经为salve了,所以需要给其授予slave;
    查看其slave的状态,显示master为server2。
[root@server1 mysql]# systemctl start mysqldmysql> change master to master_host='172.25.24.2',master_user='repl',master_password='Wsp+123ld',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;

当master节点和slave(备master)节点的mysqld服务都正常时的切换
  • 在server4节点首先删除此文件master.failover.complete,否则切换不成功。
[root@server4 masterha]# ls
172.25.24.3_3306_20190729214444.log  master.cnf  master.failover.complete
[root@server4 masterha]# rm -fr master.failover.complete

  • server4,此时将master切换回server1。
[root@server4 masterha]# masterha_master_switch --master_state=alive --conf=/etc/masterha/master.cnf --new_master_host=172.25.24.1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

  • 切换成功。
  • 在server1上查看slave的状态,因为此是server1已经是master了,所以查不到。
  • 在server2(切换之前的master)和server3查看master的状态。

  • 发现server2主动转为slave,不用进行授权及开启slave操作。
自动切换
VIP的配置
  • 编辑配置文件,添加下面两行的内容。
[root@server4 masterha]# vim master.cnf5 master_ip_failover_script=/usr/local/bin/master_ip_failover6 master_ip_online_change_script=/usr/local/bin/master_ip_online_change

  • 在/usr/local/bin下添加这两个文件,并修改两个文件为如下:
  • master_ip_failover文件的内容如下:
[root@server4 bin]# vim 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 = '172.25.24.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";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 \"`;
}
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";
}
  • master_ip_online_change文件的内容如下:
[root@server4 bin]# vim master_ip_online_change#!/usr/bin/env perl
use strict;
use warnings FATAL =>'all';use Getopt::Long;my $vip = '172.25.24.100/24';  # Virtual IP
my $key = "1";
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";
my $exit_code = 0;my ($command,              $orig_master_is_new_slave, $orig_master_host,$orig_master_ip,       $orig_master_port,         $orig_master_user,$orig_master_password, $orig_master_ssh_user,     $new_master_host,$new_master_ip,        $new_master_port,          $new_master_user,$new_master_password,  $new_master_ssh_user,
);GetOptions('command=s'                => \$command,'orig_master_is_new_slave' => \$orig_master_is_new_slave,'orig_master_host=s'       => \$orig_master_host,'orig_master_ip=s'         => \$orig_master_ip,'orig_master_port=i'       => \$orig_master_port,'orig_master_user=s'       => \$orig_master_user,'orig_master_password=s'   => \$orig_master_password,'orig_master_ssh_user=s'   => \$orig_master_ssh_user,'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,'new_master_ssh_user=s'    => \$new_master_ssh_user,
);exit &main();sub main {#print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";  if ( $command eq "stop" || $command eq "stopssh" ) {# $orig_master_host, $orig_master_ip, $orig_master_port are passed.  # If you manage master ip address at global catalog database,  # invalidate orig_master_ip here.  my $exit_code = 1;eval {print "\n\n\n***************************************************************\n";print "Disabling the VIP - $vip on old master: $orig_master_host\n";print "***************************************************************\n\n\n\n";&stop_vip();$exit_code = 0;};if ($@) {warn "Got Error: $@\n";exit $exit_code;}exit $exit_code;
}
elsif ( $command eq "start" ) {# all arguments are passed.  # If you manage master ip address at global catalog database,  # activate new_master_ip here.  # You can also grant write access (create user, set read_only=0, etc) here.
my $exit_code = 10;eval {print "\n\n\n***************************************************************\n";print "Enabling the VIP - $vip on new master: $new_master_host \n";print "***************************************************************\n\n\n\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";`ssh $orig_master_ssh_user\@$orig_master_host \" $ssh_start_vip \"`;exit 0;
}
else {
&usage();exit 1;
}
}# A simple system call that enable the VIP on the new master
sub start_vip() {
`ssh $new_master_ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $orig_master_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";
}
  • 给两个文件添加可执行权限。[root@server4 bin]# chmod +x *
  • 给server1(此时的master)添加VIP
[root@server1 mysql]# ip addr add 172.25.24.100/24 dev eth0
[root@server1 mysql]# ip a

  • 手动切换,切换master到server2[root@server4 bin]# masterha_master_switch --master_state=alive --conf=/etc/masterha/master.cnf --new_master_host=172.25.24.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
  • 但是执行的过程中报错了。

  • 查看进程,确实没有停止。
  • 我们停止。

  • 再次执行
[root@server4 bin]# masterha_master_switch --master_state=alive --conf=/etc/masterha/master.cnf --new_master_host=172.25.24.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

  • 可以看到VIP漂移到了server2。
  • 再将server1设置为master
[root@server4 bin]# masterha_master_switch --master_state=alive --conf=/etc/masterha/master.cnf --new_master_host=172.25.24.1 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

  • 查看ip,此时vip又漂移到了server1上。

自动切换
  • 开启MHA的自动转换
[root@server4 bin]# nohup masterha_manager --conf=/etc/masterha/master.cnf &>/dev/null &
[root@server4 bin]# ps ax | grep masterha

  • 关闭server1的mysql服务[root@server1 mysql]# systemctl stop mysqld
  • 查看vip漂移到server2上。server2为新的master。


Mysql的高可用架构搭建(MHA)相关推荐

  1. Spring - MySql实现高可用架构之MHA

    一.简介 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能.MHA 在监控到 mas ...

  2. MHA高可用架构搭建

    MHA高可用架构搭建 1.环境软件版本 2.环境架构介绍 3.MySQL主从搭建 3.1 MySQL安装(3台) 3.2 关闭防火墙 3.3 MySQL主从配置 Master节点 Slave1节点 S ...

  3. 探索MySQL高可用架构之MHA(6)

    探索MySQL高可用架构之MHA(6) -----构建mysql高可用系列(共9篇) 上一篇文章介绍了本次架构的Atlas读写分离! 本篇文章主要介绍本次架构中的keepalive部分! 什么是Kee ...

  4. 美团点评基于MGR的CMDB高可用架构搭建之路【转】

    王志朋 美团点评DBA 曾在京东金融担任DBA,目前就职于美团点评,主要负责金融业务线数据库及基础组件数据库的运维. MySQL Group Replication(以下简称MGR),于5.7.17版 ...

  5. 【稳定性day10】美团MySQL的高可用架构 - 对标业内的一些解决方案

    本文来自美团蔡金龙老师的分享,介绍了最近几年美团点评MySQL数据库高可用架构的演进过程,以及我们在开源技术基础上做的一些创新.同时,也和业界其它方案进行综合对比,了解业界在高可用方面的进展,和未来我 ...

  6. MySQL(10)数据库实现高可用架构之MHA

    文章目录 一.MySQL MHA介绍 1.1 什么是 MHA? 1.2 MHA 的组成 1) MHA Node(数据节点) 2) MHA Manager(管理节点) 1.3 MHA 的特点 二.MyS ...

  7. 美团点评基于MGR的CMDB高可用架构搭建之路

    来自:DBAplus社群 本文根据王志朋老师在dbaplus社群[2018年8月4日北京数据架构与数据优化技术沙龙]现场演讲内容整理而成. 讲师介绍 王志朋 美团点评DBA 曾在京东金融担任DBA,目 ...

  8. ES+Redis+MySQL,高可用架构设计太牛了!(至尊典藏版)

    目录 前言 一.ES 高可用方案 1.1.ES 双中心主备集群架构 1.2.ES 流量隔离三集群架构 1.3.ES 集群深度优化提升 二.会员 Redis 缓存方案 2.1. ES 近一秒延时导致的 ...

  9. MySQL 高可用架构 之 MHA (Centos 7.5 MySQL 5.7.18 MHA 0.58)

    目录 简介 环境准备 秘钥互信 安装基础依赖包 安装MHA组件 安装 MHA Node组件 安装 MHA Manager 组件 建立 MySQL 一主三从 初始化 MySQL 启动MySQL 并简单配 ...

最新文章

  1. 大跌眼镜!杭州一程序员年薪 30 万,竟靠偷车厘子缓解压力?
  2. 本题主要考查指针与数组
  3. win7 打开“计算机”慢,win7电脑启动慢解决方法
  4. 30 整数中1出现的次数(从1到n整数中1出现的次数)这题很难要多看*
  5. 常用公有云接入——AZURE
  6. encodeURI() 的用法
  7. 亚像素边缘提取方法总结
  8. 快码!数据可视化大屏设计必备步骤
  9. 利用Procexp工具监控Windows平台上的Oracle数据库性能
  10. 注意力机制attention和Transformer
  11. 《花花公子》刊登1985年乔布斯专访
  12. loss 加权_为每个类别/实例编写自定义损失加权,对,的,loss
  13. 手机分辨率大小自适应功能
  14. .NET Interop 互操作 COM+
  15. CBAM CBAM: Convolutional Block Attention Module
  16. Python_pymysql
  17. 《超时空要塞》与《太空堡垒》之缘——同样伟大的硬币两面
  18. 使用 Python 构建图片搜索引擎
  19. 维修普源DS1102E示波器 24位脉冲编码器
  20. HTML+CSS学习(五)

热门文章

  1. 计算机毕业设计论文该怎么写?软件工程毕设选题推荐有哪些;计算机毕业设计不会做怎么办;怎么做什么简单;电子信息工程毕业设计要做到什么程度
  2. 小米手机刷机鸿蒙,小米10升级鸿蒙系统刷机包
  3. 全网最全软件测试面试题,拿不到offer算我输!
  4. html页面转成PDF,PDF下载
  5. 螺旋矩阵常数复杂度解法
  6. intern()详解
  7. 关于文件夹的手动隐藏和恢复
  8. 基于java汽车4S服务管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  9. 微信小程序模板信息【详】
  10. MAC | svn: E175002: DAV request failed: 411 Content length required.