MySQL高可用MHA 详解

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

该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。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服务器上,因此可以保证所有节点的数据一致性。

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器,出于机器成本的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。另外对于想快速搭建的可以参考:MHA快速搭建

我们自己使用其实也可以使用1主1从,但是master主机宕机后无法切换,以及无法补全binlog。master的mysqld进程crash后,还是可以切换成功,以及补全binlog的。

主题: 配置MHA集群
只对Mysql数据库服务有用,做高可用集群
软件部署的要求来决定的,不能少于3台 至少有2个机器做备用的主master服务器
51 为master 52和53 做备用的master
54和55做slave
56做MHA管理服务器
50充当客户端
&&配置主库
&&配置从库
&&配置备用主库 52和53
&&配置纯从库 54和55
&&配置管理服务器56
二 配置51
1 将主从文件删除,成为一台单独的数据库服务器

[root@mysql51 ~]# cd /var/lib/mysql
[root@mysql51 mysql]# rm -rf master51.*
[root@mysql51 mysql]# rm -rf master51-relay-bin.*
[root@mysql51 mysql]# rm -rf relay-log.info

51上关闭 自动删除中继日志文件。

mysql> set global relay_log_purge=off;    //如果是写在配置文件里的话:relay_log_purge=0

2 修改配置文件,重启mysqld服务

[root@mysql51 ~]# vim /etc/my.cnf
[mysqld]
#binlog_do_db=db1
#log_slave_updates
log_bin=master51
server_id=51
binlog_format=mixed
validate_password_policy=0
validate_password_length=6
character_set_server=utf8
#max_binlog_size=200m
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled=1
rpl-semi-sync-slave-enabled=1
relay_log_purge=0

3 授权同步用户

mysql> show grants for relpuser@"%";
+--------------------------------------------------+
| Grants for relpuser@%                            |
+--------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'relpuser'@'%' |
+--------------------------------------------------+

4 查看主服务器状态

mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000001 |     1308 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+

三 配置52为51的从。配置主库
1 删除各种主库记录文件和binlog日志文件

[root@mysql52 ~]# cd /var/lib/mysql
[root@mysql52 mysql]# rm -rf master52.*
[root@mysql52 mysql]# rm -rf master52-relay-bin.*
[root@mysql52 mysql]# rm -rf relay-log.info

2 修改配置文件,重启mysqld服务

[root@mysql52 ~]# vim /etc/my.cnf
[mysqld]
#binlog_do_db=db1
#log_slave_updates
log_bin=master52
server_id=52
binlog_format=mixed
validate_password_policy=0
validate_password_length=6
character_set_server=utf8
#max_binlog_size=200m
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled=1
rpl-semi-sync-slave-enabled=1
relay_log_purge=0

3 授权同步用户

mysql> show grants for relpuser@"%";
+--------------------------------------------------+
| Grants for relpuser@%                            |
+--------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'relpuser'@'%' |
+--------------------------------------------------+

4 52作为从库 指定主库51信息

mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123456",master_log_file="master51.000001",master_log_pos=154;

5 开启从库

mysql> start slave;

6 查看从库状态

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.4.51
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master51.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql52-relay-bin.000002
                Relay_Log_Pos: 319
        Relay_Master_Log_File: master51.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

7 查看主库状态

mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master52.000001 |      154 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+

四 配置53为51的从。配置主库
1 将主从文件删除,成为一台单独的数据库服务器

2 修改配置文件,重启mysqld服务

[mysqld]
#log_slave_updates
log_bin=master53
#replicate-do-db=db1
server_id=53
binlog_format="mixed"
validate_password_policy=0
validate_password_length=6
character_set_server=utf8
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled=1
rpl-semi-sync-slave-enabled=1

3 授权同步用户

mysql> show grants for relpuser@"%";
+--------------------------------------------------+
| Grants for relpuser@%                            |
+--------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'relpuser'@'%' |
+--------------------------------------------------+

4 53作为从库 指定主库51信息

mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123456",master_log_file="master51.000001",master_log_pos=154;

5 开启从库

mysql> start slave;

6 查看从库状态

mysql> show slave status\G;

7 查看主库状态

mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master52.000001 |      154 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+

五:配置54,55,56 为51的从库
1 将主从文件删除,成为一台单独的数据库服务器

2 修改配置文件,重启mysqld服务

[mysqld]
#log_bin=master54
server_id=54
#binlog_format=mixed
validate_password_policy=0
validate_password_length=6
character_set_server=utf8
plugin-load="rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-slave-enabled=1
relay_log_purge=0
#skip-grant-table

3 54作为从库 指定主库51信息

mysql> change master to master_host="192.168.4.51",master_user="repluser",master_password="123456",master_log_file="master51.000001",master_log_pos=154;

4 开启从库

mysql> start slave;

5 查看从库状态

mysql> show slave status\G;

6 相同操作重复一遍

六:完成51 52 53 54 55 相互密码连接
完成56 对51 52 53 54 55 无密码连接

七:
在所有主机上51 52 53 54 55 56安装
1 安装yum仓库中所有的perl_开头的软件包
yum -y install perl-*

2 安装51 52 53 54 55 56 yum仓库中没有的perl软件包

yum -y install perl-*     //安装8个软件包
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Mail-Sendmail-0.79-21.el7.art.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm

3 在51 52 53 54 55 56上安装

 yum  -y  install  perl-DBD-mysql  perl-DBI
 rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

4 在56上安装管理包

tar -zxf mha4mysql-manager-0.56.tar.gz
cd mha4mysql-manager-0.56
perl Makefile.pl
make
make install

MHA简介:(Master High Availability)
–由日本DeNA 公司youshimaton开发
–是一套优秀的实现MySQL高可用的解决方案
–数据库的自动故障切换能做到0~30秒之间
– MHA能确保在故障切换过程中保证数据的一致性,以达到真正意义上的高可用

MHA 组成
MHA Manager(管理节点)
–可以单独部署在一台独立的机器上,管理其他节点
–也可以部署在一台slave节点上
MHA Node(数据节点)
–运行在每台MySQL服务器上

MHA工作过程
由manager定时探测进群中的master节点
当master故障时,manager自动将拥有最新数据的slave提升为新的master
关键点:
1)从宕机崩溃的master保存二进制日志事件
2)识别含有最新更新的slave
3)应用差异的中继日志(relay log)到其他的slave
4)应用从master保存的二进制日志事件
5)提升一个slave为新的master
6)使其他的slave连接新的master进行复制

八 修改56主机MHA配置文件

[server default]
manager_workdir=/etc/mha         //指定管理程序的工作目录
manager_log=/etc/mha/manager.log       //指定管理程序的工作目录
master_ip_failover_script=/etc/mha/master_ip_failove
//指定故障切换程序的路径和名称 ××当主库51宕机后,56主机调用此脚本,对VIP浮动地址进行切换:

ssh_user=root
ssh_port=22           //远程的用户名的端口号

repl_user=repluser
repl_password=123456     //指定从库的用户名和密码

user=root
password=123456             //连接三个主库的用户名和密码

[server1]
hostname=192.168.4.51
port=3306
candidate_master=1

[server2]
hostname=192.168.4.52
port=3306
candidate_master=1

[server3]
hostname=192.168.4.53
port=3306
candidate_master=1

[server4]
hostname=192.168.4.54
port=3306
no_master=1

[server5]
hostname=192.168.4.55
port=3306
no_master=1

为此配置文件添加执行权限

九 在竞选主数据库服务器上添加授权用户

grant all on *.* to root@"%" identified by "123456";

十 56主机安装mariadb用于使用mysql命令
测试利用root用户和密码123456 登录51 52 53 主机的mysql服务

十一 手动将VIP绑定在当前主库192.168.4.51的eth0的接口上(一定要时临时绑定,不然没法切换)

[root@mysql51 opt]# ifconfig eth0:1 192.168.4.100
[root@mysql51 opt]# ifconfig eth0:1 
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.4.100  netmask 255.255.255.0  broadcast 192.168.4.255
        ether 52:54:00:29:2c:1d  txqueuelen 1000  (Ethernet)

十二 测试MHA集群
1)检查配置环境,在主机52,53检查是否有同步数据的用户repluser
52 主机

mysql> show grants for repluser@"%";
+--------------------------------------------------+
| Grants for repluser@%                            |
+--------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%' |
+--------------------------------------------------+
1 row in set (0.00 sec)

53主机
1)查看授权登录

mysql> show grants for root@"%";
+-------------------------------------------+
| Grants for root@%                         |
+-------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' |
+-------------------------------------------+
1 row in set (0.01 sec)

2)验证ssh 免密登陆数据节点主机

[root@mysql56 ~]# masterha_check_ssh  --conf=/etc/mha/app1.cnf
2.168.4.55:22) to [email protected](192.168.4.54:22)..
Mon Nov 26 16:30:58 2018 - [debug]   ok.
Mon Nov 26 16:30:59 2018 - [info] All SSH connection tests passed successfully.

3)验证数据节点的主从同步配置(先把自动failover时候的切换脚本注释掉)

[root@mysql56 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
Mon Nov 26 16:43:56 2018 - [info] 
192.168.4.51(192.168.4.51:3306) (current master)
 +--192.168.4.52(192.168.4.52:3306)
 +--192.168.4.53(192.168.4.53:3306)
 +--192.168.4.54(192.168.4.54:3306)
 +--192.168.4.55(192.168.4.55:3306)

Mon Nov 26 16:43:56 2018 - [info] Checking replication health on 192.168.4.52..
Mon Nov 26 16:43:56 2018 - [info]  ok.
Mon Nov 26 16:43:56 2018 - [info] Checking replication health on 192.168.4.53..
Mon Nov 26 16:43:56 2018 - [info]  ok.
Mon Nov 26 16:43:56 2018 - [info] Checking replication health on 192.168.4.54..
Mon Nov 26 16:43:56 2018 - [info]  ok.
Mon Nov 26 16:43:56 2018 - [info] Checking replication health on 192.168.4.55..
Mon Nov 26 16:43:56 2018 - [info]  ok.
Mon Nov 26 16:43:56 2018 - [info] Checking master_ip_failover_script status:
Mon Nov 26 16:43:56 2018 - [info]   /etc/mha/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.4.51 --orig_master_ip=192.168.4.51 --orig_master_port=3306 
Mon Nov 26 16:43:56 2018 - [info]  OK.
Mon Nov 26 16:43:56 2018 - [warning] shutdown_script is not defined.
Mon Nov 26 16:43:56 2018 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.
测试通过

十三 启动服务

[root@mysql56 ~]# masterha_manager --conf=/etc/mha/app1.cnf \

--remove_dead_master_conf   // 当主库宕机后,移除管理主配置文件上关于主库的配置
--ignore_last_faileover 健康记录文件 :xxxx。health   忽略(在8个小时内连续出现故障,不进行切换)----> 强制要求切换

50客户端验证

[root@mysql50 ~]# mysql -h192.168.4.100 -uyaya200 -p123456
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| mysql51    |
+------------+

2 当51宕掉后。主程序manager服务会自杀,自杀后,会激发切换脚本。脚本会将vip地址进行切换

自动将vip配给192168.4.52
此时,51的信息将会在app1.cnf文件中的信息将被删除
然后主配置文件目录会多chela几个文件

[root@mysql56 ~]# ls /etc/mha/ 
app1.cnf
app1.failover.complete
manager.log
master_ip_failover
saved_master_binlog_from_192.168.4.51_3306_20181126175251.binlog

如果在启动服务时,不加入这个选项:–ignore_last_faileover 那么在主配置文件中将会出现这个文件xxx.health

51宕机修好后,加入主库的步骤:
1 先启动mysql服务
2 将51设置为52的从库
3 52中多余的数据需要手动添加到51中
4 手动将51的信息加到这个主配置文件app1.cnf中
6 将主配置文件/etc/mha/目录下的多余文件全部删除,保留两个原始文件(app1.cnf,master_ip_failover)

猜你喜欢

转载自blog.csdn.net/weixin_42104231/article/details/84572984
今日推荐