Mysql高可用集群–MHA

2022-06-29 16:12:26 浏览数 (1)

什么是 MHA

MHA(Master High Availability) 是自动的 master 故障转移和 slave 提升的软件包。它是基于标准的 MySQL 复制(异步/半同步). MHA 有两部分组成:MHA Manager(管理节点)和 MHA Node(数据节点)。 MHA Manager 可以单独部署在一台独立机器上管理多个 master-slave 集群,也可以部署在一台 slave 上。MHA Manager 探测集群的 node 节点,当发现 master 出现故障的时候,它可以自动将具有最新数据的 slave 提升为新的 master,然后将所有其它的 slave 指向新的 master。整个故障转移过程对应用程序是透明的。 MHA node 运行在每台 MySQL 服务器上(master/slave/manager),它通过监控具备解析和清理 logs 功能的脚本来加快故障转移的过程。 作为前提条件,应先配置 MySQL 复制,并设置 SSH 公钥免密码登录。下面以 CentOS 为例来说明,最好先安装 EPEL(http://fedoraproject.org/wiki/EPEL),不然 YUM 可能找不到某些软件包。MHA 由 Node 和 Manager 组成,Node 运行在每一台 MySQL 服务器上, 也就是说,不管是 MySQL 主服务器,还是 MySQL 从服务器,都要安装 Node,而 Manager 通常运行在独立的服务器上,但如果硬件资源吃紧,也可以用一台 MySQL 从服务器来 兼职 Manager 的角色。

MHA 工作原理和工具包

工作原理

从宕机崩溃的 master 保存二进制日志事件(binlog events) -识别含有最新更新的 slave 应用差异的中继日志(relay log)到其它 slave 应用从 master 保存的二进制日志事件(binlog events) -提升一个 slave 为新 master 使其它的 slave 连接新的 master 进行复制

Manager 工具

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

Node 工具(这些工具通常由 MHA Manager 的脚本触发,无需人手操作)

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

MHA优点

a、自动故障转移快,秒级就能完成故障切换 b、可以结合半同步复制,保证主从数据的一致 c、manager节点可以管理多个MHA集群系统 d、在运行过程中,manager节点只是周期性的发送ICMP包,对性能的影响极低 e、只要mysql 复制技术支持的引擎,MHA就支持 f.MHA加强了数据的安全性 g.MHA在进行故障转移时更不易产生数据丢失


部署Mysql一主两从(做好主从可忽略)

部署MYSQL一主一从

环境准备

IP

版本

服务

192.168.1.40

CentOS Linux release 7.6.1810 (Core)

MHA-manager

192.168.1.10(master)

CentOS Linux release 7.6.1810 (Core)

mysql(主)、MHA-node

192.168.1.20(slave1)

CentOS Linux release 7.6.1810 (Core)

mysql(从)、MHA-node

192.168.1.30(slave2)

CentOS Linux release 7.6.1810 (Core)

mysql(从)、MHA-node

此次实验centos是最小化安装 四台主机安装一些命令 并关闭防火墙

代码语言:javascript复制
systemctl stop firewalld && yum -y install net-tools vim wget git make cmake gcc gcc-c  

修改主机名并做免密登录

master操作

代码语言:javascript复制
[root@localhost ~]# vim /etc/hosts
#添加
192.168.1.10 master
192.168.1.20 slave1
192.168.1.30 slave2
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:lU9My4J5QGSrEV8wvMfN61Fxu9jIyCX6 WdxjYTykp8 root@localhost.localdomain
The key's randomart image is:
 ---[RSA 2048]---- 
|      . B.. .    |
|        .B = .. .|
|      . =o=o=. o.|
|       o.o = .o. |
|      . S.o *  .o|
|         .oo  . o|
|          . .o  o|
|           oE  o |
|            ..o  |
 ----[SHA256]----- 
[root@master ~]# ssh-copy-id -i slave1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'slave1 (192.168.1.20)' can't be established.
ECDSA key fingerprint is SHA256:dnnDcAA2qVnA31i7mtr9LYJmH2veu2 r4t 19qUSqqw.
ECDSA key fingerprint is MD5:0e:f3:c1:3c:dc:5f:12:66:ae:c9:01:51:66:db:bb:02.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@slave1's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'slave1'"
and check to make sure that only the key(s) you wanted were added.
[root@master ~]# ssh-copy-id -i slave2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host 'slave2 (192.168.1.30)' can't be established.
ECDSA key fingerprint is SHA256:xltTmad7PHB4XORvNjSpTaA4hdjQmix o3VHfYgwuRE.
ECDSA key fingerprint is MD5:52:f6:2c:cc:d4:75:ce:06:c6:c0:1e:18:7c:4e:2c:73.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@slave2's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'slave2'"
and check to make sure that only the key(s) you wanted were added.

[root@localhost ~]# hostname master
[root@localhost ~]# bash
[root@master ~]# 
[root@master ~]# scp /etc/hosts slave1:/etc/hosts
hosts                                                    100%  218   174.0KB/s   00:00    
[root@master ~]# scp /etc/hosts slave2:/etc/hosts
hosts                                                    100%  218   117.7KB/s   00:00    

slave1操作

代码语言:javascript复制
[root@localhost ~]# hostname slave1
[root@localhost ~]# bash
[root@slave1 ~]# ssh-copy-id -i master
[root@slave1 ~]# ssh-copy-id -i slave2

slave2操作

代码语言:javascript复制
[root@localhost ~]# hostname slave2
[root@localhost ~]# bash
[root@slave2 ~]# ssh-copy-id -i master
[root@slave2 ~]# ssh-copy-id -i slave1

四台主机 关防火墙/沙盒

代码语言:javascript复制
systemctl stop firewalld && setenforce 0

先进行安装MYSQL 1.安装MySQL的yum源

代码语言:javascript复制
wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
代码语言:javascript复制
yum -y install mysql57-community-release-el7-11.noarch.rpm

2.安装完成,查看是否安装成功

代码语言:javascript复制
yum repolist enabled | grep mysql.*

3.可以进行安装mysql了

代码语言:javascript复制
yum install mysql-community-server

4.安装完成后就可以启动mysql了

代码语言:javascript复制
systemctl start mysqld.service

5.获取随机密码

代码语言:javascript复制
grep 'temporary password' /var/log/mysqld.log

6.如果想要设置自己的密码简单的话 ,它自带密码检查机制不让你设置简单的进行sql输入设置

代码语言:javascript复制
mysql -uroot -p
password:刚获取的随机密码
修改默认密码复杂难度
mysql>set global validate_password_policy=0;#设置密码检查策略为0
mysql>set global validate_password_length=1;#设置密码的长度为1

7.进行修改数据库密码

代码语言:javascript复制
set password for 用户名 @localhost = password('新密码');

8.至此MySQL安装完毕

进行主从复制的设置修改配置文件

配置Master主库机器

开启binlog 设置mysql的唯一编号(mysql5.7即更高版本新加参数), 和开启binlog日志 输入vi /etc/my.cnf 进入配置文件,按Insert键进入编辑模式,添加如下参数 server-id=1 (机器的唯一标识) log-bin=/var/lib/mysql/mysql-bin (开启binlog)

代码语言:javascript复制
vim /etc/my.cnf

进行mysql重启

代码语言:javascript复制
systemctl restart mysqld

进入mysql目录查看binlog是否开启成功

进入MySQL创建用户并授权

代码语言:javascript复制
mysql> grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)
配置Slave从库机器
代码语言:javascript复制
slave1
代码语言:javascript复制
slave2

重启MySQL服务

代码语言:javascript复制
systemctl restart mysqld

查看主服务器状态

代码语言:javascript复制
mysql> show master status;
 ------------------- ---------- -------------- ------------------ ------------------- 
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
 ------------------- ---------- -------------- ------------------ ------------------- 
| master-bin.000006 |     1049 |              |                  |                   |
 ------------------- ---------- -------------- ------------------ ------------------- 
1 row in set (0.00 sec)

配置从库与主库同步配置 slave1、salve2

代码语言:javascript复制
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.10',
    -> MASTER_USER='slave',
    -> MASTER_PASSWORD='123.com',
    -> MASTER_LOG_FILE='master-bin.000006',
    -> MASTER_LOG_POS=1049;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

启动同步

代码语言:javascript复制
start slave;

查看slave状态,这两项必须为yes

代码语言:javascript复制
show slave statusG;

测试是否同步:

主库进行创建数据库;

代码语言:javascript复制
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
 -------------------- 
| Database           |
 -------------------- 
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
 -------------------- 
5 rows in set (0.00 sec)

查看slave1、slave2从库;

代码语言:javascript复制
mysql> show databases;
 -------------------- 
| Database           |
 -------------------- 
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
 -------------------- 
5 rows in set (0.00 sec)
一主两从搭建成功!!!

部署MHA

0 人点赞