MySQL MHA高可用15 min read

  • A+
所属分类:MySQL

本博文二次刷新可代码高亮

  

        1. MHA简介 

            1.1 MHA介绍 

            1.2 MHA组成及原理 

            1.3 MHA缺点 

        2. 测试主机规划 

        3. 安装 

        4. 配置 

        5. MHA启动 

        6. 测试 

        7. 重新启动原主库(urcar0),作为新的从库 

        8. 重新配置MHA监控 

        9. 测试当前主库urcar2宕机

        10 重新配置MHA监控

        11. 注意事项 

   

说明:本文只写了MySQL数据库高可用MHA的切换配置

   

1. MHA简介

  

1.1 MHA介绍

  

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

   

1.2 MHA组成及原理

 

    该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。

 

Manager工具包主要包括以下几个工具:

masterha_check_ssh        #检查MHA的SSH配置状况
masterha_check_repl       #检查MySQL复制状况
masterha_manger           #启动MHA
masterha_check_status     #检测当前MHA运行状态
masterha_master_monitor   #检测master是否宕机
masterha_master_switch    #控制故障转移(自动或者手动)
masterha_conf_host        #添加或删除配置的server信息

   

MHA Node运行在每台MySQL服务器上

Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:

save_binary_logs        #保存和复制master的二进制日志
apply_diff_relay_logs   #识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog      #去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs        #清除中继日志(不会阻塞SQL线程)

原理: MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

  

1.3 MHA缺点

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

   

2. 测试主机规划

     

序号

主机名

IP地址

端口

角色

1

urcar0

172.16.83.200

3306

主库

2

urcar2

172.16.83.202

3306

备选从库

3

urcar3

172.16.83.203

3306

管理节点、从库

  

部署环境补充说明:

  1. 本次部署环境为urcar0和urcar2互为主从,urcar3是urcar0的从库(提前配置好的)。

  2. 从库urcar2需要开启binlog,因为要与urcar0做高可用,urcar1宕机urcar2自动升为主库,如果需要与urcar3切换那就开启urcar3 binlog功能即可。

  3. 默认允许root登录,如果服务器上禁止root登录可修改配置如下(urcar0/urcar2/urcar3):

## vim /etc/ssh/sshd_config
PermitRootLogin yes
/etc/init.d/sshd restart      #<== 重启ssh服务

  4. 系统版本:CentOS6.x

  5. 在本文中以下的从服务器的一些操作在urcar0也要操作一遍,因为本篇文档开始是以一主两从的环境部署的,所以可能会有遗漏

  6. 本文档只供参考

   

3. 安装

   

(1)MHA-node节点安装(urcar0、urcar2、urcar3)

1. 安装epel源

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

 

2. 安装所需依赖

yum -y install perl-DBD-MySQL

   

3. 上传或者下载MHA node rpm包

cd /home/soft
wget https://www.linuxgogo.com/repodata/Binary/CentOS_6/MySQL/MHA/mha4mysql-node-0.56-0.el6.noarch.rpm --no-check-certificate
yum -y localinstall mha4mysql-node-0.56-0.el6.noarch.rpm     #<== 本地下载

    

(2)MHA- Manager端安装(urcar3)

4. 在管理节点urcar3上安装mha的manager rpm包

yum安装所需依赖

yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch \
perl-Parallel-ForkManager perl-Time-HiRes

检查是否安装完成(一共5个依赖包)

rpm -qa perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch \
perl-Parallel-ForkManager perl-Time-HiRes|wc -l

安装mha的manager rpm包

cd /home/soft
wget https://www.linuxgogo.com/repodata/Binary/CentOS_6/MySQL/MHA/mha4mysql-manager-0.56-0.el6.noarch.rpm --no-check-certificate
yum -y localinstall mha4mysql-manager-0.56-0.el6.noarch.rpm #<== 本地下载

      

4. 配置

    

5. 从服务器(urcar2、urcar3),要加上relay_log_purge=0,不加的话,会报出

warning,relay_log_purge=0 is not set on slave

 说明: MySQL数据库主从复制在缺省情况下从库的relay logs会在SQL线程执行完毕后被自动删除,但是对于MHA场景下,对于某些滞后从库的恢复依赖于其他从库的relay log,因此采取禁用自动删除功能以及定期清理的办法。

  

urcar2服务器上的操作

[root@urcar2 ~]# vim /etc/my.cnf  
[mysqld]
relay_log_purge = 0
log-bin=mysql-bin
[root@urcar2 ~]# /etc/init.d/mysqld restart  #<== 重启生效

      

urcar3服务器上的操作

[root@urcar3 ~]# vim /etc/my.cnf
[mysqld]
relay_log_purge = 0
[root@urcar3 ~]# /etc/init.d/mysqld restart   #<== 重启生效

    

6. 所有节点添加管理MHA的账号(urcar0urcar2urcar3

mysql> grant all privileges on *.* TO mha@'172.16.83.%' IDENTIFIED BY '******';
mysql> flush privileges;

     

7. 在管理节点urcar3上编辑配置文件

[root@urcar3 ~]# mkdir /etc/mha
[root@urcar3 ~]# mkdir -p /var/log/mha/app1
[root@urcar3 ~]# vim /etc/mha/app1.cnf     #<== 新创建的urcar3 mha管理端配置文件
[server default]
manager_log=/var/log/mha/app1/manager.log 
manager_workdir=/var/log/mha/app1.log 
master_binlog_dir=/app/mysql/
user=mha
password=******
ping_interval=2
repl_user=rep
repl_password=******
ssh_port=22
ssh_user=root
 
[server1]
hostname=172.16.83.200
ssh_port=****
port=3306
 
[server2]
candidate_master=1
check_repl_delay=0
hostname=172.16.83.202
port=3306
[server3]
hostname=172.16.83.203
port=3306

以下为配置文件的详细解释

[server default]
manager_log=/var/log/mha/app1/manager.log   # manager日志
manager_workdir=/var/log/mha/app1.log         # manager的工作日志
master_binlog_dir=/app/mysql/               # master 保存binlog的位置,以便MHA可以找到master的日志
user=mha                # mha用户
password=******         # mha用户的密码
ping_interval=2         # 设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
repl_user=rep           # 设置主从复制用户
repl_password=******    # 主从复制用户密码
ssh_port=22             # 指定本机的端口号,默认是就是22
ssh_user=root           # SSH远程连接用户名
 
[server1]               # MySQL数据库主从复制【主】服务器信息
hostname=172.16.83.200  # mha链接的主服务器信息
ssh_port=****           # ssh端口
port=3306               # MySQL端口
 
[server2]               # MySQL数据库主从复制【从】服务器信息
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
hostname=172.16.83.202
port=3306
[server3]                # MySQL数据库主从复制【从】服务器信息
hostname=172.16.83.203
port=3306
-------------------------------------------------------------------

    

8. 配置三台机器SSH互信(urcar0、urcar2、urcar3),这里就简单说一下
      参考博文:https://www.linuxgogo.com/669.html
                        https://www.linuxgogo.com/696.html

8.1 生成密钥对(以下选一种方法即可)

ssh-keygen -t rsa             #<== 交互式生成密钥对(一路回车)
ssh-keygen –t rsa –P ‘ ’ –f ~/.ssh/id_rsa >/dev/null 2>&1  #<== 非交互式生成密钥对

8.2 互相分发公钥(urcar0、urcar2、urcar3)

ssh-copy-id -i .ssh/id_rsa.pub "-p52113 root@172.16.83.200"
ssh-copy-id -i .ssh/id_rsa.pub "-p52113 root@172.16.83.202"
ssh-copy-id -i .ssh/id_rsa.pub "-p52113 root@172.16.83.203"

    

9. 开启备选从库的read_only模式(urcar2),当然master(urcar0)还是读写模式。至于备选从库为什么要开启只读模式?我也不知道。如果备选从库不开启只读模式MHA是启动不起来的。masterha_check_repl检测都过不去,master主库还必须是读写模式。

mysql> show variables like '%read_only%';    #查看当前状态,当前状态是关闭只读模式
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_read_only | OFF   |
| read_only        | OFF   |
| tx_read_only     | OFF   |
+------------------+-------+
3 rows in set (0.00 sec)
mysql> set global read_only=1;    #在备选主库urcar2上打开read_only只读模式
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%read_only%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_read_only | OFF   |
| read_only        | ON    |
| tx_read_only     | OFF   |
+------------------+-------+
3 rows in set (0.00 sec)
#read_only参考网址:http://blog.csdn.net/yumushui/article/details/41645469

    

10. 在urcar3上检查manager端是否配置成功

masterha_check_ssh --conf=/etc/mha/app1.cnf     #<== 无报错才可以继续向下执行

   

11. 检查mysql replication是否配置成功

首先所有数据节点都要执行:(如果mysql等命令加入环境变量这步也需要做,因为我遇到它不加载生效的情况)

ln -s /app/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /app/mysql/bin/mysql /usr/bin/mysql

     

开始检查

[root@urcar3 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
MySQL Replication Health is OK.
#报错日志:tail -F /var/log/mha/app1/manager.log

注意:我在启动时遇见两种情况监测启动不起来

         1. 没有配置好,备选从库urcar2被没有开启read_only只读模式。

         2. 主从复制延时过大,Seconds_Behind_Master 不能太大,具体最小要多少才能启动成功我不确定,我是等到它延迟为0时才检测成功的。

       

5. MHA启动

   

11. MHA- manage管理端启动监控(urcar3)

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

    

查看mha的当前状态

[root@urcar3 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:189157) is running(0:PING_OK), master:172.16.83.200

    

查看MHA进程

ps -ef|grep master|grep -v grep

       

关闭MHA manage监控命令如下:

masterha_stop --conf=/etc/mha/app1.cnf 

    

6. 测试

   

12. urcar0主库宕机掉,查看是否成功切换到urcar2urcar0操作)

[root@urcar0 ~]# /etc/init.d/mysqld stop
Shutting down MySQL........... SUCCESS! 

     

在管理端(urcar3)操作,查看urcar0主库宕机后当前主库是哪台主机?

[root@urcar3 ~]# mysql -uroot -p -e "show slave status\G;"|grep "Master_Host"
Enter password: 
                  Master_Host: 172.16.83.202   # 可以看出当前的主库为urcar2

   

登录urcar2查看自己是否提升为主库

[root@urcar2 mysql]# mysql -uroot -p -e "show master status\G"
Enter password: 
*************************** 1. row ***************************
             File: mysql-bin.000009
         Position: 120
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
#可在从库中查看它指向的主库是谁
[root@urcar3 ~]# mysql -uroot -p -e "show slave status\G"|grep 'Master_Host'
Enter password: 
                  Master_Host: 172.16.83.202   #当前urcar2为主库

    

在urcar2上实验一下,随便创建一个库,看urcar3是否同步成功

[root@urcar2 ~]# mysql -uroot -p -e "create database test2_master"
Enter password: 

    

现在在urcar3数据库查看是否同步urcar2数据库

[root@urcar3 ~]# mysql -uroot -p -e "show databases;"|grep "test2_master"
Enter password: 
test2_master

     

遇见问题总结

在这里遇见一个问题,报错如下:

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 172.16.83.202
......
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
......
                Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
.......
    ......

   

原因分析解决:报错说的很明显,就是MySQL UUID 一值了,通过百度知道这个UUID在文件auto.cnf文件里,这个文件在mysql启动时会生成,而因为我这3台数据库都是copy一个数据库的,所以这里需要将这个数据库的auto.cnf文件删除,然后重启下数据库即可恢复正常。

   

7. 重新启动原主库(urcar0),作为新的从库

    

urcar0重启后并不能直接加入集群。需要手动修改配置文件,并重新跟新的master urcar2主库同步,成为新的从库。

1. 需要把urcar0配置文件更改(urcar0操作)

[root@urcar0 ~]# vim /etc/my.cnf
[mysqld]
relay_log_purge = 0   #<== 将urcar0的relay-log中继文件自动删除中间文件关掉,让它不自动删除

注意:MHA在发生切换的过程中,从库的恢复过程中依赖于relay log的相关信息,所以这里要将relay log的自动清除设置为OFF,采用手动清除relay log的方式。在默认情况下,从服务器上的中继日志会在SQL线程执行完毕后被自动删除。但是在MHA环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用中继日志的自动删除功能。定期清除中继日志需要考虑到复制延时的问题。在ext3的文件系统下,删除大的文件需要一定的时间,会导致严重的复制延时。为了避免复制延时,需要暂时为中继日志创建硬链接,因为在linux系统中通过硬链接删除大文件速度会很快。(在mysql数据库中,删除大表时,通常也采用建立硬链接的方式)

   

特别说明配置文件更改完之后就可以进行重启urcar0的数据库了,因为原来urcar0和urcar2是互为主从的模式,重启urcar0的数据库后查看urcar0上面的主从同步复制开关,看urcar0是否正常同步urcar2上面的数据,如果正常则不用动,直接重新配置MHA即可。因为现在urcar0是从库,所以必须将urcar0上面的read_only打开,打开命令:set global read_only=1; 。然后再重新配置MHA配置文件。如果没有正常同步,则需要进行urcar0恢复数据操作,接着如下步骤继续执行。

    

2. urcar2数据库将数据全量备份导出到urcar0数据库urcar2操作)

#查看位置点
[root@urcar2 ~]# mysql -uroot -p
Enter password: 
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000007 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
#做数据备份导出
[root@urcar2 ~]# mkdir -p /home/backup
[root@urcar2 ~]# mysqldump -uroot -p --events -A -B -x --master-data=1 |gzip >/home/backup/mysql_urcar2_bak.`date +%F`.sql.gz            
Enter password: 
[root@urcar2 ~]# scp -rp -P5922 /home/backup/mysql_urcar2_bak.2018-03-13.sql.gz root@172.16.83.200:/home/backup/
mysql_urcar2_bak.2018-03-13.sql.gz              100%   26MB  26.1MB/s   00:00    

    

3. 还原数据到urcar0数据库(urcar0操作)

[root@urcar0 ~]# /etc/init.d/mysqld start    #<== 启动urcar0数据库
#将urcar2全量备份数据恢复到urcar0
[root@urcar0 ~]# cd /home/backup/
[root@urcar0 backup]# gzip -d mysql_urcar2_bak.2018-03-13.sql.gz 
[root@urcar0 backup]# mysql -uroot -p <mysql_urcar2_bak.2018-03-13.sql 
Enter password: 

 

4. urcar0上配置复制账号

[root@urcar0 ~]# mysql -uroot -p
Enter password: 
mysql> CHANGE MASTER TO
    -> MASTER_HOST='172.16.83.202',
    -> MASTER_PORT=3306,
    -> MASTER_USER='rep',
    -> MASTER_PASSWORD='******';
    -> MASTER_LOG_FILE='mysql-bin.000007',
    -> MASTER_LOG_POS=120;
#参数:
CHANGE MASTER TO
MASTER_HOST='172.16.83.202',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='******';
MASTER_LOG_FILE='mysql-bin.000007',
MASTER_LOG_POS=120;

  

现在urcar0是从库了,所以在要开启从库开关(urcar0操作)

mysql> start slave;
mysql> show slave status\G

    

这次可能会出现1007错误,不必担心,直接修改配置文件跳过错误(urcar0操作)

[root@urcar0 ~]# vim /etc/my.cnf
[mysqld]
slave-skip-errors = 1032,1062,1007,1008,1032,1049,1062,1146,
[root@urcar0 ~]# /etc/init.d/mysqld restart

MySQL常见错误码:https://www.linuxgogo.com/1135.html

     

5. 最后在测试以下主从同步是否成功

  

5.1 在当前主库 urcar2上将开始创建的测试数据库 test2_master 删除(删库需谨慎,最好再重新创建一个测试库)

[root@urcar2 ~]# mysql -uroot -p
Enter password: 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| devops             |
| mysql              |
| performance_schema |
| test2_master       |
| testdatabase       |
| zabbix             |
+--------------------+
7 rows in set (0.00 sec)
mysql> drop database test2_master;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| devops             |
| mysql              |
| performance_schema |
| testdatabase       |
| zabbix             |
+--------------------+
6 rows in set (0.00 sec)

    

5.2 查看从库urcar0上是否同步成功(删库很危险,谨慎谨慎再谨慎)

#没删除前查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| devops             |
| mysql              |
| performance_schema |
| test2_master       |
| testdatabase       |
| zabbix             |
+--------------------+
7 rows in set (0.00 sec)
#删除后查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| devops             |
| mysql              |
| performance_schema |
| testdatabase       |
| zabbix             |
+--------------------+
6 rows in set (0.00 sec)

     

8. 重新配置MHA监控

   

以下步骤在urcar3的mha管理端操作

1. 监控已经停止,现在重新修改管理端配置文件,然后使urcar0作为urcar2的备选从库

[root@urcar3 ~]# vim /etc/mha/app1.cnf 
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1.log
master_binlog_dir=/app/mysql/
password=******
ping_interval=2
repl_password=******
repl_user=rep
ssh_port=22
ssh_user=root
user=mha

[server1]
ssh_port=[如果urcar0就是这个备选从库的ssh端口不是22,就需要这个配置指定,配置不带这个中括号]
candidate_master=1
check_repl_delay=0
hostname=172.16.83.200
port=3306

[server2]
hostname=172.16.83.202
port=3306

[server3]
hostname=172.16.83.203
port=3306

     

2. 在当前的备选从库urcar0上开启read_only只读模式

[root@urcar0 ~]# mysql -uroot -p  
Enter password: 
mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%read_only%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_read_only | OFF   |
| read_only        | ON    |
| tx_read_only     | OFF   |
+------------------+-------+
3 rows in set (0.00 sec)

     

3. 检查SSH是否正常

[root@urcar3 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf 
Tue Mar 13 16:43:37 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Mar 13 16:43:37 2018 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Tue Mar 13 16:43:37 2018 - [info] Reading server configuration from /etc/mha/app1.cnf..
Tue Mar 13 16:43:37 2018 - [info] Starting SSH connection tests..
Tue Mar 13 16:43:37 2018 - [debug] 
Tue Mar 13 16:43:37 2018 - [debug]  Connecting via SSH from root@172.16.83.200(172.16.83.200:5922) to root@172.16.83.202(172.16.83.202:22)..
Tue Mar 13 16:43:37 2018 - [debug]   ok.
Tue Mar 13 16:43:37 2018 - [debug]  Connecting via SSH from root@172.16.83.200(172.16.83.200:5922) to root@172.16.83.203(172.16.83.203:22)..
Tue Mar 13 16:43:37 2018 - [debug]   ok.
Tue Mar 13 16:43:38 2018 - [debug] 
Tue Mar 13 16:43:37 2018 - [debug]  Connecting via SSH from root@172.16.83.202(172.16.83.202:22) to root@172.16.83.200(172.16.83.200:5922)..
Tue Mar 13 16:43:38 2018 - [debug]   ok.
Tue Mar 13 16:43:38 2018 - [debug]  Connecting via SSH from root@172.16.83.202(172.16.83.202:22) to root@172.16.83.203(172.16.83.203:22)..
Tue Mar 13 16:43:38 2018 - [debug]   ok.
Tue Mar 13 16:43:38 2018 - [debug] 
Tue Mar 13 16:43:38 2018 - [debug]  Connecting via SSH from root@172.16.83.203(172.16.83.203:22) to root@172.16.83.200(172.16.83.200:5922)..
Tue Mar 13 16:43:38 2018 - [debug]   ok.
Tue Mar 13 16:43:38 2018 - [debug]  Connecting via SSH from root@172.16.83.203(172.16.83.203:22) to root@172.16.83.202(172.16.83.202:22)..
Tue Mar 13 16:43:38 2018 - [debug]   ok.
Tue Mar 13 16:43:38 2018 - [info] All SSH connection tests passed successfully.

     

4. 检查mysql
replication
是否配置成功

[root@urcar3 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf 
......
    ......
MySQL Replication Health is OK.

    

如果出现如下错误

MySQL Replication Health is NOT OK!

 

解决方法

is NOT OK! 问题总结参考博文:https://www.cnblogs.com/polestar/p/5371080.html

     

4. 开启MHA监控urcar3操作)

#启动
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
#查看进程
ps -ef|grep -v grep|grep master

   

5. 查看MHA状态

[root@urcar3 ~]#  masterha_check_status --conf=/etc/mha/app1.cnf 
app1 (pid:12155) is running(0:PING_OK), master:172.16.83.202

特别重要说明:到这里配置好后他们的关系为:urcar2为主库,urcar0为urcar2的从库也是urcar2的备选主库,urcar3为urcar2的从库,urcar2不再是urcar0的主库,所以需要进行重新配置,让urcar2和urcar0互为主从。这里我就不写了,自行配置。我配置方法(仅供参考)也不知道得当不得当,数据会不会丢失(因为我这是测试环境我就这么做了),我是在urcar0和urcar2的 Seconds_Behind_Master 参数延迟为0时查看的urcar0上面的bing-log位置点然后在urcar2上面进行直接同步的,当然要在用户访问少的时候操作。操作如下:

#查看urcar0上面的bin-log位置点
[root@urcar0 ~]# mysql -uroot -p  
Enter password: 
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000011 |  2514936 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
#将urcar2作为urcar0的从库
[root@urcar2 ~]# mysql -uroot -p
Enter password: 
mysql> CHANGE MASTER TO
    -> MASTER_HOST='172.16.83.200',
    -> MASTER_PORT=3306,
    -> MASTER_USER='rep',
    -> MASTER_PASSWORD='******';
    -> MASTER_LOG_FILE='mysql-bin.000011',
    -> MASTER_LOG_POS=2514936;
Query OK, 0 rows affected, 2 warnings (0.42 sec)
mysql> start slave;
Query OK, 0 rows affected (0.06 sec)

     

9. 测试当前主库urcar2宕机

   

1. 停止urcar2数据库

[root@urcar2 ~]# /etc/init.d/mysqld stop
Shutting down MySQL..... SUCCESS! 

    

2. 登录urcar3数据库查看主从复制状态(urcar3

[root@urcar3 ~]# mysql -uroot -p -e "show slave status\G"|grep "Master_Host"
Enter password: 
                  Master_Host: 172.16.83.200

   

3. urcar0上查看是否将urcar0提升为主库(urcar0

[root@urcar0 ~]# mysql -uroot -p -e "show master status\G"
Enter password: 
*************************** 1. row ***************************
             File: mysql-bin.000003
         Position: 1387644
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 

   

4. 测试,在urcar0上创建test_urcar0m数据库,查看urcar3是否同步

(1)urcar0服务器创建test200_master数据库

[root@urcar0 ~]# mysql -uroot -p -e "create database test200_master;"
Enter password: 

   

(2)urcar3数据库查看是否同步

[root@urcar3 ~]# mysql -uroot -p -e "show databases;"|grep "test200_master"
Enter password: 
test200_master

    

吐槽:当urcar2宕机后会自动切换到urcar0,但是这里要搞清楚的是,urcar2(宕机后)服务器再从启后就要重新配置一遍主从复制!!!将urcar2配成从库!以及mha监控,好累啊-----

  

5. 启动urcar2数据库并再重新配置主从,将urcar2配置成从库

5.1 查看urcar0上面的bin-log位置点

[root@urcar0 ~]# mysql -uroot -p  
Enter password: 
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000011 |  2624936 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

     

5.2 在urcar2将urcar2配置成urcar0的从库。

[root@urcar2 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 
[root@urcar2 ~]# mysql -uroot -p
Enter password: 
mysql> CHANGE MASTER TO
    -> MASTER_HOST='172.16.83.200',
    -> MASTER_PORT=3306,
    -> MASTER_USER='rep',
    -> MASTER_PASSWORD='******';
    -> MASTER_LOG_FILE='mysql-bin.000011',
    -> MASTER_LOG_POS=2624936;
Query OK, 0 rows affected, 2 warnings (0.42 sec)
#开启slave开关
mysql> start slave;
Query OK, 0 rows affected (0.05 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Queueing master event to the relay log
                  Master_Host: 172.16.83.200
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
................
      .........以下输出内容省略!

提示:如果出现1032,1062,1007错误,可在配置文件/etc/my.cnf中的 [mysqld] 模块中配置参数“slave-skip-errors
= 1032,1062,1007”并重启生效。

   

10 重新配置MHA监控

  

1. 一定要检查配置文件的内容是否与配置文件一致(urcar3操作)

[root@urcar3 ~]# vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1.log
master_binlog_dir=/app/mysql/
user=mha
password=******
ping_interval=2
repl_user=rep
repl_password=******
ssh_port=22
ssh_user=root
[server1]
hostname=172.16.83.200
ssh_port=****
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=172.16.83.202
port=3306
[server3]
hostname=172.16.83.203
port=3306 

    

2. 在当前的备选从库urcar2上开启read_only只读模式

[root@urcar2 ~]# mysql -uroot -p  
Enter password: 
mysql> set global read_only=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%read_only%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_read_only | OFF   |
| read_only        | ON    |
| tx_read_only     | OFF   |
+------------------+-------+
3 rows in set (0.00 sec)

   

3. 检查SSH是否正常(urcar3操作)

[root@urcar3 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
Tue Mar 13 17:31:19 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Tue Mar 13 17:31:19 2018 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Tue Mar 13 17:31:19 2018 - [info] Reading server configuration from /etc/mha/app1.cnf..
Tue Mar 13 17:31:19 2018 - [info] Starting SSH connection tests..
Tue Mar 13 17:31:19 2018 - [debug] 
Tue Mar 13 17:31:19 2018 - [debug]  Connecting via SSH from root@172.16.83.200(172.16.83.200:5922) to root@172.16.83.202(172.16.83.202:22)..
Tue Mar 13 17:31:19 2018 - [debug]   ok.
Tue Mar 13 17:31:19 2018 - [debug]  Connecting via SSH from root@172.16.83.200(172.16.83.200:5922) to root@172.16.83.203(172.16.83.203:22)..
Tue Mar 13 17:31:19 2018 - [debug]   ok.
Tue Mar 13 17:31:20 2018 - [debug] 
Tue Mar 13 17:31:19 2018 - [debug]  Connecting via SSH from root@172.16.83.202(172.16.83.202:22) to root@172.16.83.200(172.16.83.200:5922)..
Tue Mar 13 17:31:19 2018 - [debug]   ok.
Tue Mar 13 17:31:19 2018 - [debug]  Connecting via SSH from root@172.16.83.202(172.16.83.202:22) to root@172.16.83.203(172.16.83.203:22)..
Tue Mar 13 17:31:20 2018 - [debug]   ok.
Tue Mar 13 17:31:20 2018 - [debug] 
Tue Mar 13 17:31:20 2018 - [debug]  Connecting via SSH from root@172.16.83.203(172.16.83.203:22) to root@172.16.83.200(172.16.83.200:5922)..
Tue Mar 13 17:31:20 2018 - [debug]   ok.
Tue Mar 13 17:31:20 2018 - [debug]  Connecting via SSH from root@172.16.83.203(172.16.83.203:22) to root@172.16.83.202(172.16.83.202:22)..
Tue Mar 13 17:31:20 2018 - [debug]   ok.
Tue Mar 13 17:31:20 2018 - [info] All SSH connection tests passed successfully.

     

4. 检查mysql replication是否配置成功(urcar3操作)

[root@urcar3 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf 
......
   ......
MySQL Replication Health is OK!

  

5. 开启MHA监控

 nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 & 

  

6. 查看MHA状态

[root@urcar3 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:13861) is running(0:PING_OK), master:172.16.83.200

    

11. 注意事项

     
    对于MHA高可用切换,主库切换到从库后,以前的主库就不要在升级为主,直接作为从库即可
    最后,对于前端web服务器来说,需要修改web程序配置文件指向新的主数据库,如果配置文件里使用的是数据库域名,可以直接修改web服务器的hosts解析

 

MHA相关博文推荐:

MHA高可用切换工具:http://www.lichengbing.cn/archivers/165.html

MySQL高可用架构之MHA(很不错的资料):http://www.cnblogs.com/gomysql/p/3675429.html

MySQL Master High Available 源码篇:http://blog.csdn.net/lijingkuan/article/details/73825186

     


zhaoyulin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: