MySQL高可用MHA

一、MHA概述

1.1 什么是 MHA

MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。

MHA 的出现就是解决MySQL 单点故障的问题。

MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。

MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。

1.2 MHA 的组成

1)MHA Node(数据节点)

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

2)MHA Manager(管理节点)

  • MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。
  • MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master, 然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。

 1.3 MHA 的特点

  • 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
  • 使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
  • 目前MHA支持一主多从架构,最少三台服务器,即一主两从

二、MySQL MHA搭建准备 

节点服务器    系统    主机名    IP地址    安装工具及服务
MHA manager 服务器    CentOS7.4(64 位)    manager    192.168.52.100    MHA node 和 manager 组件
Master 服务器    CentOS7.4(64 位)    mysql1    192.168.52.140    MHA node 组件
Slave1 服务器    CentOS7.4(64 位)    mysql2    192.168.52.130    MHA node 组件
Slave2 服务器    CentOS7.4(64 位)    mysql3    192.168.52.120    MHA node 组件
 

三、搭建 MySQL MHA 

1、 配置主从复制

1.1所有服务器关闭防火墙与selinux

systemctl stop firewalld 
systemctl disable firewalld
setenforce 0

1.2 Master、Slave1、Slave2 节点安装mysql5.7 

1.3修改 Master、Slave1、Slave2 节点的主机名

#Master 节点
hostnamectl set-hostname mysql1
su 
#Slave1节点
hostnamectl set-hostname mysql2
su ​
#Slave2节点
hostnamectl set-hostname mysql3
su

 

 1.4在Master、Slave1、Slave2添加主机映射关系

#三台添加同样的配置
vim /etc/hosts
192.168.92.7 mysql1
192.168.92.6 mysql2
192.168.92.9 mysql3

 

网络连通性测试 

 1.5修改 Master、Slave1、Slave2 节点的 Mysql主配置文件/etc/my.cnf

Master节点,开启二进制日志。

Slave1、Slave2 节点,开启二进制日志和中继日志。

#Master 节点
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin         #开启二进制日志
log-slave-updates = true     #允许slave从master复制数据时可以写入到自己的二进制日志
-------------------------------------------- ​
systemctl restart mysqld     #重启mysql​
#Slave1节点
vim /etc/my.cnf
[mysqld]
server-id = 2               #三台服务器的 server-id 不能相同
log_bin = master-bin        #开启中继日志
relay-log = relay-log-bin   
relay-log-index = slave-relay-bin.index
----------------------------------------------------- ​
systemctl restart mysqld​
#Slave2节点
vim /etc/my.cnf
[mysqld]
server-id = 3               #三台服务器的 server-id 不能相同
log_bin = master-bin        #开启中继日志
relay-log = relay-log-bin   #添加定义中继日志文件位置与名称一般与二进制文件在同一目录
relay-log-index = slave-relay-bin.index 
------------------------------------------------
systemctl restart mysqld     #重启mysql

 

 

 1.6在 Master、Slave1、Slave2 节点上都创建两个软链接

ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/ ​
ls /usr/sbin/mysql*     #查看软链接

1.7登录数据库进行授权 

所有数据库节点mysql主从同步的授权

grant replication slave on *.* to 'myslave'@'192.168.92.%' identified by '123123';   
#从服务器同步使用

所有数据库节点,授权给manager服务器 

#所有数据库节点进行manager授权
grant all privileges on *.* to 'my'@'192.168.92.%' identified by 'abc123'; 
#为了防止因主机名导致的连接不上问题,再次对登录地址进行授权​ 
grant all privileges on *.* to 'my'@'mysql1' identified by 'abc123';              
grant all privileges on *.* to 'my'@'mysql2' identified by 'abc123';
grant all privileges on *.* to 'my'@'mysql3' identified by 'abc123';
flush privileges;   #刷新权限

1.8配置主从同步 

在 Master 节点查看二进制文件和同步点

#在 Master 节点查看二进制文件和同步点(即偏移量)
show master status;

在 Slave1、Slave2 节点执行同步操作:

#在 Slave1、Slave2 节点执行同步操作
change master to 
master_host='192.168.92.7',
master_user='myslave',
master_password='123123',
master_log_file='master-bin.000001',
master_log_pos=1893; 
------------------------------------------------ ​
start slave;     #开启同步,如有报错执行 reset slave;
------------------------------------ ​
#在 Slave1、Slave2 查看节点状态
show slave status\G     
#确保 IO 和 SQL 线程都是 Yes,代表同步正常。Slave_IO_Running: YesSlave_SQL_Running: Yes

一般Slave_IO_Running:No的可能性

  • 网络不通
  • my.cnf配置有问题
  • 密码、file文件名、pos偏移量不对
  • 防火墙没有关闭

 两个从库设置为只读模式

 #两个从库必须设置为只读模式set global read_only=1;

在Master主库插入数据 

#在Master主库插入数据,测试数据库同步##
create database my; 
use my;
create table city(id int);
insert into city values (1);

从数据库中验证数据同步

#从数据库中验证是否同步成功
show databases;
use my;
show tables;
select * from city;

 

2 、配置MHA 

2.1安装MHA软件

所有服务器上都安装MHA依赖的环境,首先安装 epel 源

  • 对于每个操作系统版本不一样,这里 CentOS7.4 必须选择 0.57 版本。
  • 在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager组件 依赖 node 组件。
#安装epel源
yum install epel-release --nogpgcheck -y​
#安装 MHA依赖环境
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

所有服务器上首先安装epel源 

所有服务器安装MHA依赖的环境 

 安装 MHA 软件包,必须先在所有服务器上安装 node 组件 

 在所有服务器上安装 node 组件

#将安装包上传到/opt/目录中,解压安装node组件
cd /opt/
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install 

 最后在 MHA manager 节点上安装 manager 组件

在 MHA manager 节点上安装 manager 组件##(manager组件依赖node 组件)
cd /opt/
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install

 manager 组件安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个

 

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

 node 组件安装后也会在/usr/local/bin/ 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下

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

2.2在所有服务器上配置无密码认证

在 manager 节点上配置到所有数据库节点的无密码认证

ssh-keygen -t rsa             #一路按回车键,生成密钥。"-t rsa"指定密钥的类型。
ssh-copy-id 192.168.92.7    #将公钥传给所有数据库节点,形成免密码连接登录
ssh-copy-id 192.168.92.6
ssh-copy-id 192.168.92.9

在 manager 节点上配置到所有数据库节点的无密码认证

 

 在 mysql1主节点服务器上配置到数据库节点 mysql2 和 mysql3 的无密码认证

ssh-keygen -t rsa
#将公钥传给两个从节点,形成免密码连接登录
ssh-copy-id 192.168.92.6
ssh-copy-id 192.168.92.9

 在 mysql2即slave1 上配置到数据库节点 mysql1 和 mysql3 的无密码认证

ssh-keygen -t rsa
ssh-copy-id 192.168.52.140 #master服务器
ssh-copy-id 192.168.52.120 #slave2服务器

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/588437.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Leetcode笔记] 动态规划相关

前言 写题目写到了一些和动态规划相关的内容,所以在这里记录一下 LCR 089 题解思路 总的来说,就是用一个数组去存储当前的最优解,然后从0开始一路向上顺推过去,求得最后一位的最优解。 class Solution { public:int rob(vect…

mysql语句学习

SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; (先join在on) 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算&a…

Ts递归查找多个根节点树结构某一条数据

// 递归查找树结构数据 function getIsNode(nodes: any, code: string) {let found false;function search(nodes: any) {nodes.forEach((node: any) > {if (node.code code) { //code相等,视为找到,将found设置为truefound true;}// 否则查找子节…

推荐一款强大的开源自动化测试神器

搞过自动化测试的小伙伴,相信都知道,在Web自动化测试中,有一款自动化测试神器工具: selenium。结合标准的WebDriver API来编写Python自动化脚本,可以实现解放双手,让脚本代替人工在Web浏览器上完成指定的操作。 虽然s…

【LAMMPS学习】七、加速性能(3)通用技巧

7. 加速性能 7.1.基准测试 7.2.测试性能 7.3.通用技巧 以下是提高模拟性能的通用技巧。它们中的大多数只适用于当前性能中的某些模型和某些瓶颈,因此让您生成的计时数据作为指导。要预测这些选项会产生多大的差异,即使不是不可能,也是很难…

谷歌推出多模态视频模型,自动生成丰富动作视频

谷歌的研究人员推出了一款多模态扩散模型——VLOGGER。 用户只需要向VLOGGER输入图像、语音,就能生成带语音、丰富动作的人物视频。VLOGGER基于扩散模型开发而成,并提出了一种全新的架构,将文本生成图像模型与空间、时间控制相结合&#xff…

LangChain-04 RAG Retrieval-Augmented Generation 检索增强生成

内容简介 LangChain 中的 “RAG” 指的是 “Retrieval-Augmented Generation”,即检索增强生成。它是一种结合了检索(从大量数据中检索相关信息)和生成(基于检索到的信息生成文本)的技术,旨在改善和增强自…

TiDB单机版安装和连接访问

TiDB单机版安装和连接访问 1、下载 $wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz 2、解压缩 $tar -zxvf tidb-latest-linux-amd64.tar.gz 3、启动TiDB 启动PD $./bin/pd-server --data-dirpd --log-filepd.log 启动tikv $./bin/tikv-server --pd…

MySQL 进阶-----索引使用规则

目录 前言 一、验证索引效率 二、最左前缀法则 三、范围查询 四、索引失效情况 1.索引列运算 2.字符串不加引号 3 .模糊查询 4.or连接条件 5 .数据分布影响 前言 本期我们学习MySQL索引的使用方法,在讲解索引的使用原则之前,先通过一个简单的…

Celery的任务流

Celery的任务流 在之前调用任务的时候只是使用delay()和apply_async()方法。但是有时我们并不想简单的执行单个异步任务,比如说需要将某个异步任务的结果作为另一个异步任务的参数或者需要将多个异步任务并行执行,返回一组返回值,为了实现此…

ubuntu16如何使用高版本cmake

1.引言 最近在尝试ubuntu16.04下编译开源项目vsome,发现使用apt命令默认安装cmake的的版本太低。如下 最终得知,ubuntu16默认安装确实只能到3.5.1。解决办法只能是源码安装更高版本。 2.源码下载3.20 //定位到opt目录 cd /opt 下载 wget https://cmak…

C++ | Leetcode C++题解之第7题整数反转

题目&#xff1a; 题解&#xff1a; class Solution { public:int reverse(int x) {int rev 0;while (x ! 0) {if (rev < INT_MIN / 10 || rev > INT_MAX / 10) {return 0;}int digit x % 10;x / 10;rev rev * 10 digit;}return rev;} };