MHA实现数据库高可用、故障转移

1. MHA

​ MHA数据高可用集群,是一套优秀的作为MySQL高可用性环境下故障切换主从的软件,在故障切换过程中,MHA 能够做到 在 30s自动完成数据的高可用的故障切换,并在切换的过程中最大程度的保证数据的一致性,以达到真正意义上的高可用。

2. MHA 特点

​ 1) 实现MySQL故障转移

​ 2)保证数据的一致性

3. MHA 的工作流程

1)把宕机的master二进制日志保存下来。

2)找到binlog位置点最新的slave。

3)在binlog位置点最新的slave上用relay log(差异日志)修复其它slave。

4)将宕机的master上保存下来的二进制日志恢复到含有最新位置点的slave上。

5)将含有最新位置点binlog所在的slave提升为master。

6)将其它slave重新指向新提升的master,并开启主从复制。

  • 当监控的集群中的主MySQL宕机后,会尝试获取主库中的二进制文件,获取到之后,找到已经同步最新数据的从库,将把该从库的中继日志同步给其他的从库,来同步数据,保证从库之间的一致性,之后再从库中找到一台,作为新的主库,同步获取到的二进制文件,其余的从库从这个新的主库中同步数据,保证主从服务的群集正常的工作

4. MHA 组成

  • 该软件由两部分组成:
    • MHA Manager (管理节点):
      • 管理节点可以单独部署在一台独立的机器上,管理多个 master-slave 集群,也可以部署在一台 slave 节点上
    • MHA Node (数据节点):
      • MHA Node 运行在每台MySQL服务器上 ,管理节点,会定时探测集群中master 接地那,当master出现故障时,他可以自动将最新数据的slave 提升为新的 master, 然后将所有其他的slave 重新指向 master

1) 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信息

2) Node 工具包

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

5. MHA 工作原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Luk9XcIY-1589274420748)(http://s1.wailian.download/2020/05/11/image.png)]

1) 从宕机崩溃的 master 保存二进制日志时间(binlog events)

2) 识别含有最新数据的slave;

3) 应用差异的中继日志(relay log) 到其他的slave

4) 提升一个 slave 为新的master;

4) 应用从 master 保存的二进制,移交给 最新的slave

6) 使其他的slave 连接新的master 进行复制

6. 部署一主两从MySQL

6.1 Master 配置
  • Master 创建授权用户
mysql> GRANT ALL ON *.* TO 'slave'@'%' IDENTIFIED BY '123.cim';
Query OK, 0 rows affected (0.00 sec)
  • Master 开启二进制日志文件
[root@localhost ~]# vim /etc/my.cnf

[mysqld]
server-id = 1
log-bin=master-bin
log-slave-updates=true
  • 重启服务
systemctl restart mysqld
6.2 Slave-1 配置
  • 开启中继日志与 二进制日志 Slave-1
[root@localhost ~]# vim /etc/my.cnf

[mysqld]
server-id=2
log-bin=master-bin
log-slave-updates=true
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
read_only=1
relay-log-purge=0
  • 重启服务
systemctl restart mysqld
6.3 Slave-2 配置
[root@localhost ~]# vim /etc/my.cnf

[mysqld]
server-id=3
log-bin=master-bin
log-slave-updates=true
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
read_only=1
relay-log-purge=0
  • 重启服务
systemctl restart mysqld
6.4 重新指定 Slave-1 的Master
  • 查看 Master 二进制日志文件
mysql> SHOW master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      120 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  • Slave-1 配置
mysql> CHANGE MASTER TO
    MASTER_USER='slave',
    MASTER_HOST='192.168.116.104',
    MASTER_PASSWORD='123.com',
    MASTER_LOG_FILE='master-bin.000001',
    MASTER_LOG_POS=120;
  • 启动 slave
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
  • 查看Slave 状态
mysql> show slave status\G;

             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

6.5 Slave-2 指定 Master
mysql> CHANGE MASTER TO
    MASTER_USER='slave',
    MASTER_HOST='192.168.116.104',
    MASTER_PASSWORD='123.com',
    MASTER_LOG_FILE='master-bin.000001',
    MASTER_LOG_POS=120;
  • 启动 slave
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
  • 查看Slave 状态
mysql> show slave status\G;

             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

6.6 主从测试
  • 在 Master 中创建测试库 aaa
# 原有数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

#  创建测试库 aaa
mysql> create database aaa;
Query OK, 1 row affected (0.00 sec)

  • Slave 查看
# Node查看测试库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| aaa                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

7. MHA 实现故障转移

实验环境:

  • mysql 部署环境为; 一主两从
HostIP环境
MHA192.168.116.104/8联网,网络yum源
MySQL-M192.168.116.103/8联网,网络yum源
MySQL-S1192.168.116.102/8联网,网络yum源
MySQL-S2192.168.116.101/8联网,网络yum源

​ 再生产环境中,可能会遇到多个 主从的mysql,那么我们可以使用 一个 MHA Manager 来管理多组主从复制的数据库。

​ 主需要将不同组中的配置信息单独写道 app*.cnf当中

1) 在 master MySQL中创建授权用户

  • 创建MHA 授权用户,使mha 可以控制数据库
  • 在 master MySQL中做一台就可以( 会将user 表中的数据复制下去)
mysql> GRANT ALL ON *.* TO 'mha'@'192.168.116.%' IDENTIFIED BY '123.com';
Query OK, 0 rows affected (0.00 sec)

2) 在所有节点中部署 免密登录

  • 四台服务可以互相登录任意主机

  • MHA

[root@localhost ~]# ssh-keygen 
[root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.101
[root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.102
[root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.103
  • MySQL-M
[root@localhost ~]# ssh-keygen  
[root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.101 [root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.102 [root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.104
  • MySQL-S1
[root@localhost ~]# ssh-keygen 
[root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.101
[root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.103
[root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.104

  • MySQL-S2
[root@localhost ~]# ssh-keygen 
[root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.102
[root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.103
[root@localhost ~]# ssh-copy-id -i  /root/.ssh/id_rsa.pub root@192.168.116.104

4) 为所有节点安装 MHA Node 所需要的 perl 模块

  • 解决 perl 依赖关系
    • epel 是社区强烈打造的免费开关的发型软件版本库
[root@localhost ~]# rpm -ivh epel-release-latest-7.noarch.rpm 
[root@localhost ~]# yum -y install perl-DBD-mysql perl-DBI
  • 安装node节点
[root@localhost ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

5) 在 MHA 节点安装 MHA Manager 管理节点

[root@localhost ~]#  yum -y install perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
[root@localhost ~]#  rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm 

6) 配置 MHA Manager

  • 配置全局配置文件
[root@localhost ~]# vim /etc/masterha_default.cnf 

[ server default]			
user=mha					# 数据库授权管理节点用户
password=123.com			# 登录密码
repl_user=slave				# 主从复制的用户
repl_password=123.com		# 登录密码
ssh_user=root				# 管理节点和节点的直接连接的协议
master_binlog_dir=/usr/local/mysql/data		# 主数据库存放二进制文件的目录
remote_workdir=/data/login	       			# 当获取二进制文件时,存放的目录
ping_interval=2								# 管理节点和节点通讯时间
shutdown_script=""							# 当主数据库宕机时,执行的脚本,可以为空

  • 配置Manager 节点配置文件
    • 创建配置文件目录
[root@localhost ~]# mkdir /etc/mha


[root@localhost ~]# vim /etc/mha/app1.cnf
[ server default]
manager_workdir=/var/lib/manager			    # Manager节点的工作目录
manager_log=/var/log/manager/manager.log		# Manager节点日志文件

[server1]						# 监控的节点 1
hostname=192.168.116.103		 # 监控节点1 的IP
port=3306					    # 监控的 端口号
ssh_port=22					    # ssh登录端口

[server2]
hostname=192.168.116.102
port=3306
ssh_port=22
candidate_master=1			    # 当主节点宕机后,该节点作为主

[server3]
hostname=192.168.116.101
port=3306
ssh_port=22

7) 测试 Manager

  • 测试 manager 与 数据库节点之间的ssh通信是否正常
    • 全部返回 ok
[root@localhost ~]# masterha_check_ssh --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf
  • 检测节点之间的主从复制是否正常
    • 没有问题则返回 ok
[root@localhost ~]# masterha_check_repl --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf MySQL Replication Health is OK.
  • 启动 MHA Manager 服务
    • 开启后会处以监控状态
[root@localhost ~]# masterha_manager --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf 
Wed Feb 12 19:15:39 2020 - [info] Reading default configuration from /etc/masterha_default.cnf..
Wed Feb 12 19:15:39 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Feb 12 19:15:39 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..
Cannot write to '/var/log/manager/manager.log': 没有那个文件或目录 at /usr/share/perl5/vendor_perl/Log/Dispatch/File.pm line 109.

以上报错,表示 没有’/var/log/manager/manager.log 这个文件或目录

因为 该目录是我们手动指定的,需要手动建立一个目录

[root@localhost ~]# mkdir /var/log/manager
  • 再次启动
[root@localhost ~]# masterha_manager --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf 
Wed Feb 12 19:18:20 2020 - [info] Reading default configuration from /etc/masterha_default.cnf..
Wed Feb 12 19:18:20 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Feb 12 19:18:20 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..
  • 模拟 MySQL 主宕机
    • 当我们把 192.168.116.103主机的 MySQL服务停掉之后,这里会显示 二进制日志已经存放至 /data/login下, 这个时候,我们在 192.168.116.102主机中,创建数据192.168.116.101中查看是否被复制
[root@localhost ~]# masterha_manager --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf 
Wed Feb 12 19:18:20 2020 - [info] Reading default configuration from /etc/masterha_default.cnf..
Wed Feb 12 19:18:20 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Feb 12 19:18:20 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..
  Creating /data/login if not exists..    ok.
  Checking output directory is accessible or not..
   ok.
  Binlog found at /usr/local/mysql/data, up to mysql-bin.000003
Wed Feb 12 19:21:53 2020 - [info] Reading default configuration from /etc/masterha_default.cnf..
Wed Feb 12 19:21:53 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Feb 12 19:21:53 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值