Mysql高可用集群–MHA

Mysql高可用集群–MHA

什么是 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是最小化安装 四台主机安装一些命令 并关闭防火墙

systemctl stop firewalld && yum -y install net-tools vim wget git make cmake gcc gcc-c++

修改主机名并做免密登录

master操作

[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操作

[root@localhost ~]# hostname slave1
[root@localhost ~]# bash
[root@slave1 ~]# ssh-copy-id -i master
[root@slave1 ~]# ssh-copy-id -i slave2

slave2操作

[root@localhost ~]# hostname slave2
[root@localhost ~]# bash
[root@slave2 ~]# ssh-copy-id -i master
[root@slave2 ~]# ssh-copy-id -i slave1

四台主机
关防火墙/沙盒

systemctl stop firewalld && setenforce 0

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

wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
yum -y install mysql57-community-release-el7-11.noarch.rpm

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

yum repolist enabled | grep mysql.*

3.可以进行安装mysql了

yum install mysql-community-server

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

systemctl start mysqld.service

5.获取随机密码

grep 'temporary password' /var/log/mysqld.log

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

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

7.进行修改数据库密码

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)

vim /etc/my.cnf

在这里插入图片描述

进行mysql重启

systemctl restart mysqld

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

在这里插入图片描述
进入MySQL创建用户并授权

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从库机器

slave1

在这里插入图片描述

slave2

在这里插入图片描述
重启MySQL服务

systemctl restart mysqld

查看主服务器状态

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

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)

启动同步

start slave;

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

show slave status\G;

在这里插入图片描述

测试是否同步:

主库进行创建数据库;

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从库;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)
一主两从搭建成功!!!

部署MHA

所需要的MHA安装包链接?

链接:https://pan.baidu.com/s/1QOgJrkHItlCjwMX60h6s4A 
提取码:e9bi 
复制这段内容后打开百度网盘手机App,操作更方便哦

第一步

搭建MySQL主从(做好可略过)

需要注意的一点:mysql主从复制的授权用户也需要三台都做,因为一旦有一台主宕机,就有一台从要代替主,所以还是需要有一个可以复制二进制日志的用户,三台用户名也必须一样

MySQL主的my.cnf配置文件

server-id=1
log-bin=master-bin
log-slave-updates=true
relay-log = relay-log-bin

MySQL从的my.cnf配置文件

为什么从的配置文件会有和主一样的log-bin,同授权原因一样,如果主宕机后,从变为主,也需要有二进制日志文件

一台server-id为2,一台server-id为3

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	# 高可用进行切换时,从升为主时,保留之前的中继日志

数据库授权mha用户,此用户将用作管理端管理mysql时使用的数据库用户

三台数据库分别登录数据库客户端,执行以下命令进行授权

grant all on *.* to 'mha'@'192.168.1.%' identified by '123.com';

再接着授权主从复制用户(三台数据库都做)

grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '123.com';

查看MySQL主(192.168.1.10)的偏移量,用来从服务器复制使用

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      1021 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

分别在两台MySQL(192.168.1.20/192.168.1.30)从执行以下

change master to master_host='192.168.1.10',master_user='slave',master_password='123.comm',master_log_file='master-bin.000001',master_log_pos=1021;
start slave;
show slave status\G  # 出现以下则成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

第二步

为了方便管理,四台服务器之间做免密登录

MHA管理端192.168.1.40
node1、node2、node3同样 (做过可忽略)

ssh-keygen
ssh-copy-id -i 192.168.1.10
ssh-copy-id -i 192.168.1.20
ssh-copy-id -i 192.168.1.30

第三步

将每台服务器都安装被管理节点

四台操作一致

[root@localhost ~]# rpm -ivh epel-release-latest-7.noarch.rpm

使用网络yum安装依赖关系,这里需要使用网络yum

yum -y install perl-DBD-mysql perl-DBI
[root@localhost ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

第四步
#如下代码在进行复制的时候请删掉后面注释部分文字(以免报错)
在MHA管理端(192.168.1.40)安装管理包

在没有mysql的主机上进行安装以下包

yum -y install perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

编写配置文件

[root@localhost ~]# vim /etc/masterha_default.cnf
[server default]    # 全局配置
user=mha    # 经过数据库授权的给管理节点的管理用户
password=123.com  # 经过数据库授权的给管理节点的管理用户的密码
repl_user=slave		# 主从复制使用的用户
repl_password=123.com   # 主从复制使用的用户密码
ssh_user=root    # 管理节点与节点之间使用的ssh用户
master_binlog_dir=/var/lib/mysql  # mysql主存放二进制日志的目录
remote_workdir=/data/login	# 当获取到mysql主的二进制日志是存放在本机的此目录
ping_interval=2  # 管理节点与mysql主的通讯时间(秒),超过时间,则认为mysql主宕机了
shutdown_script=""   # 当mysql主宕机时执行的脚本,可以为空

编写管理节点的配置文件

[root@localhost ~]# mkdir /etc/mha
[root@localhost ~]# vim /etc/mha/app1.cnf
[server default]  # 全局配置
manager_workdir=/var/lib/manager   # 工作目录
manager_log=/var/log/manager/manager.log	# 日志目录,manager需要创建
[server1]   # 节点配置
hostname=192.168.1.10
port=3306
ssh_port=22
[server2]
hostname=192.168.1.20
port=3306
ssh_port=22
candidate_master=1  # 表示mysql主宕机后,有server2的节点来接替主
[server3]
hostname=192.168.1.30
port=3306
ssh_port=22

创建目录

mkdir /var/log/manager

测试manager与数据库节点之间的ssh通讯是否正常

[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
# 最后显示ok

启动MHA管理端,处于监控的状态

[root@localhost ~]# masterha_manager --global-conf=/etc/masterha_default.cnf --conf=/etc/mha/app1.cnf
# 阻塞状态

验证:

MySQL主192.168.1.10

systemctl stop mysqld

将主的mysql服务模拟故障后,监控的管理端会使用mha用户开始选举另一个主,来接替,down掉的主再上线,就是独立的mysql

在变成主库的从上创建库来验证,其他从库是否复制到

友情连接?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/101934.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • spring 4 泛型注入

    spring 4 泛型注入最近对系统进行改造,发现在泛型实例初始化的时候,得不到想要的泛型。或者需要强制转换。spring4开始支持泛型对象初始化,初始化方法如下:注:使用配置文件的方法暂时还没有发现,下面是使用javaannotation的方法:packagecom.mitchz..toolkit.chain;importjava.util.List;importjava.util.M

  • jdk和jvm区别_java中集合和数组的区别

    jdk和jvm区别_java中集合和数组的区别最近翻看了java线程相关的东西,书中有一边专门讲到java内存模型,读完之后边回想起java虚拟机模型,那时心中便在思考java内存模型(以下简称jmm)和java虚拟机模型(以下简称jvm)之间的关系,下面将详细讲述。一jvm结构jvm的内部结构如下图所示,这张图很清楚形象的描绘了整个JVM的内部结构,以及各个部分之间的交互和作用。1ClassLoader(类加载器)就是…

  • JS基础——cssText的用法[通俗易懂]

    JS基础——cssText的用法[通俗易懂]JS基础——cssText的用法#div1{width:100px;height:100px;background:#f3f3f3;border:1pxsolid#ccc;color:red;}window.onload=function(){ var oDiv=document.getElementById(‘div1’); varoBtn=docume

  • 移动硬盘写入数据报错“MS-DOS功能无效”,或移动硬盘内新建文件夹报错0x8000FFFF灾难性错误

    移动硬盘写入数据报错“MS-DOS功能无效”,或移动硬盘内新建文件夹报错0x8000FFFF灾难性错误问题已解决,文章有点长,请耐心观看,包含遇到的问题和解决问题地过程。楼主近来新买了机械个硬盘,闲鱼出品,必属精品,主要是用来存储一些很有纪念意义的文件和平时用不到的文件,估计以后用到这些文件的机会应该很少了,一般来说机械硬盘虽然比固态硬盘不禁摔,但是存储数据的时间更长,很适合我的需求。晚上一股脑把数据存进去的时候,2T的硬盘大概存了150G之后开始报错。先是放入文件夹时显示【MS-DOS功能无效】,无法写入,我把文件夹内单个文件写入硬盘,可行,但不可能把各种类型的文件直接放进硬盘。我尝试新建文

  • 开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]

    开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]

  • 英伟达官网怎么找老版本的显卡驱动

    英伟达官网怎么找老版本的显卡驱动本文分享一下贫穷博主小白苦苦寻求老驱动版本的方法。本文目录1.打开链接2.之后打开浏览器控制台3.然后在当前页面,再次点击开始搜索4.提高下载速度1.打开链接http://www.geforce.cn/drivers/beta-legacy.选择与自己的电脑显卡匹配的配置,点击开始搜索,默认结果只会出现目前最新的10个该显卡的驱动程序版本。但是我们需要较遥远老版本的显卡驱动,10个显然不够。2.之后打开浏览器控制台笔者的是谷歌浏览器,快捷键F12打开控制台,其它浏览器类似。在控制台输入如下

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号