MySQL高可用集群之MHA

MySQL高可用集群之MHA

一、MHA简介

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。 MHA里有两个角色一个是MHA Node(数据节点)另一个是MHA Manager(管理节点)

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

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

同步的概念:

  • 异步复制(Asynchronous replication) MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。
  • 全同步复制(Fully synchronous replication) 指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
  • 半同步复制(Semisynchronous replication) 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

    总结:

    异步与半同步异同 默认情况下MySQL的复制是异步的,Master上所有的更新操作写入Binlog之后并不确保所有的更新都被复制到Slave之上。异步操作虽然效率高,但是在Master/Slave出现问题的时候,存在很高数据不同步的风险,甚至可能丢失数据。 MySQL5.5引入半同步复制功能的目的是为了保证在master出问题的时候,至少有一台Slave的数据是完整的。在超时的情况下也可以临时转入异步复制,保障业务的正常使用,直到一台salve追赶上之后,继续切换到半同步模式。

工作原理

相较于其它HA软件,MHA的目的在于维持MySQL Replication中Master库的高可用性,其最大特点是可以修复多个Slave之间的差异日志,最终使所有Slave保持数据一致,然后从中选择一个充当新的Master,并将其它Slave指向它。 从宕机崩溃的master保存二进制日志事件(binlogevents)。 识别含有最新更新的slave。应用差异的中继日志(relay log)到其它slave。 应用从master保存的二进制日志事件(binlogevents)。 提升一个slave为新master。 使其它的slave连接新的master进行复制。

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器。

二、部署MHA

环境:

主机 操作系统 IP地址
master1 CentOS 7.3 192.168.1.1
master2(备主) CentOS 7.3 192.168.1.8
slave1 CentOS 7.3 192.168.1.9
manager CentOS 7.3 192.168.1.3

其中master对外提供写服务,备选master2提供读服务,slave也提供相关的读服务,一旦master1宕机,将会把master2提升为新的master,slave指向新的master,manager作为管理服务器。

案例中关闭防火墙、selinux

# systemctl stop firewalld
# setenforce 0

1、基础环境准备

1)在配置好IP地址后检查Selinux,Firewalld设置,关闭 Selinux ,Firewalld服务以便后期主从同步不出错 注:时间要同步

修改hosts文件,并传到其他主机

[[email protected] ~]# vim /etc/hosts
192.168.1.1  master1
192.168.1.8  master2
192.168.1.9  slave1
192.168.1.3  manager

[[email protected] ~]# for i in master2 slave1 manager ; do scp /etc/hosts $i:/etc/hosts ; done

配置NTP时间同步(master1):

[[email protected] ~]# vim /etc/chrony.conf


在其他服务器的配置文件中指向master1的IP地址

配置完成后,重新启动chronyd服务,配置开机自启

# systemctl restart chronyd
# systemctl enable chronyd

2)配置epel源(4台主机)

https://developer.aliyun.com/mirror/

# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

3)建立SSH无交互登陆环境(4台主机)

# ssh-keygen -t rsa
# for host in master1 master2 slave1 manager ;do ssh-copy-id -i ~/.ssh/id_rsa.pub $host;done

测试ssh无交互登录

在其他主机上执行同样的测试操作。

2、配置MySQL半同步复制

为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL的半同步复制。
PS:mysql半同步插件是由谷歌提供,具体位置/usr/local/mysql/lib/plugin/下,一个是master用的semisync_master.so,一个是slave用的semisync_slave.so。

下面就来具体配置一下。 如果不清楚Plugin的目录,用如下查找:

[[email protected] ~]# mysql -uroot -p123.com
mysql> show variables like ‘%plugin_dir%‘;

1)分别在主从节点上安装相关的插件(master1, master2,slave1) 在MySQL上安装插件需要数据库支持动态载入。检查是否支持,用如下检测

mysql> show variables like ‘%have_dynamic%‘;

所有MySQL数据库服务器,安装半同步插件(semisync_master.so,semisync_slave.so)

mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so‘;
Query OK, 0 rows affected (0.01 sec)

mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;
Query OK, 0 rows affected (0.01 sec)
其他mysql主机采用同样的方法安装 

检查Plugin是否已正确安装:

mysql> show plugins\G


或:

mysql> select * from information_schema.plugins\G;

查看半同步相关信息

mysql> show variables like ‘%rpl_semi_sync%‘;


可以看到半同复制插件已经安装,只是还没有启用,所以是off

2)修改my.cnf文件,配置主从同步:

PS:若主MYSQL服务器已经存在,只是后期才搭建从MYSQL服务器,在置配数据同步前应先将主MYSQL服务器的要同步的数据库拷贝到从MYSQL服务器上(如先在主MYSQL上备份数据库,再用备份在从MYSQL服务器上恢复)

在DB的配置文件中添加:
master1主机:

[[email protected] ~]# vim /etc/my.cnf
server-id=1
log-bin=mysql-bin       //二进制日志
binlog_format=mixed     //binlog日志格式,mysql默认采用statement,建议使用mixed
log-bin-index=mysql-bin.index
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
relay-log = relay-bin       //中继日志,存储所有主库TP过来的binlog事件
relay-log-index=slave-relay-bin.index

PS:

  • rpl_semi_sync_master_enabled=1 //1表是启用,0表示关闭
  • rpl_semi_sync_master_timeout=10000:毫秒单位 ,该参数主服务器等待确认消息10秒后,不再等待,变为异步方式。
  • relay_log_purge=0,禁止 SQL 线程在执行完一个 relay log 后自动将其删除,对于MHA场景下,对于某些滞后从库的恢复依赖于其他从库的relay log,因此采取禁用自动删除功能

master2主机:

[[email protected] ~]# vim /etc/my.cnf
server-id=2
log-bin=mysql-bin
binlog_format=mixed
log-bin-index=mysql-bin.index
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
relay-log = relay-bin
relay-log-index=slave-relay-bin.index

slave1主机:

[[email protected] ~]# vim /etc/my.cnf
server-id=3
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=slave-relay-bin.index
read_only=1
rpl_semi_sync_slave_enabled=1

重启服务,查看半同步相关信息

# systemctl restart mysqld
[[email protected] ~]# mysql -uroot -p123.com
mysql> show variables like ‘%rpl_semi_sync%‘;

查看半同步状态:

mysql> show status like ‘%rpl_semi_sync%‘;

有几个状态参数值得关注的:

  • rpl_semi_sync_master_status:显示主服务是异步复制模式还是半同步复制模式
  • rpl_semi_sync_master_clients :显示有多少个从服务器配置为半同步复制模式
  • rpl_semi_sync_master_yes_tx :显示从服务器确认成功提交的数量
  • rpl_semi_sync_master_no_tx :显示从服务器确认不成功提交的数量
  • rpl_semi_sync_master_tx_avg_wait_time :事务因开启 semi_sync ,平均需要额外等待的时间
  • rpl_semi_sync_master_net_avg_wait_time :事务进入等待队列后,到网络平均等待时间

在DB上创建授权用户
master1:
创建用于主从复制的账号(master1,master2都要创建):

mysql> grant replication slave on *.* to [email protected]‘192.168.1.%‘ identified by ‘123.com‘;
Query OK, 0 rows affected, 1 warning (1.01 sec)

创建MHA管理账号(三台DB服务器)MHA会在配置文件里要求能远程登录到数据库,所以要进行必要的赋权:

mysql> grant all privileges on *.* to [email protected]‘192.168.1.%‘ identified by ‘123.com‘;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show master status;

master2主机:

[[email protected] ~]# mysql -uroot -p123.com
mysql> grant replication slave on *.* to [email protected]‘192.168.1.%‘ identified by ‘123.com‘;      //主从复制账号
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> grant all privileges on *.* to [email protected]‘192.168.1.%‘ identified by ‘123.com‘;        //MHA管理账号
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host=‘192.168.1.1‘,master_port=3306,master_user=‘mharep‘,master_password=‘123.com‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=742;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave;     //开启主从同步
Query OK, 0 rows affected (0.01 sec)

查看从的状态,以下两个值必须为yes,代表从服务器能正常连接主服务器

mysql> show slave status\G;

slave1主机:

[[email protected] ~]# mysql -uroot -p123.com
mysql> grant all privileges on *.* to [email protected]‘192.168.1.%‘ identified by ‘123.com‘;        //MHA管理账号
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host=‘192.168.1.1‘,master_port=3306,master_user=‘mharep‘,master_password=‘123.com‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=742;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

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

查看从的状态,以下两个值必须为yes,代表从服务器能正常连接主服务器

mysql> show slave status\G

查看master服务器的半同步状态:

mysql> show status like ‘%rpl_semi_sync%‘;

3、配置MySQL-MHA

MHA包括manager节点和data节点,data节点包括原有的MySQL复制结构中的主机,至少3台,即1主2从,当masterfailover后,还能保证主从结构;只需安装node包。

  • manager server:运行监控脚本,负责monitoring
  • auto-failover:需要安装node包和manager包

1)在所有主机上安装MHA所依赖的软件包(需要系统自带的YUM源并联网)

# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Config-IniFiles ncftp perl-Params-Validate perl-CPAN perl-Test-Mock-LWP.noarch perl-LWP-Authen-Negotiate.noarch perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

更改当前cpan源,在案例中可能遇到没有安装的依赖库,使用国内源安装时快

[[email protected] ~]# cpan  

删除之前的源:

cpan[1]> o conf urllist

cpan[2]> o conf urllist pop http://mirrors.nxthost.com/CPAN/
cpan[3]> o conf urllist pop http://mirrors.nic.cz/CPAN/
cpan[4]> o conf urllist pop http://cpan.panu.it/
cpan[5]> o conf urllist

添加国内源:

cpan[6]>  o conf urllist push http://mirrors.aliyun.com/CPAN/
cpan[7]> o conf urllist push http://mirrors.163.com/cpan/
cpan[8]> o conf urllist  


提交保存退出

cpan[10]> o conf commit
cpan[11]> o conf urllist

cpan[12]> exit

2)以下操作管理节点需要两个都安装,在3台数据库节点只要安装MHA的node节点:

软件下载 https://github.com/yoshinorim

在所有数据库节点上安装mha4mysql-node-0.58.tar.gz(在管理节点需要node和manager都要安装都安装)

# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gzls
# tar zxf mha4mysql-node-0.58.tar.gz
# cd mha4mysql-node-0.58/
# 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
# make && make install

在manager安装mha4mysql-manager-0.58.tar.gz(node使用上面的方法安装)


[[email protected] ~]# cd /usr/local/src/
[[email protected] src]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
[[email protected] src]# tar zxf mha4mysql-manager-0.58.tar.gz
[[email protected] src]# cd mha4mysql-manager-0.58/
[[email protected] mha4mysql-manager-0.58]# perl Makefile.PL
[[email protected] mha4mysql-manager-0.58]# 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        ...missing.
==> Auto-install the 1 mandatory module(s) from CPAN? [y] y
*** Dependencies will be installed the next time you type ‘make‘.
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Warning: prerequisite MHA::NodeConst 0 not found.
Writing Makefile for mha4mysql::manager
[[email protected] mha4mysql-manager-0.58]# make && make install

创建关于服务的相关目录,复制脚本,配置文件(存放命令、配置文件、脚本…)

[[email protected] mha4mysql-manager-0.58]# mkdir /etc/masterha
[[email protected] mha4mysql-manager-0.58]# mkdir -p /masterha/app1
[[email protected] mha4mysql-manager-0.58]# mkdir /scripts
[[email protected] mha4mysql-manager-0.58]# cp samples/conf/* /etc/masterha/
[[email protected] mha4mysql-manager-0.58]# cp samples/scripts/* /scripts/

3)配置MHA

与绝大多数Linux应用程序类似,MHA的正确使用依赖于合理的配置文件。MHA的配置文件与mysql的my.cnf文件配置相似,采取的是param=value的方式来配置,配置文件位于管理节点,通常包括每一个mysql server的主机名,mysql用户名,密码,工作目录等等。

编辑/etc/masterha/app1.conf,内容如下:

[[email protected] mha4mysql-manager-0.58]# vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/masterha/app1      //设置manager的工作目录
manager_log=/masterha/app1/manager.log      //设置manager的日志 user=manager
user=manager        //设置监控用户manager
password=123.com        //监控用户manager的密码
ssh_user=root       //ssh连接用户
repl_user=mharep        //主从复制用户
repl_password=123.com       //主从复制用户密码
ping_interval=1     //设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover

[server1]
hostname=192.168.1.1
port=3306
master_binlog_dir=/usr/local/mysql/data     //设置master 保存binlog的位置,以便MHA可以找到master的日志,这里的也就是mysql的数据目录
candidate_master=1      //设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库

[server2]
hostname=192.168.1.8
port=3306
master_binlog_dir=/usr/local/mysql/data
candidate_master=1

[server3]
hostname=192.168.1.9
port=3306
master_binlog_dir=/usr/local/mysql/data
no_master=1
[[email protected] mha4mysql-manager-0.58]# >/etc/masterha/masterha_default.cnf        //清空文件内容

SSH 有效性验证:

[[email protected] mha4mysql-manager-0.58]# masterha_check_ssh --global_conf=/etc/masterha/masterha_default.cnf --conf=/etc/masterha/app1.cnf

集群复制的有效性验证: mysql必须都启动

[[email protected] mha4mysql-manager-0.58]# masterha_check_repl --global_conf=/etc/masterha/masterha_default.cnf --conf=/etc/masterha/app1.cnf
Sat Feb 22 15:05:26 2020 - [info] Reading default configuration from /etc/masterha/masterha_default.cnf..
Sat Feb 22 15:05:26 2020 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Sat Feb 22 15:05:26 2020 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Sat Feb 22 15:05:26 2020 - [info] MHA::MasterMonitor version 0.58.
Sat Feb 22 15:05:27 2020 - [info] GTID failover mode = 0
Sat Feb 22 15:05:27 2020 - [info] Dead Servers:
Sat Feb 22 15:05:27 2020 - [info] Alive Servers:
Sat Feb 22 15:05:27 2020 - [info]   192.168.1.1(192.168.1.1:3306)
Sat Feb 22 15:05:27 2020 - [info]   192.168.1.8(192.168.1.8:3306)
Sat Feb 22 15:05:27 2020 - [info]   192.168.1.9(192.168.1.9:3306)
Sat Feb 22 15:05:27 2020 - [info] Alive Slaves:
Sat Feb 22 15:05:27 2020 - [info]   192.168.1.8(192.168.1.8:3306)  Version=5.7.28-log (oldest major version between slaves) log-bin:enabled
Sat Feb 22 15:05:27 2020 - [info]     Replicating from 192.168.1.1(192.168.1.1:3306)
Sat Feb 22 15:05:27 2020 - [info]     Primary candidate for the new Master (candidate_master is set)
Sat Feb 22 15:05:27 2020 - [info]   192.168.1.9(192.168.1.9:3306)  Version=5.7.28-log (oldest major version between slaves) log-bin:enabled
Sat Feb 22 15:05:27 2020 - [info]     Replicating from 192.168.1.1(192.168.1.1:3306)
Sat Feb 22 15:05:27 2020 - [info]     Not candidate for the new Master (no_master is set)
Sat Feb 22 15:05:27 2020 - [info] Current Alive Master: 192.168.1.1(192.168.1.1:3306)
Sat Feb 22 15:05:27 2020 - [info] Checking slave configurations..
Sat Feb 22 15:05:27 2020 - [info]  read_only=1 is not set on slave 192.168.1.8(192.168.1.8:3306).
Sat Feb 22 15:05:27 2020 - [warning]  relay_log_purge=0 is not set on slave 192.168.1.9(192.168.1.9:3306).
Sat Feb 22 15:05:27 2020 - [info] Checking replication filtering settings..
Sat Feb 22 15:05:27 2020 - [info]  binlog_do_db= , binlog_ignore_db=
Sat Feb 22 15:05:27 2020 - [info]  Replication filtering check ok.
Sat Feb 22 15:05:27 2020 - [info] GTID (with auto-pos) is not supported
Sat Feb 22 15:05:27 2020 - [info] Starting SSH connection tests..
Sat Feb 22 15:05:29 2020 - [info] All SSH connection tests passed successfully.
Sat Feb 22 15:05:29 2020 - [info] Checking MHA Node version..
Sat Feb 22 15:05:29 2020 - [info]  Version check ok.
Sat Feb 22 15:05:29 2020 - [info] Checking SSH publickey authentication settings on the current master..
Sat Feb 22 15:05:29 2020 - [info] HealthCheck: SSH to 192.168.1.1 is reachable.
Sat Feb 22 15:05:29 2020 - [info] Master MHA Node version is 0.58.
Sat Feb 22 15:05:29 2020 - [info] Checking recovery script configurations on 192.168.1.1(192.168.1.1:3306)..
Sat Feb 22 15:05:29 2020 - [info]   Executing command: save_binary_logs --command=test --start_pos=4 --binlog_dir=/usr/local/mysql/data --output_file=/var/tmp/save_binary_logs_test --manager_version=0.58 --start_file=mysql-bin.000001
Sat Feb 22 15:05:29 2020 - [info]   Connecting to [email protected](192.168.1.1:22)..
  Creating /var/tmp if not exists..    ok.
  Checking output directory is accessible or not..
   ok.
  Binlog found at /usr/local/mysql/data, up to mysql-bin.000001
Sat Feb 22 15:05:29 2020 - [info] Binlog setting check done.
Sat Feb 22 15:05:29 2020 - [info] Checking SSH publickey authentication and checking recovery script configurations on all alive slave servers..
Sat Feb 22 15:05:29 2020 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user=‘manager‘ --slave_host=192.168.1.8 --slave_ip=192.168.1.8 --slave_port=3306 --workdir=/var/tmp --target_version=5.7.28-log --manager_version=0.58 --relay_log_info=/usr/local/mysql/data/relay-log.info  --relay_dir=/usr/local/mysql/data/  --slave_pass=xxx
Sat Feb 22 15:05:29 2020 - [info]   Connecting to [email protected](192.168.1.8:22)..
  Checking slave recovery environment settings..
    Opening /usr/local/mysql/data/relay-log.info ... ok.
    Relay log found at /usr/local/mysql/data, up to relay-bin.000002
    Temporary relay log file is /usr/local/mysql/data/relay-bin.000002
    Checking if super_read_only is defined and turned on.. not present or turned off, ignoring.
    Testing mysql connection and privileges..
mysql: [Warning] Using a password on the command line interface can be insecure.
 done.
    Testing mysqlbinlog output.. done.
    Cleaning up test file(s).. done.
Sat Feb 22 15:05:29 2020 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user=‘manager‘ --slave_host=192.168.1.9 --slave_ip=192.168.1.9 --slave_port=3306 --workdir=/var/tmp --target_version=5.7.28-log --manager_version=0.58 --relay_log_info=/usr/local/mysql/data/relay-log.info  --relay_dir=/usr/local/mysql/data/  --slave_pass=xxx
Sat Feb 22 15:05:29 2020 - [info]   Connecting to [email protected](192.168.1.9:22)..
  Checking slave recovery environment settings..
    Opening /usr/local/mysql/data/relay-log.info ... ok.
    Relay log found at /usr/local/mysql/data, up to relay-bin.000002
    Temporary relay log file is /usr/local/mysql/data/relay-bin.000002
    Checking if super_read_only is defined and turned on.. not present or turned off, ignoring.
    Testing mysql connection and privileges..
mysql: [Warning] Using a password on the command line interface can be insecure.
 done.
    Testing mysqlbinlog output.. done.
    Cleaning up test file(s).. done.
Sat Feb 22 15:05:30 2020 - [info] Slaves settings check done.
Sat Feb 22 15:05:30 2020 - [info]
192.168.1.1(192.168.1.1:3306) (current master)
 +--192.168.1.8(192.168.1.8:3306)
 +--192.168.1.9(192.168.1.9:3306)

Sat Feb 22 15:05:30 2020 - [info] Checking replication health on 192.168.1.8..
Sat Feb 22 15:05:30 2020 - [info]  ok.
Sat Feb 22 15:05:30 2020 - [info] Checking replication health on 192.168.1.9..
Sat Feb 22 15:05:30 2020 - [info]  ok.
Sat Feb 22 15:05:30 2020 - [warning] master_ip_failover_script is not defined.
Sat Feb 22 15:05:30 2020 - [warning] shutdown_script is not defined.
Sat Feb 22 15:05:30 2020 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.

验证成功的话会自动识别出所有服务器和主从状况

PS:验证成功的话会自动识别出所有服务器和主从状况 在验证时,若遇到这个错误:Can‘t exec "mysqlbinlog" ...... 解决方法是在所有服务器上执行:
*ln -s /usr/local/mysql/bin/ /usr/local/bin/**

启动 manager

[[email protected] ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/tmp/mha_manager.log &
[1] 12451

PS:在应用Unix/Linux时,一般想让某个程序在后台运行,常会用 & 在程序结尾来让程序自动运行。比如要运行mysql在后台: /usr/local/mysql/bin/mysqld_safe –user=mysql &。可是有很多程序并不像mysqld一样,这样就需要nohup(后台运行的进程,并不会随着shell环境的关闭而杀死进程)命令

状态检查:

[[email protected] ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:12451) is running(0:PING_OK), master:192.168.1.1

4、故障转移验证:

(自动failover) master dead后,MHA当时已经开启,候选Master库(Slave)会自动failover为Master.
验证方式:
先停掉 master1,因为之前的配置文件中,把master2作为了候选人,那么就到 slave1上查看 master 的 IP 是否变为了 master2的IP

1)在master1上把 mysql 停掉

[[email protected] mha4mysql-node-0.58]# systemctl stop mysqld

2)查看 MHA 日志 上面的配置文件中指定了日志位置为/masterha/app1/manager.log

[[email protected] ~]# cat /masterha/app1/manager.log


从日志信息中可以看到 master failover 已经成功了,并可以看出故障转移的大体流程

3)检查 slave1的复制

登录 slave1的Mysql,查看 slave 状态

[[email protected] mha4mysql-node-0.58]# mysql -uroot -p123.com
mysql> show slave status\G

可以看到 master 的 IP 现在为 192.168.1.8, 已经切换到和192.168.1.8同步了,本来是和192.168.1.1同步的,说明 MHA 已经把master2提升为了新的 master,IO线程和SQL线程也正确运行,MHA搭建成功

三、MHA Manager 端日常主要操作步骤

1、检查是否有下列文件,有则删除。

发生主从切换后,MHAmanager服务会自动停掉,且在manager_workdir(/masterha/app1)目录下面生成文件app1.failover.complete(若要启动MHA,必须先确保无此文件) 如果有这个提示,那么删除此文件

/ masterha/app1/app1.failover.complete [error]
[/usr/share/perl5/vendor_perl/MHA/MasterFailover.pm, ln298] Last failover was done at 2015/01/09 10:00:47.
Current time is too early to do failover again. If you want to do failover, manually remove /
masterha/app1/app1.failover.complete and run this script again.

2、检查MHA复制检查:(需要把master1设置成master2的从服务器)

mysql> show master status;

[[email protected] ~]# systemctl start mysqld
[[email protected] ~]# mysql -uroot -p123.com
mysql> change master to master_host=‘192.168.1.8‘,master_port=3306,master_log_file=‘mysql-bin.000001‘,master_log_pos=742,master_user=‘mharep‘,master_password=‘123.com‘;
mysql> start slave;

在manager检查集群状态:

[[email protected] ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf      

3、停止MHA:

[[email protected] ~]# masterha_stop --conf/etc/masterha/app1.cnf

4、启动MHA:

[[email protected] ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/tmp/mha_manager.log &

当有slave 节点宕掉时,默认是启动不了的,加上 --ignore_fail_on_start 即使有节点宕掉也能启动MHA,如下:

[[email protected] ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --ignore_fail_on_start&>/tmp/mha_manager.log &

5、检查状态:

[[email protected] ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:13739) is running(0:PING_OK), master:192.168.1.8

PS:如果正常,会显示"PING_OK",否则会显示"NOT_RUNNING",这代表MHA监控没有开启。

6、检查日志:

[[email protected] ~]# tail -f /masterha/app1/manager.log

7、主从切换后续工作

重构:重构就是主服务器宕机了,切换到备主上,备主变成了主。
因此重构的一种方案:
原主库修复成一个新的slave,主库切换后,把原主库修复成新从库。然后重新执行以上5步。

原主库数据文件完整的情况下,可通过以下方式找出最后执行的CHANGE MASTER命令:

[[email protected] ~]# grep "CHANGE MASTER TO MASTER" /masterha/app1/manager.log | tail -1
Sat Feb 22 15:25:21 2020 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST=‘192.168.1.8‘, MASTER_PORT=3306, MASTER_LOG_FILE=‘mysql-bin.000001‘, MASTER_LOG_POS=742, MASTER_USER=‘mharep‘, MASTER_PASSWORD=‘xxx‘;

定期删除中继日志 在配置主从复制中,slave上设置了参数relay_log_purge=0,所以slave节点需要定期删除中继日志,建议每个slave节点删除中继日志的时间错开。

# crontab -e
0 5 * * * /usr/local/bin/purge_relay_logs - -user=root --password=123.com --port=3306 --disable_relay_log_purge >> /var/log/purge_relay.log 2>&1

原文地址:https://blog.51cto.com/14638500/2472980

时间: 2024-10-15 13:18:00

MySQL高可用集群之MHA的相关文章

MySQL 高可用集群架构 MHA

MHA(Master HighAvailability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用. MHA里有两个角色一个是MHA Node(数据节点)另一个是

MYSQL高可用集群架构-MHA架构

简介 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用. 该软件由两部分组成:MHA Manager(管理节点

MySQL高可用集群架构——MHA架构

MHA 简介: (1)简介 目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用. (2)该软件由两部分组成: MHA Manager(管理节点)和MHA Node(数据节

mysql高可用集群——MHA架构

目录 1.下载 2.搭建mha 2.1 系统配置 2.2 架构 2.3 添加ssh公钥信任 2.4 安装mha节点 2.5 manager配置文件 2.6 检查 2.7 启动manager进程 2.8 碰到的问题 3.测试切换 3.1 正常切换测试 3.2 回切测试 3.3 雪崩测试 3.4 主从不一致切换测试 下载 mha链接地址:http://pan.baidu.com/s/1pJkDGX9#dir/path=%2Fmysql%2FHA%2Fmha 或者:https://code.googl

配置MySQL高可用集群MHA

配置MySQL高可用集群+++++++++++++++++++主机角色 :客户端 client50数据库服务器 mysql51 到 mysql55管理主机 mgm56VIP地址 192.168.4.100拓扑结构: client50 | mysql51主 | | | | | |mysql52 mysql53 mysql54 mysql55 mgm56从 从 从 从 管理集群备用主 备用主+++++++++++++++++++++++++++++++++++++++++++++++++++++++

企业主流MySQL高可用集群架构三部曲之PXC

前段时间,老张给大家介绍了企业中主流MySQL高可用集群架构三部曲中的前两部,有不了解的同学可以去访问我之前的博客内容. 第一部曲直通车>> 企业中MySQL主流高可用架构实战三部曲之MHA 第二部曲直通车>>企业中MySQL高可用集群架构三部曲之MM+keepalived 独家新课程上线>>MySQL体系结构深入剖析及实战DBA视频课程 今儿给大家介绍最后一部曲,是percona公司的percona xtraDB cluster.简称PXC.它是基于GaLera协议的

mysql高可用集群方案

这里有一篇关于Mysql高可用方案的干货文章:[干货分享] 一文了解数据库高可用容灾方案的设计与实现 网友们公司中的使用方案讨论:想问各位大大 MySQL 是怎么做高可用的? 一.Mysql高可用解决方案 方案一:共享存储 一般共享存储采用比较多的是 SAN/NAS 方案. 方案二:操作系统实时数据块复制 这个方案的典型场景是 DRBD,DRBD架构(MySQL+DRBD+Heartbeat) 方案三:主从复制架构 主从复制(一主多从) MMM架构(双主多从) MHA架构(多主多从) 方案四:数

通过MMM构建MYSQL高可用集群系统

本文为南非蚂蚁的书籍<循序渐进linux-第二版>-8.4的读笔记 MMM集群套件(MYSQL主主复制管理器) MMM套件主要的功能是通过下面三个脚本实现的 1)mmm_mond 这是一个监控进程,运行在管理节点上,主要负责都所有数据库的监控工作,同时决定和处理所有节点的角色切换 2)mmm_agentd 这是一个代理进程,运行在每个MYSQL服务器上,主要完成监控的测试工作以及执行简单的远端服务设置 3)mmm_control 简单的管理脚本,用来查看和管理集群运行状态,同事管理mmm_mo

基于Corosync + Pacemaker+DRBD实现MySQL高可用集群

前言 在众多的高可用集群解决方案中,除了Heartbeat之外,Corosync也能提供类似于Heartbeat一样的功能,而且目前RedHat官方提供的高可用集群解决方案的程序包都以Corosync为主,所以在未来的日子Corosync会逐渐取代Heartbeat.本文带来的是基于Corosync + Pacemaker+DRBD的MySQL高可用集群解决方案. 相关介绍 Corosync Corosync是从OpenAIS中分支出来的一个项目,它在传递信息的时候可以通过一个简单的配置文件来定