Linux云计算-MySQL-高可用集群架构-MHA 架构

Posted 学神来啦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux云计算-MySQL-高可用集群架构-MHA 架构相关的知识,希望对你有一定的参考价值。


部署 MHA 高可用集群

mysql-MHA 群环境说明

接下来部署 MHA,具体的搭建环境如下(所有操作系统均为 CentOS7.6):

VIP:192.168.1.66
IP 地址 主机名 角色 软件
192.168.1.62 xuegod62.cn manager mha4mysql-mana  mha4mysql-node
192.168.1.63 xuegod63.cn master mha4mysql-node
192.168.1.64 xuegod64.cn slave1,Candidate master mha4mysql-node
192.168.1.65 xuegod65.cn slave2 mha4mysql-node

其中 master 对外提供写服务,备选 Candidate master(实际为 slave1)提供读服务,slave2 也提供读服务,一旦 master 宕机,将会把备选 master 提升为新的 master,slave2 指向新的 master

注:xuegod62 作为管理节点可以配置给的低一些,其他节点配置能够运行 mysql 即可。拓扑图如下:

配置所有节点的 ssh 免密码登录

配置所有主机相互 SSH 登录无密码验证(使用 key 登录,工作中常用)。但是有一点需要注意:不能禁止 password 登陆,否则会出现错误

[root@xuegod63 ~]# ssh-keygen -t rsa
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:sBMnO2ri/4gq+JnAXXCEx4WqDeBPnatKkwXrZ/uWMjM root@xuegod63
The key's randomart image is:
+---[RSA 2048]----+
| o.o. |
|. ..+ |
|o. .+.= . |
| ooooo B |
| .*. .* S |
|o.+o.o o |
|o*.++ . |
|+o+E.+ |
|o+BoXo. |
+----[SHA256]-----+ [root@xuegod63 ~]# ssh-copy-id 192.168.1.62
[root@xuegod63 ~]# ssh-copy-id 192.168.1.63 [root@xuegod63 ~]# ssh-copy-id 192.168.1.64
[root@xuegod63 ~]# ssh-copy-id 192.168.1.65
其他主机重复上面操作。
[root@xuegod62 ~]# ssh-keygen -t rsa
[root@xuegod62 ~]# ssh-copy-id 192.168.1.62 [root@xuegod62 ~]# ssh-copy-id 192.168.1.63
[root@xuegod62 ~]# ssh-copy-id 192.168.1.64
[root@xuegod62 ~]# ssh-copy-id 192.168.1.65
[root@xuegod64 ~]# ssh-keygen -t rsa
[root@xuegod63 ~]# ssh-copy-id 192.168.1.64 [root@xuegod64 ~]# ssh-copy-id 192.168.1.63
[root@xuegod64 ~]# ssh-copy-id 192.168.1.62
[root@xuegod64 ~]# ssh-copy-id 192.168.1.65
[root@xuegod65 ~]# ssh-keygen -t rsa
[root@xuegod63 ~]# ssh-copy-id 192.168.1.65
[root@xuegod65 ~]# ssh-copy-id 192.168.1.63
[root@xuegod65 ~]# ssh-copy-id 192.168.1.62
[root@xuegod65 ~]# ssh-copy-id 192.168.1.64

安装 mha-node

所有节点安装 mha-node 工具包
配好网络源,安装 epel 源,以 xuegod62 为例,所有节点上,都执行以下操作:

[root@xuegod62 ~]# yum install -y wget
[root@xuegod62 ~]# wget -O /etc/yum.repos.d/epel.repo 
http://mirrors.aliyun.com/repo/epel-7.repo

注:可以在 xshell 的这里执行,这样就可以在所有终端上执行这个命令了。

[root@xuegod62 ~]# yum clean all
[root@xuegod62 ~]# yum makecache

1.使用 yum 安装全部依赖,以 xuegod62 为例,所有节点上,都执行以下操作:

[root@xuegod62 ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny 
perl-LogDispatch perl-Parallel-ForkManager libappstream-glib deltarpm patchutils

2. 上传 mha4mysql-node-0.57-0.el7.noarch.rpm 程序包到所有节点上。先上传到 xuegod63 上,然后复制到其他结点:

[root@xuegod63 ~]# scp mha4mysql-node-0.57-0.el7.noarch.rpm 192.168.1.62:/root/
[root@xuegod63 ~]# scp mha4mysql-node-0.57-0.el7.noarch.rpm 192.168.1.64:/root/
[root@xuegod63 ~]# scp mha4mysql-node-0.57-0.el7.noarch.rpm 192.168.1.65:/root/
注意:所有的节点都需要安装 mha4mysql-node 程序包,以 xuegod62 为例,所有节点上,都执行以下操作:
[root@xuegod62 ~]# rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm
安装完成后会在/usr/bin/目录下生成以下脚本文件:
[root@xuegod62 ~]# cd /usr/bin/
[root@xuegod62 bin]# ll app* filter* purge* save*
-rwxr-xr-x. 1 root root 70176 610 2014 applydeltarpm
-rwxr-xr-x 1 root root 16381 531 2015 apply_diff_relay_logs
-rwxr-xr-x. 1 root root 27752 87 2017 appstream-compose
-rwxr-xr-x. 1 root root 102272 87 2017 appstream-util
-rwxr-xr-x. 1 root root 46256 610 2014 filterdiff
-rwxr-xr-x 1 root root 4807 531 2015 filter_mysqlbinlog
-rwxr-xr-x 1 root root 8261 531 2015 purge_relay_logs
-rwxr-xr-x 1 root root 7525 531 2015 save_binary_logss

安装 MHA Manager

仅在 xuegod62(管理节点)安装MHA Manager 中主要包括了几个管理员的命令行工具,例如 master_manger,master_master_switch 等。
MHA Manger 也依赖于 perl 模块,具体如下:

  1. 安装 MHA Node 软件包之前需要安装依赖。我这里使用 yum 完成,首先 epel 源要安装。
    注意:刚才我们已经配置 epel 源。
  2. 安装 MHA Manager。首先安装 MHA Manger 依赖的 perl 模块(我这里使用 yum 安装):
[root@xuegod62 bin]# cd
[root@xuegod62 ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-LogDispatch perl-Parallel-ForkManager 
perl-Time-HiRes perl-ExtUtils-CBuilder perl-ExtUtilsMakeMaker perl-CPAN
安装 mha4mysql-manager
[root@xuegod62 ~]# rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm
安装完成后会在/usr/bin 目录下面生成以下脚本文件
[root@xuegod62 ~]# ll /usr/bin/mast*
-rwxr-xr-x 1 root root 1995 531 2015 /usr/bin/masterha_check_repl
-rwxr-xr-x 1 root root 1779 531 2015 /usr/bin/masterha_check_ssh
-rwxr-xr-x 1 root root 1865 531 2015 /usr/bin/masterha_check_status
-rwxr-xr-x 1 root root 3201 531 2015 /usr/bin/masterha_conf_host
-rwxr-xr-x 1 root root 2517 531 2015 /usr/bin/masterha_manager
-rwxr-xr-x 1 root root 2165 531 2015 /usr/bin/masterha_master_monitor
-rwxr-xr-x 1 root root 2373 531 2015 /usr/bin/masterha_master_switch
-rwxr-xr-x 1 root root 5171 531 2015 /usr/bin/masterha_secondary_check
-rwxr-xr-x 1 root root 1739 531 2015 /usr/bin/masterha_stop
                                              资料领取添加小姐姐微信即可

安装 mysql5.7

注意:主库 binlog-do-db 和 从库 replicate- do-db 设置必须相同,MHA 在启动时候会检测过滤规则,如果过滤规则不同,MHA 不启动监控和故障转移。

xuegod63 master
xuegod64 slave1,备用 master
xuegod65 slave2

在 xuegod63 配置主数据库服务器
上传 mysql-5.7.tar.gz 到 xuegod63 主机上,并解压:
注:mysql-5.7.tar.gz 中包括了安装 mysql5.7 主要的软件包。 这样部署起来更方便

[root@xuegod63 ~]# scp mysql-5.7.tar.gz 192.168.1.64:/root/
[root@xuegod63 ~]# scp mysql-5.7.tar.gz 192.168.1.65:/root/

安装 mysql
注:所有 mysql 节点全部安装,由于临时密码不同,此处省略 64、65 节点安装初始化过程

[root@xuegod63 ~]# tar xvf mysql-5.7.tar.gz
[root@xuegod63 ~]# yum -y install ./mysql*.rpm
[root@xuegod63 ~]# systemctl start mysqld #启动 MySQL 会生成临时密码。
xuegod63 在 MySQL 的配置文件/etc/my.cnf 中关闭密码强度审计插件,并重启 MySQl 服务。
[root@xuegod63 ~]# vim /etc/my.cnf #修改 MySQL 的配置文件,在[myqld]标签
处末行添加以下项:
validate-password=OFF #不使用密码强度审计插件
[root@xuegod63 ~]# systemctl restart mysqld #重启 MySQL 服务
[root@xuegod63 ~]# grep 'password' /var/log/mysqld.log #获取临时密码。
2018-08-01T09:59:33.918961Z 1 [Note] A temporary password is generated for 
root@localhost: buL.UJp!T2Od #临时密码
[root@xuegod63 ~]# mysql -u root -p'buL.UJp!T2Od' #使用临时密码登录
MySQl,注意临时密码要引号
mysql> set password for root@localhost = password('123456'); #修改 root 用户密
码为 123456
mysql> flush privileges;
xuegod64 同上 xuegod65 同上

配置 mysql 主从环境

xuegod63 创建要同步的数据库

[root@xuegod63 ~]# mysql -u root -p123456
mysql> create database HA;
mysql> use HA;
mysql> create table test(id int,name varchar(20));
mysql> insert into test values (1,"mk");
mysql> exit
将 xuegod63 配置为 mysql 主节点
[root@xuegod63 ~]# vim /etc/my.cnf #在文件最后,插入以下内容
log-bin=mysql-bin-master #启用二进制日志
server-id=1 #本机数据库 ID 标示
binlog-do-db=HA #可以被从服务器复制的库。二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
重启 MySQL:
 [root@xuegod63 ~]# systemctl restart mysqld && systemctl enable mysqld
授权:
[root@xuegod63 ~]# mysql -u root -p123456
mysql> grant replication slave on *.* to repl@'192.168.1.%' identified by '123456';
mysql> flush privileges;
查看状态信息:
mysql> show master status;
mysql> exit
将 HA 数据库上传到从节点
[root@xuegod63 ~]# mysqldump -u root -p123456 -B HA >HA.sql
[root@xuegod63 ~]# scp HA.sql root@192.168.1.64:/root
[root@xuegod63 ~]# scp HA.sql root@192.168.1.65:/root
配置 xuegod64 为 mysql 从节点:
导入数据库
[root@xuegod64 ~]# mysql -u root -p123456 <HA.sql
配置 my.cnf:
[root@xuegod64 ~]# vim /etc/my.cnf #在文件的最后插入以下内容
log-bin=mysql-slave1 #启用二进制日志
server-id=2 #本机数据库 ID 标示
binlog-do-db=HA #可以被从服务器复制的库。二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
log_slave_updates=1 #只有开启 log_slave_updates,从库 binlog 才会记录主库同步的
操作日志
重启 MySQL 并授权:
[root@xuegod64 ~]# systemctl restart mysqld 
[root@xuegod64 ~]# mysql -u root -p123456
mysql> grant replication slave on *.* to 'repl'@'192.168.1.%' identified by '123456';
mysql> flush privileges;

建立主从关系

mysql> change master to 
master_host='192.168.1.63',master_user='repl',master_password='123456';
mysql> start slave;
mysql> show slave status\\G

mysql> exit
配置  xuegod65
导入数据库
[root@xuegod65 ~]# mysql -u root -p123456 <HA.sql
配置 my.cnf:
[root@xuegod65 ~]# vim /etc/my.cnf
#在文件的最后插入以下内容
#启用二进制日志
#本机数据库 ID 标示
log-bin=mysql-slave2
server-id=3
binlog-do-db=HA
binlog-ignore-db=mysql
log_slave_updates=1
#可以被从服务器复制的库。二进制需要同步的数据库名
#不可以被从服务器复制的库
#只有开启 log_slave_updates,从库 binlog  才会记录主库同步的
操作日志
[root@xuegod65 ~]# systemctl restart mysqld     #重启  MySQL
[root@xuegod65 ~]# mysql -u root -p123456
mysql> grant replication slave on *.* to 'repl'@'192.168.1%' identified by '123456';
mysql> flush privileges;
建立主从关系
mysql> change master to
master_host='192.168.1.63',master_user='repl',master_password='123456';
mysql> start slave;
mysql> show slave status\\G

mysql> exit
测试 mysql  主从数据同步:
在 xuegod63 mysql  主上插入数据:
mysql> use HA;
mysql>
mysql>
insert into test
insert into test
values(2,"man");
values(3,"root");
在 xuegod65  上查看数据:
mysql> use HA;
mysql> select * from test;
+------+------+
#可以看到数据,说明,数据同步成功
| id     | name |
+------+------+
|
|
1 | mk
|
1 | root |
+------+------+

配置 MHA 管理用户

两台 slave 服务器设置 read_only(从库对外提供读服务,只是没有写进配置文件,当集群发生切换时新的 master 节点会取消只读状态)

[root@xuegod64 ~]# mysql -u root -p123456 -e 'set global read_only=1'
[root@xuegod65 ~]# mysql -u root -p123456 -e 'set global read_only=1'

注:set global read_only=1 作用是:进行主备切换的时候,一般都会先对主库进行只读操作(on),然后主备同步完成后,再把备库置为可读写(off)。这样可以避免切换的过程中双写引起脏数据。

在所有数据库结点上创建 mha 管理用户
远程登录用户必须拥有 localhost 权限才可以登录,必须先授权 localhost 再授权 192.168.1.%

[root@xuegod63 ~]# mysql -uroot -p123456
mysql> grant all privileges on *.* to 'mha'@'localhost' identified by '123456';
mysql> grant all privileges on *.* to 'mha'@'192.168.1.%' identified by '123456';
mysql> flush privileges;
mysql> exit
[root@xuegod64 ~]# 同上
[root@xuegod65 ~]# 同上

注:该管理用户是为了管理 MHA 集群,比如:master 节点故障后,MHA 管理软件通过管理用户在 slave2 节点执行 sql
语句将 master 设置为 xuegod64。 到这里整个集群环境已经搭建完毕,剩下的就是配置 MHA 软件了。

配置 MHA

  1. 创建 MHA 的工作目录,并且创建相关配置文件(在软件包解压后的目录里面有样例配置文件)。
[root@xuegod62 ~]# mkdir -p /etc/masterha
[root@xuegod62 ~]# mkdir -p /var/log/masterha/app1
[root@xuegod62 ~]# cd /etc/masterha/
[root@xuegod62 masterha]# rz #上传 app1.cnf 到/etc/masterha/目录下
注:app1.cnf 配置文件从这里可以下载:https://github.com/yoshinorim/mha4mysqlmanager/wiki/Configuration
[root@xuegod62 ~]# vim /etc/masterha/app1.cnf
修改 app1.cnf 配置文件,修改后的文件内容如下
注:配置文件中的注释需要去掉,我这里是为了解释清楚,课程资料中附配置文件可直接使用。
[server default]
manager_workdir=/var/log/masterha/app1 #设置 manager 的工作目录
manager_log=/var/log/masterha/app1/manager.log #设置 manager 的日志
master_binlog_dir=/var/lib/mysql #指定 mysql 保存 binlog 的位
置,以便 MHA 可以找到 master 的日志,我这里的也就是 mysql 的数据目录
master_ip_failover_script=/usr/local/bin/master_ip_failover #设置自动 failover 时候的
切换脚本,这个脚本如果没有,就不需要写入此项,否则会报错。
password=123456 #设置 MySQL 中 mha 用户的密码,这个密码是前文中创建监控用
户的那个密码
user=mha #设置管理用户 mha
ping_interval=1 #设置监控主库,发送 ping 包的时间间隔,默认是 3 秒,尝试三次没有
回应的时候自动进行 failover
remote_workdir=/tmp #设置远端 MySQL 在发生切换时,binlog 的保存位置
repl_password=123456 #设置复制用户的密码
repl_user=repl #设置复制环境中的复制用户名
#report_script=/usr/local/send_report #设置发生切换后发送的报警的脚本,没有配置则注释
shutdown_script="" #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放
在发生脑裂,这里没有使用)
ssh_user=root #设置 SSH 的登录用户名
[server1]
hostname=192.168.1.63
port=3306
[server2]
hostname=192.168.1.64
port=3306
candidate_master=1 #设置为候选 master,如果设置该参数以后,发生主从切换以后将会将此
从库提升为主库,即使这个主库不是集群中事件最新的 slave candidate 侯选人
check_repl_delay=0 #默认情况下,如果一个 slave 落后 master 100M 的 relay logs 的话,
MHA 将不会选择该 slave 作为一个新的 master,因为对于这个 slave 的恢复需要花费很长时间,通过
设置 check_repl_delay=0,MHA 触发切换在选择一个新的 master 的时候将会忽略复制延时,这个参
数对于设置了 candidate_master=1 的主机非常有用,因为这个候选主在切换的过程中一定是新的
master
[server3]
hostname=192.168.1.65
port=3306
上传 master_ip_failover perl 脚本文件到 xuegod62 主机上/usr/local/bin/目录下,MHA 主
程序负责对数据转移和故障切换功能,该脚本负责对 VIP 进行切换
[root@xuegod62 ~]# mv master_ip_failover /usr/local/bin/
[root@xuegod62 ~]# chmod +x /usr/local/bin/master_ip_failover
如果你的网卡名称不是 ens33 请修改脚本文件中的网卡名称
14 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; # Network name 
15 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
  1. 关闭 relay log 的自动清除功能(在每个 slave 节点上)
[root@xuegod64 ~]# mysql -uroot -p123456 -e 'set global relay_log_purge=0'
[root@xuegod65 ~]# mysql -uroot -p123456 -e 'set global relay_log_purge=0'

注意:
MHA 在发生切换的过程中,从库的恢复过程中依赖于 relay log 的相关信息,所以这里要将 relay log 的自动清除设置为 OFF,采用手动清除 relay log 的方式。 在默认情况下,从服务器上的中继日志会在 SQL 线程执行完毕后被自动删除。 但是在 MHA 环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用中继日志的自动删除功能

MHA 配置检查

  1. 检查 SSH 配置
    检查 MHA Manger 到所有 MHA Node 的 SSH 连接状态:
[root@xuegod62~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

3Linux云计算系列-CentOS6-高可用集群

Oracle Compute云快速搭建MySQL Keepalived高可用架构

mysql进阶MHA高可用集群

高可用的PHP-嘉宾介绍|微软首席产品经理讲述云原生的 MySQL 托管服务架构及读写分离的优化

Mysql集群高可用架构(MHA)

云计算学习大纲是什么?怎么学习云计算?