MHA 实践

Posted vzhangxk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MHA 实践相关的知识,希望对你有一定的参考价值。

mysql mha简介

MHA (Master Hight Availability) 是目前在Mysql高可用方面一个相对成熟的解决方案,也是在Mysql高可用环境下故障切换和主从提升的常用软件。在Mysql 故障切换过程中,MHA 能极短时间内自动完成数据库的故障切换操作。

MHA软件由两部分组成:MHA manager(管理节点)和MHA node(数据节点)。MHA manager会定时探测集群中的master节点,当master出现故障时,它可以自动将有最新数据的slave提升为新的master,然后所有其他的slave指向新的master。

MHA软件由两部分组成:Manager工具包和Node工具包,MHA 安装完成后,服务器上会自动生成如下脚本。具体说明如下:

MHA Manager:

1. masterha_check_ssh:检查MHA的SSH配置状况

2. masterha_check_repl:检查MySQL的复制状况

3. masterha_manager:启动MHA

4. masterha_check_status:检测当前MHA运行状态

5. masterha_master_monitor:检测master是否宕机

6. masterha_master_switch:控制故障转移(自动或手动)

7. masterha_conf_host:添加或删除配置的server信息

8. masterha_stop:关闭MHA

 

MHA Node:

save_binary_logs:保存或复制master的二进制日志

apply_diff_relay_logs:识别差异的relay log并将差异的event应用到其它slave中

filter_mysqlbinlog:去除不必要的ROLLBACK事件(MHA已不再使用这个工具)

purge_relay_logs:消除中继日志(不会堵塞SQL线程)

另有切换告警的几个脚本需自定义:

1. master_ip_failover:管理VIP

2. master_ip_online_change:

3. masterha_secondary_check:当MHA manager检测到master不可用时,通过masterha_secondary_check脚本来进一步确认,减低误切的风险。

4. send_report:当发生故障切换时,可通过send_report脚本发送告警信息。

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集中必须最少有3台数据服务器,一主二从,即一台充当master,一台充当备库,一台充当从库。

2 mha安装配置规划

安装前环境准备:

IP

端口

路径

mysql版本

mha角色

用途

需要安装软件

192.168.56.121

13306

/usr/local/

5.7.25

mha-node

master主节点

(数据节点)

mha4mysql-node-0.56-0.el6.noarch.rpm

192.168.56.130

13306

/usr/local/

5.7.25

mha-node+mha-manager

slave从库

(管理节点)

mha4mysql-node-0.56-0.el6.noarch.rpm+mha4mysql-manager-0.56-0.el6.noarch

192.168.56.122

13306

/usr/local/

5.7.25

mha-node

slave从库

(数据节点)

mha4mysql-node-0.56-0.el6.noarch.rpm

3 Mysql5.7安装(一主两从安装)

下载mysql-5.7.25-linux-glibc2.12-x86_64.tar安装包上传服务器对应安装目录/usr/local

3.1 创建用户

 [root@hdp-01 ~]# groupadd mysql

[root@hdp-01 ~]# useradd -g mysql  mysql

3.2 创建目录

 [root@hdp-01 /]# mkdir -pv /app/mysql_gtid/

3.3 安装

[root@mysql opt]# cd /usr/local/

[root@mysql local]# tar -xvf mysql-5.7.25-linux-glibc2.12-x86_64.tar

mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz

mysql-test-5.7.25-linux-glibc2.12-x86_64.tar.gz

[root@mysql local]# tar -zxvf mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz

解压缩后,建软链接

[root@mysql local]# ln -s mysql-5.7.25-linux-glibc2.12-x86_64  mysql

[root@mysql mysql]# chown mysql:mysql -R /usr/local/mysql

[root@mysql mysql]# chown mysql:mysql -R /app/mysql_gtid/

修改mysql配置文件,主节点配置文件

[root@mysql ~]# vi /etc/my.cnf

[root@mysql ~]# cat /etc/my.cnf

[client]

socket = /app/mysql_gtid/mysql.sock

[mysqld]

port=13306

character_set_server=utf8

basedir=/usr/local/mysql

datadir=/app/mysql_gtid

socket=/app/mysql_gtid/mysql.sock

log-error=/app/mysql_gtid/mysqld.log

pid-file=/app/mysql_gtid/mysqld.pid

lower_case_table_names = 1

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

max_connections=5000

default-time_zone = ‘+8:00‘

gtid_mode=ON

enforce-gtid-consistency=ON

binlog_format=row

log-bin=/app/mysql_gtid/mysql-bin

master-info-repository=TABLE

relay-log-info-repository=TABLE

server-id=1313306

从节点my.cnf配置文件:

[root@weblogic ~]# cat /etc/my.cnf

[client]

socket = /app/mysql_gtid/mysql.sock

[mysqld]

port=3306

character_set_server=utf8

basedir=/usr/local/mysql

datadir=/app/mysql_gtid

socket=/app/mysql_gtid/mysql.sock

log-error=/app/mysql_gtid/mysqld.log

pid-file=/app/mysql_gtid/mysqld.pid

lower_case_table_names = 1

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

max_connections=5000

default-time_zone = ‘+8:00‘

gtid_mode=ON

enforce-gtid-consistency=ON

log_slave_updates=ON

skip-slave-start=1

binlog_format=row

log-bin=/app/mysql_gtid/mysql-bin

server-id=1303306

mysql初始化:

[root@mysql etc]# /usr/local/mysql/bin/mysqld --initialize  --basedir=/usr/local/mysql --datadir=/app/mysql_gtid   --user=mysql  --explicit_defaults_for_timestamp

密码:root@localhost: k5h%h9#15ffA

启动msyql:

[root@mysql support-files]# cp /usr/local/mysql/support-files/mysql.server   /etc/init.d/mysqld

[root@mysql mysql]# /etc/init.d/mysqld  start

Starting MySQL.Logging to ‘/app/mysql/mysql.err‘.

 SUCCESS!

[root@mysql  ~]# mysql -uroot -pk5h%h9#15ffA

mysql: [Warning] Using a password on the command line interface can be insecure.

ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘ (2)

[root@mysql ~]# find /app   -name mysql.sock

/app/mysql/mysql.sock

建立软链接解决报错问题。

[root@mysql ~]# ln -s /app/mysql/mysql.sock  /tmp/mysql.sock

[root@mysql ~]#

[root@mysql ~]# mysql -uroot -pk5h%h9#15ffA

mysql: [Warning] Using a password on the command line interface can be insecure.

Welcome to the MySQL monitor.  Commands end with ; or g.

Your MySQL connection id is 2

Server version: 5.7.25-log

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type ‘help;‘ or ‘h‘ for help. Type ‘c‘ to clear the current input statement.

mysql> show databases;

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

mysql> set password=‘mysql123‘;

Query OK, 0 rows affected (0.01 sec)

mysql> alter user ‘root‘@‘localhost‘ password expire never;

Query OK, 0 rows affected (0.03 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.01 sec)

3.4 主服务器上建立帐户并授权

mysql>  GRANT REPLICATION SLAVE ON *.* to ‘mysync‘@‘%‘ identified by ‘Mq_12345!6‘;

Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

3.5 从服务器上开启同步数据

mysql>change master to master_host=‘192.168.56.121‘,master_user=‘mysync‘,master_password=‘Mq_12345!6‘,master_port=13306, master_auto_position=1;

mysql> start slave;

Query OK, 0 rows affected (0.01 sec)

通过slave的状态信息,可以看到GTID的值、Matser_UUID等信息,出现这两个yes。表示一主两从同步配置成功。

4 配置三台服务器节点SSH互信

MHA集群中的各节点彼此之间均需要基于ssh互信互通,以实现远程控制及数据管理功能。

1)打开ssh配置文件,启用以下选项

RSAAuthentication yes     #允许RSA认证

PubkeyAuthentication yes  #允许公钥认证

AuthorizedKeysFile      .ssh/authorized_keys   #公钥存放地址

PermitRootLogin yes    #如果要以root身份ssh互信登陆

2)# 生成公钥并分发其他服务器

ssh-keygen -t rsa   连续回车

 技术图片

 技术图片

 技术图片

2)#将公钥添加到认证文件,并将认证文件整合在一个文件。

[root@pxc3 ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

#设置authorized_keys的访问权限:

[root@pxc3 ~]#chmod 600 ~/.ssh/authorized_keys

[root@pxc3 ~]# ssh 192.168.56.121  cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
[root@pxc3 ~]# ssh 192.168.56.130  cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

3)# 分发整合后的公钥文件到其它节点

scp ~/.ssh/authorized_keys 192.168.56.121:~/.ssh/
scp ~/.ssh/authorized_keys 192.168.56.130:~/.ssh/

[root@pxc3 ~]# scp ~/.ssh/authorized_keys 192.168.56.121:~/.ssh/

root@192.168.56.121‘s password:

authorized_keys                                                                                                                               100% 1173     1.2KB/s   00:00    

[root@pxc3 ~]# scp ~/.ssh/authorized_keys 192.168.56.130:~/.ssh/

root@192.168.56.130‘s password:

authorized_keys                                                                                                                                           100% 1173     1.2KB/s   00:00    

[root@pxc3 ~]#

4)# 测试时,第一次,需要输入密码,之后就不需要输入密码了。

在122 pxc3 测试其他2个节点ssh 互信连通性

[root@pxc3 ~]# ssh  192.168.56.130

[root@pxc2 ~]# ssh  192.168.56.121

在121 pxc1 测试其他2个节点ssh 互信连通性

[root@pxc1 ~]# ssh 192.168.56.122

[root@pxc3 ~]# ssh 192.168.56.130

在130pxc2 测试其他2个节点ssh 互信连通性

[root@pxc2 ~]# ssh 192.168.56.121

[root@pxc1 ~]# ssh 192.168.56.122

以上验证说明ssh 互信免密登陆配置完成。

5 部署MHA软件

以下是部署MHA高可用的具体操作步骤:

5.1 安装所需依赖

安装最新的阿里云的EPEL源

 wget -O /etc/yum.repos.d/CentOS-Base.repo  http://mirrors.aliyun.com/repo/Centos-6.repo

wget -O /etc/yum.repos.d/epel-6.repo  http://mirrors.aliyun.com/repo/epel-6.repo

[root@pxc2 ~]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

error: Failed dependencies:

perl(Config::Tiny) is needed by mha4mysql-manager-0.56-0.el6.noarch

perl(Log::Dispatch) is needed by mha4mysql-manager-0.56-0.el6.noarch

perl(Log::Dispatch::File) is needed by mha4mysql-manager-0.56-0.el6.noarch

perl(Log::Dispatch::Screen) is needed by mha4mysql-manager-0.56-0.el6.noarch

perl(Parallel::ForkManager) is needed by mha4mysql-manager-0.56-0.el6.noarch

perl(Time::HiRes) is needed by mha4mysql-manager-0.56-0.el6.noarch

#yum clean all

#yum update

yum -y install  perl-Config-Tiny

yum -y install  perl-Log-Dispatch

yum -y install  perl-Parallel-ForkManager

yum -y install  perl-Time-HiRes

如果不能访问外网的环境,需要分别下载对应操作系统所依赖的rpm包。

登录网址http://rpm.pbone.net/

下载perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm

和perl-Parallel-ForkManager-0.7.5-2.2.el6.rf.noarch.rpm、

perl-Time-HiRes-1.9724-1.el6.rfx.x86_64.rpm、perl-Config-Tiny-2.20-1.3.noarch.rpm等。

5.2 安装管理节点

 技术图片

5.3 安装node节点

[root@pxc1 ~]# rpm -ivh  mha4mysql-node-0.56-0.el6.noarch.rpm

Preparing...                ########################################### [100%]

   1:mha4mysql-node         ########################################### [100%]

[root@pxc2 ~]# rpm -ivh  mha4mysql-node-0.56-0.el6.noarch.rpm

Preparing...                ########################################### [100%]

   1:mha4mysql-node         ########################################### [100%]

[root@pxc3 ~]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

Preparing...                ########################################### [100%]

   1:mha4mysql-node         ########################################### [100%]

[root@pxc3 ~]#

5.4 配置mha管理账号

 技术图片

122、130节点同样执行授权建用户语句。

5.5 配置mha配置文件

[root@pxc2 conf]# vim mha.cnf

[server default]

user=mha

password=My_hA!0713

ping_interval=2

ssh_user=root

manager_workdir=/opt/mha/work/mha.log

manager_log=/opt/mha/log/mha.log

master_binlog_dir=/opt/mha/mha_binglog/

repl_user=mysync

repl_password=q123456

[server1]

hostname=pxc1

port=13306

[server2]

hostname=pxc2

port=13306

[server3]

hostname=pxc3

port=13306

在server default中的配置,是三台机器共同的配置。

5.6 检测mha配置

5.6.1 检测SSH登陆

 技术图片

 5.6.2 检测当前主从同步状态

检测主从同步状态发现报错1045 Access ,mha用户登录失败所致的。应该是建用户mha有问题,更正如下:

 技术图片

 技术图片

 依然有报错如下:

 技术图片

 所有的从节点要有相同的复制规则,检查2个slave 节点my.cnf配置文件,配置文件修改成一致。还是有报错。

 技术图片

 在所有数据节点上都创建软连接:

[root@pxc2 log]#  ln -s  /usr/local/mysql/bin/mysqlbinlog  /usr/bin/mysqlbinlog

[root@pxc2 log]#  ln  -s  /usr/local/mysql/bin/mysql   /usr/bin/mysql

问题解决,主从同步状态检测成功。

[root@pxc2 log]# masterha_check_repl   --conf=/opt/mha/conf/mha.cnf

 技术图片

 5.7 启动mha服务

[root@pxc2 ~]# masterha_manager  --conf=/opt/mha/conf/mha.cnf

Sun Jun 21 22:37:08 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Sun Jun 21 22:37:08 2020 - [info] Reading application default configuration from /opt/mha/conf/mha.cnf..

Sun Jun 21 22:37:08 2020 - [info] Reading server configuration from /opt/mha/conf/mha.cnf..

 技术图片

    mha监控识别到当前主节点是192.168.56.121 pxc1 节点。

6 mha故障转移测试验证

当前主库pxc1(192.168.56.121) :

 技术图片

 6.1  手工在线切换

在线切换步骤:

1. 关闭MHA监控

技术图片

 2、在线切换

  masterha_master_switch  --conf=/opt/mha/conf/mha.cnf  --master_state=alive --new_master_host=192.168.56.122 --new_master_port=13306 --orig_master_is_new_slave --running_updates_limit=10000

orig_master_is_new_slave是将原master切换为新主的slave ;

running_updates_limit 默认为1s,即如果主从延迟时间(Seconds_Behind_Master),或master show processlist中dml操作大于1s,则不会执行切换。

注意此处的new_master_host 要使用主机名,不要使用IP地址。否则会报如下错误:

 技术图片

 使用主机名继续切换:

masterha_master_switch  --conf=/opt/mha/conf/mha.cnf  --master_state=alive --new_master_host=pxc3 --new_master_port=13306 --orig_master_is_new_slave --running_updates_limit=10000

 技术图片

  技术图片

 技术图片

 技术图片

6.2  在线自动切换

1、编辑自动切换perl脚本

 技术图片

 技术图片 

2、修改mha配置文件

修改当前mha.conf文件,指定自动切换脚本路径。

 技术图片

 3、在当前master节点上绑定vip

/sbin/ifconfig eth0:0 192.168.56.100  netmask 255.255.255.0  up

 技术图片

 4、模拟主库宕机pxc1

 技术图片

 5、查看vip漂移情况,查看tail -fn20 mha.log

 技术图片

 技术图片

 技术图片

Disabling the vip on old master pxc1(192.168.56.121),vip 在new master pxc2 上启用。

6、查看管理节点MHA切换日志

 技术图片

技术图片

Master failover to pxc2(192.168.56.130)

7、查看mha自动切换后的主从同步关系

 技术图片

 可以看到,192.168.56.130成为新的master,192.168.56.122也自动指向了这个新的master节点。

以上是关于MHA 实践的主要内容,如果未能解决你的问题,请参考以下文章

MHA 实践

MySQL MHA应用实践(基础知识)

MySQL MHA应用实践(方案实战)

Mha-Atlas-MySQL高可用方案实践

项目课---Mha-Atlas-MySQL高可用方案实践

(项目六)Mha-Atlas-MySQL高可用方案实践