十四、MySQL MHA 高可用配置(一)

MHA 高可用

1.准备三台机器
IP:10.0.0.51 主机名:db01 内存:2G
IP:10.0.0.52 主机名:db02 内存:2G
IP:10.0.0.53 主机名:db03 内存:2G
2.优化

 

一、MHA概述

1.简介

MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内;在复制框架中,MHA能够很好地解决复制过程中的数据一致性问题,由于不需要在现有的replication中添加额外的服务器,仅需要一个manager节点,而一个Manager能管理多套复制,所以能大大地节约服务器的数量;另外,安装简单,无性能损耗,以及不需要修改现有的复制部署也是它的优势之处。
​
MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成。
​
MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以独立部署在一台独立的机器上管理多个Master-Slave集群,也可以部署在一台Slave上。当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,然后将所有其他的Slave重新指向新的Master。整个故障转移过程对应用程序是完全透明的。

2.MHA原理

当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,然后将所有其他的Slave重新指向新的Master。
​
整个故障转移过程对应用程序是完全透明的。

3.原理图解

#原理步骤
1.主库出现故障,立刻保存binlog(主库上的node节点)
2.对比多个从的relay-log找出数据最新的从库(从库上的node节点)
3.将数据最新的从库数据同步到其他从库
4.将数据最新的从库提升为主库(我们可以指定某一台机器优先提升为主库)
5.通过出现故障主库的binlog补全新的主库数据
6.其他从库重新做主从,以新的主库为主
#问题:
1.如果主库断电,如何保存binlog,或者将binlog给新的主库同步?
2.relay-log不是一直保存,执行完会删除,删除了怎么和最新的从库对比数据?
3.从库开启binlog,也不记录,那么提升为主库之后,从库如何同步?

4.MHA架构

#MHA架构特点:
1.MHA属于C/S结构(manager,node)
2.manager尽量避免和master主库放在一起
3.一个manager节点可以管理多套主从集群
4.所有的机器都要安装node节点
5.manager是通过ssh协议去管理node节点的,所以所有机器之间都要做ssh免密
6.MHA可以在mysql主从运行中添加,不影响mysql的使用
7.主库的binlog是node节点进行保存的
8.从库提升为主库也是由node节点完成的

 

二、MHA工具

1.manager相关工具

#解压源码包
[root@db01 ~]# tar xf mha4mysql-manager-0.56.tar.gz
#查看工具
[root@db01 ~]# ll mha4mysql-manager-0.56/bin/
​
#检查主从复制状态
masterha_check_repl
#检查ssh免密连接
masterha_check_ssh
#检查MHA启动状态
masterha_check_status
#配置主机信息的工具
masterha_conf_host
  [server2]
   hostname=10.0.0.52
   port=3306
  [server3]
   hostname=10.0.0.53
   port=3306
#manager的启动程序
masterha_manager
#监控MHA主节点状态
masterha_master_monitor
#切换主库
masterha_master_switch
#建立TCP连接工具
masterha_secondary_check
#停止MHA工具
masterha_stop
​
#我们手动需要使用的工具:
masterha_check_repl
masterha_check_ssh
masterha_manager
masterha_stop

2.node节点相关工具

#解压包
[root@db01 ~]# tar xf mha4mysql-node-0.56.tar.gz
​
#查看工具
[root@db01 ~]# ll mha4mysql-node-0.56/bin/
​
#对比从库的relay-log,选出数据最新的从库
apply_diff_relay_logs
#防止数据回滚
filter_mysqlbinlog
#删除relay-log,我们要关闭自动删除relay-log
purge_relay_logs
#保存binlog日志
save_binary_logs

 

三、MHA优点

1)Masterfailover and slave promotion can be done very quickly
自动故障转移快
​
2)Mastercrash does not result in data inconsistency
主库崩溃不存在数据一致性问题
​
3)Noneed to modify current MySQL settings (MHA works with regular MySQL)
不需要对当前mysql环境做重大修改
​
4)Noneed to increase lots of servers
不需要添加额外的服务器(仅一台manager就可管理上百个replication)
​
5)Noperformance penalty
性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒向master发送ping包(默认3秒),所以对性能无影响。你可以理解为MHA的性能和简单的主从复制框架性能一样。
#ping www.baidu.com(icmp协议)
#sql ping 检测主库是否存活
​
6)Works with any storage engine
只要replication支持的存储引擎,MHA都支持,不会局限于innodb

 

四、部署MHA

1.环境准备

主机IP身份
db01 10.0.0.51 master
db02 10.0.0.52 slave
db03 10.0.0.53 slave,manager

2.做主从

1)配置三台机器

[root@db01 ~]# cat /etc/my.cnf
[mysqld]
server_id=1
log_bin=mysql-bin
​
[root@db02 ~]# cat /etc/my.cnf
[mysqld]
server_id=2
log_bin=mysql-bin
​
[root@db03 ~]# cat /etc/my.cnf
[mysqld]
server_id=3
log_bin=mysql-bin

2)授权主从用户

mysql> grant replication slave on *.* to rep@'172.16.1.%' identified by '123';
Query OK, 0 rows affected (0.00 sec)

3)查看binlog信息

mysql> show master status;
+------------------+----------+
| File             | Position |
+------------------+----------+
| mysql-bin.000004 |      120 |
+------------------+----------+

4)从库执行同步

#执行同步语句
change master to
master_host='172.16.1.51',
master_user='rep',
master_password='123',
master_log_file='mysql-bin.000004',
master_log_pos=120;
​
#启动线程
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

 

3.部署MHA之前的操作

1.检查主从状态
2.所有数据库配置关闭自动删除relay-log的功能
#主库:
mysql> set GLOBAL relay_log_purge=0;
Query OK, 0 rows affected (0.00 sec)
[root@db01 ~]# vim /etc/my.cnf
  [mysqld]
   relay_log_purge=0
   #从库
  [root@db02 ~]# vim /etc/my.cnf
  [mysqld]
   relay_log_purge=0
  [root@db03 ~]# vim /etc/my.cnf
  [mysqld]
   relay_log_purge=0
3.配置从库只读
set global read_only=1;
4.检查三台机器server_id必须全都不相同
5.从库也要创建主从用户
grant replication slave on *.* to rep@'172.16.1.%' identified by '123';
6.开启从库保存binlog
[root@db01 ~]# vim /etc/my.cnf
  [mysqld]
  log_slave_updates
  [root@db02 ~]# vim /etc/my.cnf
  [mysqld]
  log_slave_updates
  [root@db03 ~]# vim /etc/my.cnf
  [mysqld]
  log_slave_updates
   #重启从库
  [root@db02 ~]# systemctl restart mysqld
  [root@db03 ~]# systemctl restart mysqld
#三台机器配置文件
​
#主库
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
innodb_data_file_path=ibdata1:76M;ibdata2:12M:autoextend
log_bin=mysql-bin
relay_log_purge=0
log_slave_updates
​
#从库1
[root@db02 ~]# vim /etc/my.cnf
[mysqld]
server_id=2
log_bin=mysql-bin
relay_log_purge=0
log_slave_updates
​
#从库2
[root@db03 ~]# vim /etc/my.cnf
[mysqld]
server_id=3
log_bin=mysql-bin
relay_log_purge=0
log_slave_updates

 

4.部署MHA

1)安装依赖(所有机器)

[root@db01 ~]# yum install perl-DBD-MySQL -y
[root@db02 ~]# yum install perl-DBD-MySQL -y
[root@db03 ~]# yum install perl-DBD-MySQL -y

2)安装manager节点依赖(db03)

[root@db03 ~]# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-DBD-MySQL

3)安装node节点(所有机器)

#上传代码包
[root@db01 ~]# rz mha4mysql-manager-0.56-0.el6.noarch.rpm
[root@db02 ~]# rz mha4mysql-manager-0.56-0.el6.noarch.rpm
[root@db03 ~]# rz mha4mysql-manager-0.56-0.el6.noarch.rpm
​
#安装
[root@db01 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db02 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db03 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm

4)部署manager节点(db03)

#上传代码包
[root@db03 ~]# rz mha4mysql-manager-0.56-0.el6.noarch.rpm
​
#安装
[root@db03 ~]# yum localinstall -y mha4mysql-manager-0.56-0.el6.noarch.rpm

5)添加一个MHA管理数据库的用户(所有机器)

#主库执行即可
mysql> grant all on *.* to mha@'172.16.1.%' identified by 'mha';
Query OK, 0 rows affected (0.01 sec)

6)配置软连接

#如果不能直接执行数据库命令的时候,如果不创建命令软连接,检测mha复制情况的时候会报错
[root@db03 ~]# ln -s /application/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
[root@db03 ~]# ln -s /application/mysql/bin/mysql /usr/bin/mysql

7)编写MHA配置文件(db03)(完整配置)

#创建存放配置文件的目录
[root@db03 ~]# mkdir /service/mha -p
​
#编辑配置文件
[root@db03 ~]# vim /service/mha/app1.cnf
#注释
[root@db01 ~]# cat /service/mha/app1.cnf
#默认配置
[server default]
#自定义日志文件
manager_log=/service/mha/manager
#自定义工作目路
manager_workdir=/service/mha/app1
#主库的binlog目录
master_binlog_dir=/usr/local/mysql/data
#ip漂移脚本路径
master_ip_failover_script=/service/mha/master_ip_failover
#MHA管理数据库的用户
user=mha
#MHA管理数据库的用户密码
password=mha
#检测主库存活的间隔时间
ping_interval=2
#主从复制的用户
repl_user=rep
#主从复制的密码
repl_password=123
#指定ssh免密的用户
ssh_user=root
​
#指定主机
[server1]
hostname=172.16.1.51
port=3306
​
[server2]
#candidate_master=1
#check_repl_delay=0
hostname=172.16.1.52
port=3306
​
[server3]
hostname=172.16.1.53
port=3306
​
#开启主库binlog实时备份
[binlog1]
no_master=1  #开启备份
hostname=172.16.1.53  #备份存放的主机
master_binlog_dir=/service/mha/binlog    #备份存放的路径
​
candidate_master=1
#默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
check_repl_delay=0

8)创建工作目录

[root@db03 ~]# mkdir /service/mha/app1

9)配置服务器免密

#创建秘钥对
[root@db01 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@db02 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
[root@db03 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
​
#发送公钥,包括自己
[root@db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.51
[root@db02 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.52
[root@db03 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.53

10)启动前检测

1.检查ssh免密
[root@db03 ~]# masterha_check_ssh --conf=/service/mha/app1.cnf
​
2.检查主从状态
[root@db03 ~]# masterha_check_repl --conf=/service/mha/app1.cnf
#如果报错,可能是没有配置反向解析

11)启动MHA

[root@db03 ~]# nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/app1/manager.log 2>&1 &
​
nohup #后台启动
masterha_manager #MHA启动程序
--conf=/service/mha/app1.cnf  #指定配置文件
--remove_dead_master_conf  #移除死掉的主节点配置
--ignore_last_failover  #忽略最后一次切换
< /dev/null > /service/mha/app1/manager.log 2>&1 & #把日志写入到指定文件
​
#安全机制
1.完成一次切换后,会生成一个锁文件
2.再次进行切换时,会检查锁文件
3.如果锁文件存在,则不能进行切换,8小时后才能进行再次切换

12)查看日志测试切换

#监控日志
[root@db03 ~]# tail -f /service/mha/manager
​
#停掉主库
[root@db01 ~]# systemctl stop mysqld

 

 

 

 

 

 

posted @ 2020-11-24 19:13  行哥  阅读(427)  评论(0)    收藏  举报