MySQL高可用运维的示例分析

64次阅读
没有评论

共计 11197 个字符,预计需要花费 28 分钟才能阅读完成。

这篇文章将为大家详细讲解有关 MySQL 高可用运维的示例分析,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、基本知识介绍

1、MHA 定义

Master HA。是一个开源的高可用程序,为 MySQL 的主从架构提供了故障自动恢复的功能。主从复制期间,当 MHA 监测到 MySQL 的 Master 节点故障时,会自动提升复制集群中的某个 Slave 节点成为新的 Master 节点。在切换期间,也会通过从其他节点中获取额外信息来避免数据一致性问题。除此之外,MHA 还提供了 master 节点的在线故障切换功能,可以按照需要来切换 Master/Slave 节点。

2、MHA 结构

MHA 中的所有节点主要有两种角色,即:管理节点和数据节点。
管理节点(MHA Manager):一般单独部署在一台机器上,用来管理多个 master 和 slave 集群,而每个 master 和 slave 组成的集群称之为一个 application。
数据节点(MHA Node):运行在每一台 MySQL 服务器上,通过监控具有解析和清理 logs 功能的脚本来加速节点的故障转移。

3、HMA 组件
(1)Manager 组件

masterha_check_sh:MHA 依赖的 ssh 环境监测工具
masterha_check_repl:MySQL 复制环境监测工具
masterha_manager:MHA 服务主程序
masterha_check_status:MHA 运行状态探测工具
masterha_master_monitor:MySQL master 节点可用性监测工具
masterha_master_switch:master 节点切换工具
masterha_conf_host:添加或删除配置的节点
masterha_stop:关闭 MHA 服务的工具

(2)Node 组件

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

(3)自定义扩展

secondary_check_script:通过多条网络路由监测 master 的可用性
master_ip_failover_script:更新 application 使用的 masterip
shutdown_script:强制关闭 master 节点
report_script:发送报告
init_conf_load_script:加载初始配置参数
master_ip_online_change_script:更新 master 节点 ip 地址

二、MHA 搭建

1、环境准备
操作系统:CentOS6.9_X86_64
MySQL 版本:MySQL5.6.39 通用二进制
服务器规划:
主节点 Master:192.168.199.104(mysql-master,master)

从节点 1:192.168.199.105(mysql-slave01,slave01)
从节点 2:192.168.199.106(mysql-slave02,slave02)
管理节点:192.168.199.107(mysql-manager,manager)

2、搭建
(1)配置各个节点的 host,在后面使用起来会比较方便,不用每次手写 IP

[root@mysql-master ~]# vim /etc/hosts
#添加如下内容:127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.199.104 mysql-master master
192.168.199.105 mysql-slave01 slave01
192.168.199.106 mysql-slave02 slave02
192.168.199.107 mysql-manager manager

(2)将配置好的 host 文件复制到其他三个节点上

[root@mysql-master ~]# scp /etc/hosts slave01:/etc/
[root@mysql-master ~]# scp /etc/hosts slave02:/etc/
[root@mysql-master ~]# scp /etc/hosts manager:/etc/

(3)配置主从同步,slave01 和 slave02 为 master 的从库
开启 master 的二进制日志

[root@mysql-master ~]# vim /etc/my.cnf
#在 [mysqld] 下面添加如下内容:server-id = 104
skip-name-resolve
log_bin=/mysql_data/mysql-bin
log_bin_index=/mysql_data/mysql-bin.index
binlog_format = mixed

在 master 上查看当前的二进制日志点位置,并创建复制账户

[root@mysql-master ~]# mysql -uroot –proot
#查看当前二进制日志点的位置
mysql  SHOW MASTER STATUS \G
*************************** 1. row ***************************
 File: mysql-bin.000090
 Position: 120
 Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)
#创建从库的复制账户
mysql  GRANT REPLICATION SLAVE ,REPLICATION CLIENT ON *.* TO  repl @ 192.168.199.%  IDENTIFIED BY  repl 
#刷新权限
mysql  FLUSH PRIVILEGES;

在 slave01 上开启二进制日志和中继日志,并配置为 master 的从库

[root@mysql-slave01 ~]# vim /etc/my.cnf
#在 [mysqld] 下添加如下内容:server-id = 105
log_bin = /mysql_data/mysql-bin
log_bin_index = /mysql_data/mysql-bin.index
relay_log = /mysql_data/mysql-relay
relay_log_index = /mysql_data/mysql-relay.index
read_only
relay_log_purge = 0

参数解释:

relay_log_purge: 该参数表示不自动清理中继日志,因为 MHA 需要根据 slave 的中继日志判断 slave 同步 master 的 binlog 到什么位置了
read_only: 表示是只读,MHA 需要根据这个参数来识别主从库
bin_log: 开启从库的二进制日志,因为在主节点出现故障时,需要将其中某个从库提升为主库,所以需要开启从库的二进制日志

启动 slave01 节点,并将需要同步的主节点信息指向 master 节点:

[root@mysql-slave01 ~]# service mysqld restart
[root@mysql-slave01 ~]# mysql -uroot –proot
#使用 change master 命令将主库指向 master 节点
mysql  CHANGE MASTER TO MASTER_HOST =  192.168.199.104 ,MASTER_PORT=3306,MASTER_USER= repl ,MASTER_PASSWORD= repl ,MASTER_LOG_FILE= mysql-bin.000090 ,MASTER_LOG_POS=120;
mysql  START SLAVE;
#查看是否同步成功
mysql  SHOW SLAVE STATUS \G
看到如下信息表示同步成功:Slave_IO_Running: Yes
Slave_SQL_Running: Yes

以同样的方式配置第二台从库,可以直接将 slave01 上的配置文件直接复制到第二台 slave 上,然后修改即可。

[root@mysql-slave01 ~]# scp /etc/my.cnf slave02:/etc/
[root@mysql-slave02 ~]# vim /etc/my.cnf
#修改 server-id 即可:server-id = 106

修改完成之后,保存退出,并重启 mysql,然后配置 slave02 为 master 的从库

[root@mysql-slave02 ~]# mysql -uroot –proot
mysql  CHANGE MASTER TO MASTER_HOST =  192.168.199.104 ,MASTER_PORT=3306,MASTER_USER= repl ,MASTER_PASSWORD= repl ,MASTER_LOG_FILE= mysql-bin.000090 ,MASTER_LOG_POS=120;
mysql  START SLAVE;
#查看是否同步成功
mysql  SHOW SLAVE STATUS \G
看到如下信息表示同步成功:Slave_IO_Running: Yes
Slave_SQL_Running: Yes

(4)创建具有管理权限的用户账号

# 在主节点 master 上创建管理账号,使其可以同步到其他连个从节点,注意:这个管理账号需要能够远程连接 MySQL
mysql  GRANT ALL ON *.* TO  mha @ 192.168.199.%  IDENTIFIED BY  mha 
mysql  FLUSH PRIVILEGES;

(5)由于 MHA 架构需要各个节点之间可以进行互信通信,所以需要将各个节点之间配置为无秘钥登录,由于节点比较多,单个生成并复制比较麻烦,可以在主节点上生成秘钥对,然后让每个主机都具有同样的私钥

# 在 master 上生成秘钥对
[root@mysql-master ~]# ssh-keygen -t rsa -P  
#首先保存到本机的秘钥文件中,使得本机可以无秘钥使用 ssh 方式登陆本机
[root@mysql-master ~]# cat .ssh/id_rsa.pub   .ssh/authorized_keys
#使用 ssh 登陆本机测试,发现可以无密码登陆
[root@mysql-master ~]# ssh 192.168.199.104
#修改 authorized_keys 文件的权限,只能属主查看,同组用户和其他用户不可查看
[root@mysql-master ~]# chmod go= .ssh/authorized_keys

将秘钥对和私钥文件复制到其他三个节点上,注意:保证其原有的权限

[root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys slave01:/root/.ssh/
[root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys slave02:/root/.ssh/
[root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys manager:/root/.ssh/
#测试无密码登陆,在主节点上执行如下命令,查看 slave01 节点的 ip 地址
[root@mysql-master ~]# ssh slave01  ifconfig eth0 
#能够查看到 slave01 的 ip 地址表示无秘钥登陆配置成功,其他俩节点可以自己验证

(6)下载 mha4mysql-manager 和 mha4mysql-node 安装包
此处使用的软件包版本如下:

管理节点:mha4mysql-manager-0.56.tar.gz
数据节点:mha4mysql-node-0.56.tar.gz

(7)配置 epel,因为 mha4mysql 有的包是来自于 base 中,有的包是来自于 epel 中

[root@mysql-master ~]# rpm –ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

(8)解压,并使用 perl 命令执行 Makefile.PL 脚本

[root@mysql-master ~]# tar xf mha4mysql-manager-0.56.tar.gz
[root@mysql-master ~]# cd mha4mysql-manager-0.56
[root@mysql-master mha4mysql-manager-0.56]# perl Makefile.PL

注意:执行 Makefile.PL 过程中,如果出现类似于如下的错误,则需要安装 perl 程序所依赖的库文件:

Can t locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/Install/Makefile.pm line 4.
BEGIN failed--compilation aborted at inc/Module/Install/Makefile.pm line 4

出现上述错误,则需要安装依赖:

[root@mysql-master ~]# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker cpan perl-Time-HiRes perl-DBI perl-DBD-MySQL

(9)确保”perl MakeFile.PL”正确执行之后,使用 make 命令完成安装。注:可以使用”echo $?”查看上此命令的执行结果来判断上条命令是否正确执行完成。通常 0 代表正确完成。

[root@mysql-master mha4mysql-manager-0.56]# make
[root@mysql-master mha4mysql-manager-0.56]# make install

(10)master 上的 manager 安装完成之后,按照同样的方式编译安装 mha4mysql-node

[root@mysql-manager ~]# tar xf mha4mysql-node-0.56.tar.gz
[root@mysql-manager ~]# cd mha4mysql-node-0.56
[root@mysql-manager mha4mysql-node-0.56]# perl Makefile.PL
#判断 Makefile.PL 是否正常执行完成
[root@mysql-manager mha4mysql-node-0.56]# echo $?
[root@mysql-manager mha4mysql-node-0.56]# make   make install

(11)在其他三台服务器上 (master,slave01,slave02) 上安装 mha4mysql-node

[root@mysql-slave01 ~]# tar mha4mysql-node-0.56.tar.gz
[root@mysql-slave01 ~]# cd mha4mysql-node-0.56
[root@mysql-slave01 mha4mysql-node-0.56]# perl Makefile.PL
[root@mysql-slave01 mha4mysql-node-0.56]# make   make install

其他两个节点安装方式相同,此处略。

(12)安装完成,可以看到在 /usr/local/bin 下有一些脚本,就是 mha4mysql 生成的脚本文件

(13)初始化 MHA
编辑 mha 的配置文件,主要有以下两类:
global 配置:为各个 application 提供默认配置
application 配置:用来指定有哪些服务器

# 创建目录并编辑配置文件
[root@mysql-manager ~]# mkdir -pv /etc/masterha/
[root@mysql-manager ~]# vim /etc/masterha/app01.conf

写入如下内容:

[server default]
user=mha # 管理用户的用户名
password=mha # 管理用户密码
manager_workdir=/data/masterha/app01 #manager 节点的工作目录,用来存放一些二进制日志,不存在会自动创建
manager_log=/data/masterha/app01/manager.log # 日志文件位置
remote_workdir=/data/masterha/app01 # 远程的每一个节点的工作目录,没有会自动生成
ssh_user=root # 需要使用 ssh 来完成一些管理操作
repl_user=repl # 拥有复制权限的用户名
repl_password=repl # 拥有复制权限的密码
ping_interval=1 # 每隔多长时间监测一次主节点是否在线,心跳信息监测
#其他主机
[server1]
hostname=192.168.199.104
#ssh_port=3306 # 如果 MySQL 没有使用默认端口号,则此处需要指定,使用默认端口不需要指定
candidate_master=1 # 表示该节点是否在主节点故障之后参与成为主节点
master_binlog_dir=/mysql_data/ # 指定 mysql 的 binlog 日志路径
[server2]
hostname=192.168.199.105
candidate_master=1
master_binlog_dir=/mysql_data/
[server3]
hostname=192.168.199.106
#no_master=1 # 表示主节点故障之后,该节点不参与成为主节点
master_binlog_dir=/mysql_data/

(14)检查各个节点之间的通信是否正常

[root@mysql-manager ~]# masterha_check_ssh --conf=/etc/masterha/app01.conf

错误 1:Can t locate Config/Tiny.pm in @INC (@INC contains:XXX
原因:这种错误是因为缺少依赖包
解决办法:安装提示的依赖包
如下的几个 rpm 包如果操作系统本身没有自带,需要自己从网上下载,可以从
http://rpmfind.net/ 下载所需要的 rpm 包。以下的 rpm 包都是针对 CentOS6.9 X86_64 的:

perl-Mail-Sender-0.8.16-3.el6.noarch.rpm 
perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm 
perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm
perl-Config-Tiny-2.12-7.1.el6.noarch.rpm

下载完成之后,使用 yum 命令安装即可,因为其中可能还会依赖其他包。

错误 2:master_check_ssh 执行中的错误:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
原因:/root/.ssh/ 下的文件内容不一样或者文件的权限有问题,我遇到的是文件内容有问题。
解决办法:重新将其他主机上的秘钥对和私钥拷贝一份就正常了。

(15)检查主从复制环境是否正常

[root@mysql-manager ~]# masterha_check_repl --conf=/etc/masterha/app01.conf

错误 1:

Sat Jun 2 03:07:26 2018 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln301] install_driver(mysql) failed: Can t locate DBD/mysql.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 27) line 3.
Perhaps the DBD::mysql perl module hasn t been fully installed,
or perhaps the capitalisation of  mysql  isn t right.

原因:缺少 perl-DBD-MySQL 依赖库
解决办法:

[root@mysql-manager ~]# yum install -y perl-DBD-MySQL*

错误 2:

Sat Jun 2 03:11:06 2018 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln188] There is no alive server. We can t do failover

错误 3:

Failed to save binary log: Binlog not found from /var/lib/mysql,/var/log/mysql! If you got this error at MHA Manager, please set  master_binlog_dir=/path/to/binlog_directory_of_the_master

原因:mysql 的 binlog 日志目录没有在默认的 /var/log/mysql 下,而是在其他地方,导致目录找不到。
解决办法:在 manager 节点的配置文件中每个节点下制定二进制日志的目录路径。

[server1]
hostname=192.168.199.105
candidate_master=1
master_binlog_dir=/mysql_data/ # 指定二进制日志文件目录

错误 4:

Can t exec  mysqlbinlog : No such file or directory at /usr/local/share/perl5/MHA/BinlogManager.pm line 106.
mysqlbinlog version command failed with rc 1:0, please verify PATH, LD_LIBRARY_PATH, and client options

原因:使用 ssh 连接之后找不到 mysqlbinlog 命令
解决办法:将 /usr/local/mysql-5.6.39/ 目录连接到 /usr/bin 下

[root@mysql-master ~]# ln –s /usr/local/mysql-5.6.39/bin /usr/bin
[root@mysql-slave01 ~]# ln –s /usr/local/mysql-5.6.39/bin /usr/bin
[root@mysql-slave02 ~]# ln –s /usr/local/mysql-5.6.39/bin /usr/bin

(16)启动 MHA

# 前台启动,日志会直接打印在控制台上
[root@mysql-manager app01]# masterha_manager --conf=/etc/masterha/app01.conf
#后台启动
[root@mysql-manager app01]# nohup masterha_manager --conf=/etc/masterha/app01.conf 

(17)验证高可用故障自动转移

# 停止 master 节点的 mysqld 服务
[root@mysql-master ~]# killall mysqld mysqld_safe
#查看原来的两个 slave 节点信息,发现已经有 slave01 被提升为 master 了
mysql  SHOW SLAVE STATUS \G
*************************** 1. row ***************************
 Slave_IO_State: Waiting for master to send event
 Master_Host: 192.168.199.105
 Master_User: repl
 ...
#查看 slave01 的 read_only 属性,发现已经被修改为 OFF 了
mysql  SHOW VARIABLES LIKE  read_only 
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | OFF |
+---------------+-------+

注意:当某一个 master 故障之后,从库提升为主库,原来的 manager 节点上的 manager 服务会自动退出。需要手动重启。
(18)故障的服务器再次恢复时,需要使用”CHANGE MASTER”命令手动将其加入到从节点中
(19)manager 节点启动之后,可以使用 masterha_check_status 命令查看当前的主节点状态信息

[root@mysql-manager ~]# masterha_check_status --conf=/etc/masterha/app01.conf 
 app01 (pid:20582) is running(0:PING_OK), master:192.168.199.105

MHA 的其他用法,如在线主从切换等,可以自行参考官方文档,此处不再介绍。另外还有 MHA 的 manager 节点的自动重启功能,报警功能,故障主机彻底摘除功能等可以通过 shell 脚本实现,后面有时间会继续介绍。

关于“MySQL 高可用运维的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计11197字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)