生产环境的常用的MHA,解决读写分离主服务器的单点故障

作者:神秘网友 发布时间:2020-10-22 10:33:07

生产环境的常用的MHA,解决读写分离主服务器的单点故障

生产环境的常用的MHA,解决读写分离主服务器的单点故障
  • 只有一台主服务器负责写入
  • 存在单点故障点
    生产环境的常用的MHA,解决读写分离主服务器的单点故障
  • MHA (MasterHigh Availability)E前在MySQL高可用方面是一个相对成熟的解决方案,它由日本 DeNA公youshimaton(现就职于Facebook公司)开发的
  • —套优秀的MySQL高可用环境下故障切换和主从复制的软件
  • MySQL故障过程中,MHA能做到O-30秒内自动完成故障切换
  • 并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
  • MHA Manager (管理节点)
  • MHA Node (数据节点)
  • 自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
  • 使用半同步复制,可以大大降低数据丢失的风险
  • 目前MHA支持一主多从架构,最少三台服务,即一主两从

MHA 由两部分组成:MHA Manager(管理节点)和 MHA Node(数据节点)。MHA Manager可以独立部署在一台独立的机器上管理多个Master-Slave集群,也可以部署在一台Slave上。当 Master 出现故障是,它可以自动将最新数据的Slave 提升为新的 Master,然后将所有其他的 Slave 重新指向新的 Master。整个故障转移过程对应用程序是完全透明的。

原公司使用的是mysql数据库,因业务的需要进行读写分离,假设共有三台服务器,一台服务器可以在上面写入数据,还有俩台服务器可以读。因为只有一台服务器写入,那存在单点故障,处于安专考虑,那公司需要加入一台作为备用的写入,当主服务器发生故障时,备用服务器会直接顶

主机操作系统主机名和地址工作的内容
服务器CentOS7.6manager/20.0.0.38管理节点,管理节点,在其安装manager组件及node组件
服务器CentOS7.6mysql 1/20.0.0.30Master节点,安装node组件
服务器CentOS7.6mysql 2/20.0.0.31Slave节点,安装node组件
服务器CentOS7.6mysql 2/20.0.0.33Slave节点,安装node组件

在实验开始前我们首先要对主从三台服务器安装mysql数据库,这边就不在演示安装数据库的过程,如果有不清楚的小伙伴,可以看下我之前的博客,写的很详细。

  1. 修改 Master 的主配置文件/etc/my.cnf 文件,三台服务器的 server-id 不能一样
    [[email protected] ~]# vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates = true

配置从服务器:
[[email protected] ~]# vim /etc/my.cnf

server-id = 2 
log_bin = master-bin
relay-log = relay-log-bin 
relay-log-index = slave-relay-bin.index 

[[email protected] ~]# vim /etc/my.cnf

server-id = 3
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index

2.Mysql1、Mysql2、Mysql3 三台主机上分别做两个软链接

[[email protected] ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
目标是让命令能让系统能够识别

[[email protected] ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
让二进制文件能在任何路径下别识别

3.Mysql1、Mysql2、Mysql3 启动 MySQL

[[email protected] ~]# /usr/local/mysql/bin/mysqld_safe --user=mysql &

4.在所有数据库节点上授权两个用户,一个是从库同步使用,另外一个是 manager 使用。也就是三台主从服务器上都要进行以下俩条授权

mysql> grant replication slave on . to ‘myslave’@‘20.0.0.%’ identified by ‘123456’;
从库同步使用

mysql> grant all privileges on . to ‘mha’@‘192.168.195.%’ identified by ‘manager’;
MHA管理账户使用的

mysql> flush privileges;
刷新

4.1 然后在主服务器上查看二进制文件和同步点
mysql> show master status;

+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |     1166 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+

5.接下来在 Mysql2 和 Mysql3 分别执行同步。

mysql> change master to master_host=‘20.0.0.30’,master_user=‘myslave’,master_password=‘123456’,master_log_file=‘master-bin.000001’,master_log_pos=1166;
去连接主机,后面都是跟的主机上的一些属性

mysql> start slave;
开启同步

  1. 查看 IO 和 SQL 线程都是 yes 代表同步是否正常。

mysql> show slave status\G;
\G表示竖向查看,不加\G的话是横向的,看的不直观

生产环境的常用的MHA,解决读写分离主服务器的单点故障
然后必须设置两个从库为只读模式:

mysql> set global read_only=1;

[[email protected] ~]# yum install epel-release --nogpgcheck

然后安装前置环境

yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

注意:所有服务器>上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件,下面都是在 Mysql1 上操作演示安装 node 组件。

[[email protected] ~]# tar zxvf mha4mysql-node-0.57.tar.gz
[[email protected] ~]# cd mha4mysql-node-0.57
[[email protected] mha4mysql-node-0.57]# perl Makefile.PL
[[email protected] mha4mysql-node-0.57]# make
[[email protected] mha4mysql-node-0.57]# make install

[[email protected] ~]# tar zxvf mha4MHA-manager-0.57.tar.gz
[[email protected] ~]# cd mha4MHA-manager-0.57
[[email protected] mha4MHA-manager-0.57]# perl Makefile.PL
[[email protected] mha4MHA-manager-0.57]# make
[[email protected] mha4MHA-manager-0.57]# 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

生产环境的常用的MHA,解决读写分离主服务器的单点故障
4. node 安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHA
Manager 的脚本触发,无需人为操作)主要如下:
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)
生产环境的常用的MHA,解决读写分离主服务器的单点故障
5. 配置无密码认证

  1. 在 manager 上配置到所有数据库节点的无密码认证
    [[email protected] ~]# ssh-keygen -t rsa //一路按回车键
    [[email protected] ~]# ssh-copy-id 20.0.0.30
    [[email protected] ~]# ssh-copy-id 20.0.0.31
    [[email protected] ~]# ssh-copy-id 20.0.0.33

  2. 在 Mysql1 上配置到数据库节点Mysql2和Mysql3的无密码认证
    [[email protected] ~]# ssh-keygen -t rsa
    [[email protected] ~]# ssh-copy-id 20.0.0.31
    [[email protected] ~]# ssh-copy-id 20.0.0.33

  3. 在 Mysql2 上配置到数据库节点Mysql1和Mysql3的无密码认证
    [[email protected] ~]# ssh-keygen -t rsa
    [[email protected] ~]# ssh-copy-id 20.0.0.30
    [[email protected] ~]# ssh-copy-id 20.0.0.33

  4. 在 Mysql3 上配置到数据库节点Mysql1和Mysql2的无密码认证
    [[email protected] ~]# ssh-keygen -t rsa
    [[email protected] ~]# ssh-copy-id 20.0.0.30
    [[email protected] ~]# ssh-copy-id 20.0.0.31

生产环境的常用的MHA,解决读写分离主服务器的单点故障

[[email protected] ~]# cp -ra /root/mha4MHA-manager-0.57/samples/scripts /usr/local/bin
拷贝后会有四个执行文件

[[email protected] ~]# ll /usr/local/bin/scripts/

生产环境的常用的MHA,解决读写分离主服务器的单点故障

[[email protected] ~]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

  1. 修改内容如下:(删除原有内容,直接复制)
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';

use Getopt::Long;

my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
#############################添加内容部分#########################################
my $vip = '20.0.0.200';   这是虚拟的ip地址
my $brdc = '20.0.0.255';   这是子网掩码,这俩句是最重要的
my $ifdev = 'ens33';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
my $exit_code = 0;
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);

exit &main();

sub main {

print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

if ( $command eq "stop" || $command eq "stopssh" ) {

my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ([email protected]) {
warn "Got Error: [email protected]\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {

my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ([email protected]) {
warn [email protected];
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}

sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}


[[email protected] ~]# mkdir /etc/masterha
[[email protected] ~]# cp /root/mha4MHA-manager-0.57/samples/conf/app1.cnf /etc/masterha
[[email protected] ~]# vim /etc/masterha/app1.cnf

[server default]
manager_log=/var/log/masterha/app1/manager.log  #manager日志
manager_workdir=/var/log/masterha/app1   ##manager工作目录
master_binlog_dir=/usr/local/mysql/data  #master保存binlog的位置,这里的路径要与master里配置的binlog的路径一致,以便mha能找到
master_ip_failover_script=/usr/local/bin/master_ip_failover #设置自动failover时候的切换脚本
master_ip_online_change_script=/usr/local/bin/master_ip_online_change  #设置手动切换时候的切换脚本
password=manager   #设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
ping_interval=1    #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
remote_workdir=/tmp   #设置远端mysql在发生切换时binlog的保存位置
repl_password=123456   #设置复制用户的密码
repl_user=myslave   #设置复制用户的用户
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.31 -s 20.0.0.33
shutdown_script=""
ssh_user=root   #设置ssh的登录用户名
user=mha     #设置监控用户root

[server1]
hostname=20.0.0.30
port=3306

[server2]
candidate_master=1  #//设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
check_repl_delay=0  #默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master

hostname=20.0.0.31
port=3306

[server3]
hostname=192.168.195.131
port=20.0.0.33

[[email protected] ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf

生产环境的常用的MHA,解决读写分离主服务器的单点故障
[[email protected] ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf

生产环境的常用的MHA,解决读写分离主服务器的单点故障
第一次配置虚拟ip需要去主服务器20.0.0.30的主机上手动开启
[[email protected] ~]# /sbin/ifconfig ens33:1 20.0.0.200/24

[[email protected] ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
[1] 129929

如果想检测可以用 jobs 查看

注释:
–remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
–manger_log 日志存放位置。
–ignore_last_failover 在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover,之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下,MHA 发生切换后会在日志记目录,也就是上面设置的日志 app1.failover.complete 文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为–ignore_last_failover。

在主库上:
pkill mysqld
可以看到从库的状态,用ifcinfig命令会发现之前虚拟ip地址在主服务器上的,现在是漂移到从服务器上了

生产环境的常用的MHA,解决读写分离主服务器的单点故障相关教程

  1. MySQL环境配置和入门讲解!

    MySQL环境配置和入门讲解! ↑↑↑关注后星标Datawhale 每日干货每月组队学习,不错过 Datawhale干货 作者:皮钱超,厦门大学,Datawhale原创作者 本文 约3000字 ,建议 阅读9分钟 审稿人:杨煜,Datawhale成员,就职于毕马威,从事数据分析工作。 本文中介绍

  2. 搭建我的网站的mobile版的开发环境

    搭建我的网站的mobile版的开发环境 2019独角兽企业重金招聘Python工程师标准 image.png 之前我已经搭建过一个开发移动web的react开发环境,在那时我就已经想把我的极客教程弄一个手机上体验好的web app,无奈公司业务太多,整天忙着赶项目,下班回去的时候疲

  3. springboot kafka2.x 生产者同步发送异步发送说明

    springboot kafka2.x 生产者同步发送异步发送说明 文章目录 一、前言 1.1 结论 2.1 对比 二、案例 2.1 依赖 2.2 直接摆出案例 2.3 小结,kafka的 send 都是异步发送,调用get()实现同步 三、题外话 3.1 message.max.bytes 3.2 max.request.size 3.3 文件转bas

  4. hadoop在Linux中的安装步骤及开发环境搭建

    hadoop在Linux中的安装步骤及开发环境搭建 目录 安装jdk 伪分布式模式安装 maven部署 所有的大数据工具的操作都必须通过普通用户来执行,创建一个用户名为:fuyun 创建安装所需文件夹 sudo mkdir -p /opt/tools/ #创建文件夹/opt/tools 存储安装包sudo mkdir

  5. win下eclipse+yougatoo+cygwin+jlink交叉编译环境搭建

    win下eclipse+yougatoo+cygwin+jlink交叉编译环境搭建 2019独角兽企业重金招聘Python工程师标准 1 安装交叉编译工具 这里选用yagarto(yagarto-bu-2.21_gcc-4.6.2-c-c++_nl-1.19.0_gdb-7.3.1_eabi_20111119.exe). 安装完毕之后将bin路径添加到系统环境变量Path

  6. Maven环境配置+Struts2环境配置+Hibernate环境配置

    Maven环境配置+Struts2环境配置+Hibernate环境配置 Maven环境配置+Struts2环境配置+Hibernate环境配置 现在Struts2与Hibernate已逐渐没落; 此文只是是为了方便博主和博主的朋友所写的简单配置,其中的具体原理与代码使用,在此不做详解 目录 Maven环境配置+S

  7. RocketMQ--生产者消息发送

    RocketMQ--生产者消息发送 异步发消息 // 2.2 异步发送消息//producer.send(message, new SendCallback() {////rabbitmq急速入门的实战: 可靠性消息投递//@Override//public void onSuccess(SendResult sendResult) {//System.err.println(msgId: + sendResul

  8. 一步步教你如何看Spring源码,含环境搭建(已解决各种下载慢的问

    一步步教你如何看Spring源码,含环境搭建(已解决各种下载慢的问题) 一、环境搭建: 1、安装新版gradle和idea工具,并给gradle配置环境变量(百度搜吧,到处都是) 2、打开Idea,通过“version control”,在URL中输入:https://gitee.com/shark1357/Spring-Fra