IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> mysqlMHA服务搭建 -> 正文阅读

[系统运维]mysqlMHA服务搭建

MHA工作原理

在这里插入图片描述1、当master出现故障时,通过对比slave之间I/O线程读取master上的binlog的位置,选择最接近的slave做为新的slave(laster slave)
2、其它slave通过与laster slave对比,生成差异中继日志,并应用
3、在laster slave上应用master保存的binlog,同时将laster slave提升为master
4、最后在其它slave上应用相应的差异中继日志,并开始从新的master开始复制

MHA组件

MHA Manger(管理节点)

MHA Manger可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上

MHA Node(数据节点)

MHA Node运行在每台Mysql服务器上,MHA Manger会定时探测集群中的master节点,当master出现故障时,它可以自动将数据的slave提升为master,然后将所有其他的slave重新指向新的master。

MHA组件简介

MHA Manger

运行一些工具,比如masterha_manager工具实现自动监控MySQL Master和实现master故障切换,其它工具手动实现master故障切换,在线master转移,连接检查。一个manger可以管理多个master-slave集群

MHA Node

部署在所有运行的MySQL的服务器上,无论是master还是slave。有三个作用:
1、保存二进制日志
如果能够访问故障master,会拷贝master的二进制日志
2、应用差异中继日志
从拥有最新数据的slave上生成差异中继日志,然后应用差异日志
3、清除中继日志
在不停止sql线程的情况下删除中继日志

MHA中工具介绍

Manger工具
在这里插入图片描述
Node工具
在这里插入图片描述
MHA部署规划
在这里插入图片描述

搭建高可用架构

1、基本设置(四台服务器)

# systemctl stop NetworkManger
# systemctl disable NetworkManger
# systemctl restart network
# systemctl stop firewalld
# systemctl disable firewalld
# setenforce 0

2、配置yum基础源和epel源

使用阿里云配置

3、配置ssh免密

在所有节点设置主机映射
vim /etc/hosts

192.168.156.10 mgr
192.168.156.20 master
192.168.156.30 slave1
192.168.156.40 slave2

配置免密

[root@mgr ~]# ssh-keygen			#一路回车
[root@mgr ~]# ssh-copy-id master			#分发公钥到master
[root@mgr ~]# ssh-copy-id slave1			#分发公钥到slave1
[root@mgr ~]# ssh-copy-id slave2			#分发公钥到slave2

4、时间同步(四台服务器)

# ntpdate cn.ntp.org.cn

5、部署mysql主从复制环境

master端
vim mysql.sh
这个脚本文件要和MySQL安装包放在一起

#!/bin/bash
yum install libaio -y
tar -zxvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz 		#这里填写的是自己的MySQL版本
mv mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql		#这里填写的是自己的MySQL版本,后面目录为mysql安装目录
useradd -r -s /sbin/nologin mysql
cd /usr/local/mysql
mkdir mysql-files
chown -R  mysql:mysql  /usr/local/mysql
chown 750 /usr/local/mysql
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql &> /root/password.txt
bin/mysql_ssl_rsa_setup --datadir=/usr/local/mysql/data
cp support-files/mysql.server /etc/init.d/mysqld
source /etc/profile

给脚本添加执行权限:chomd +x mysql.sh
设置my.cnf
vim /etc/my.cnf

[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
character-set-server=utf8mb4
log-error=/usr/local/mysql/data/mysqld.log
log-bin=/usr/local/mysql/data/binlog
server-id=20
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency

启动mysql:

[root@master ~]# service mysqld start

进入mysql端(密码在/root/password.txt);

[root@master ~]# mysql -uroot -p

设置一个admin同步账号

修改root用户密码
mysql> set password=password('root'); 
创建一个admin同步账号,密码为admin
mysql> create user 'admin'@'192.168.156.%' identified by 'admin';
给admin账号复制权限
mysql> grant replication slave on *.* to 'slave'@'192.168.156.%';
刷新权限
mysql> flush privileges;

创建一个mha账号(用于后期的MHA监控)

mysql> create user 'mha'@'192.168.156.%' identified by 'mha';
mysql> grant replication slave on *.* to 'mha'@'192.168.156.%';
mysql> flush privileges;

停止mysql

[root@master ~]# service mysqld stop

slave1和slave2端
vim mysql.sh
这个脚本文件要和MySQL安装包放在一起

#!/bin/bash
yum install libaio -y
tar -xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql
useradd -r -s /sbin/nologin mysql
rm -rf /etc/my.cnf
cd /usr/local/mysql
mkdir mysql-files
chown -R mysql:mysql /usr/local/mysql
chown 750 /usr/local/mysql
cp support-files/mysql.server /etc/init.d/mysqld
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile

给脚本添加执行权限:chomd +x mysql.sh
设置my.cnf
vim /etc/my.cnf

[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
socket=/tmp/mysql.sock
character-set-server=utf8mb4
log-error=/usr/local/mysql/data/mysqld.log
relay-log=/usr/local/mysql/data/relaylog
server-id=30
log-bin=/usr/local/mysql/data/binlog
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency
skip-slave-start

同步master于slave端数据一致性

[root@master ~]# rm -f  /usr/local/mysql/data/auto.cnf
[root@master ~]# scp /usr/local/mysql/data slave1:/usr/local/mysql/
[root@master ~]# scp /usr/local/mysql/data slave2:/usr/local/mysql/

slave1slave2端,修改用户权限,否则slave端不能启动mysql

# shown -r mysql:mysql /usr/local/mysql/data

master、slave1、slave2上同时开启MySQL服务

# service mysqld start

slave1和slave2

mysql> change master to master_host='192.168.156.20',master_port=3306,master_user='admin',master_password='admin',master_auto_position=1;
mysql> start slave;
msyql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.156.20
                  Master_User: admin
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000006
          Read_Master_Log_Pos: 234
               Relay_Log_File: relaylog.000002
                Relay_Log_Pos: 361
        Relay_Master_Log_File: binlog.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

看到 Slave_IO_Running和Slave_SQL_Running都为yes表示成功

6、MHA端软件安装

mha-node与mha-manager软件
链接:https://pan.baidu.com/s/1PEZl3vdiu8spB4jq1DanSA
提取码:adbn

在所有节点安装mha-node软件包,在mha管理端安装mha-manager
安装依赖
在所有服务器端口

# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-devel

安装mha-node与mha-manager

[root@mgr ~]# rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
[root@mgr ~]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@master ~]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@slave1 ~]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@slave2 ~]# rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

7、配置admin用户ssh免密

在所有节点创建一个admin用户,密码为admin,用于mha的监控管理

#useradd admin
#echo admin|passwd --stdin admin

设置mha主机与其他主机的admin用户互信免密
mha端

[root@mgr ~]# su - admin
[admin@mgr ~]$ ssh-keygen
[admin@mgr ~]$ ssh-copy-id master
[admin@mgr ~]$ ssh-copy-id slave1
[admin@mgr ~]$ ssh-copy-id slave2

输入密码时,输入的时admin的密码

设置admin的sudo权限
master端

[root@master ~]# vim /etc/sudoers.d/admin
#User_Alias表示具有sudo权限的用户列表;
User_Alias MYSQL_USERS=admin
#Runas_Alias表示用户以什么身份登录
Runas_Alias MYSQL_RUNAS=root
#Cmnd_Alias表示允许执行命令的列表
Cmnd_Alias MYSQL_CMNDS=/sbin/ifconfig,/sbin/arping
#MYSQL_USERS表示
MYSQL_USERS ALL=(MYSQL_RUNAS) NOPASSWD: MYSQL_CMNDS

分发slave1和slave2

[root@master ~]# scp /etc/sudoers.d/admin slave1:/etc/sudoers.d/
[root@master ~]# scp /etc/sudoers.d/admin slave2:/etc/sudoers.d/

master挂载VIP

[root@master ~]# su - admin
[root@master ~]# sudo /sbin/ifconfig ens33:1 192.168.156.200 netmask 255.255.255.0  broadcast 192.168.156.255
[root@master ~]# sudo /sbin/arping -fqc 5 -w 5 -I ens33 -s 192.168.156.200 -U 192.168.156.20
[root@master ~]# ip a
arping: 用来向局域网内的其它主机发送ARP请求的指令,可以用来测试局域网内某个IP是否已经被使用
-f 收到的第一个相应包后退出
-q quite模式,不显示输出
-c 发送指定的count个ARP REQUEST包后停止,如果指定了-w参数,会等待形同数量的ARP REQUEST包,直到超时为止
-w 指定一个超时时间,单位为秒。arping在到达指定时间后退出,无论期间发送或接收了多少包,在这种情况下,arping在发送指定的count(-c)个包后并不会停止,而是等待到超时或发送的count个包都进行了回应后才会退出
-I 指定设备名,用于发送ARP REQUEST包的网络设备的名称
-D 重复地址探测地址,用于检查有没有IP地址冲突,如果没有IP冲突则返回0
-s 设置发送ARP包的IP资源地址
-U 强制的ARP模式更新别的主机上的ARP CACHE列表的本机信息,不需要响应
-h 显示帮助

当看到网卡上出现了两个ip表示已经成功

创建mha相关配置文件
mgr端

[root@mgr admin]# mkdir /etc/mha/
[root@mgr admin]# mkdir -p /data/mha/master/app
[root@mgr admin]# chown -R admin:admin /data/mha

设置mgr配置文件

[root@mgr admin]# vim /etc/mha/app.conf
[server default]
#设置监控用户和密码
user=mha
password=mha
#设置复制环境中的复制用户和密码
repl_user=admin
repl_password=admin
#设置ssh的登录用户名
ssh_user=admin
#设置监控主库,发送ping包的时间间隔,默认3s,尝试三次没有回应的时候自动进行failover
ping_interval=5
#设置mgr的工作目录
manager_workdir=/data/mha/masterha/app
#设置mysql master保存binlog的目录,便于mgr可以找到master的二进制文件
master_binlog_dir=/usr/local/mysql/data
#设置master的pid文件
master_pid_file=/usr/local/mysql/data/master.pid
#设置mysql master在发生切换时保存binlog的目录(在mysql master上创建这个目录)
remote_workdir=/data/mysql/mha
#设置mgr日志文件(mha遇到问题,主要看这个日志)
manager_log=/data/mha/masterha/app/app-mysql.log
#MHA到master的监控之间出现问题,MHA Manger将会尝试从slave1和slave2登录到master上
secondary_check_script=/usr/bin/masterha_secondary_check -s 192.168.156.30 -s 192.168.156.40 --user=admin --port=22 --master_host=192.168.156.20 --master_port=3306
设置手动切换时候的切换脚本
master_ip_failover_script="/etc/mha/master_ip_failover.sh 192.168.156.200 1"
#设置监控的几个信息,candidate_master=1表示可以设置为vip
[server1]
hostname=192.168.156.20
port=3306
candidate_master=1
[server2]
hostname=192.168.156.30
port=3306
candidate_master=1
[server3]
hostname=192.168.156.40
port=3306
candidate_master=1

设置切换脚本

[root@mgr admin]# vim /etc/mha/master_ip_failover.sh
#!/usr/bin/env perl
# Copyright (C) 2011 DeNA Co.,Ltd.
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software

## Note: This is a sample script and is not complete. Modify the script based on your environment.
#!/usr/bin/env perl
#!/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 $gateway = '10.77.133.1';
my $vip  = shift;
#my $bcast = '10.77.133.255';
#my $netmask = '255.255.255.0';
my $interface = 'ens33';
my $key = shift;
my $ssh_stop_vip = "sudo /sbin/ifconfig $interface:$key down";

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 ($@) {
            warn "Got Error: $@\n";
            exit $exit_code;
        }
        exit $exit_code;
    }
    elsif ( $command eq "start" ) {

            print "Enabling the VIP - $vip on the new master - $new_master_host \n";
        };
            exit $exit_code;
    }
    elsif ( $command eq "status" ) {
        print "Checking the Status of the script.. OK \n";
        exit 0;
    }
    else {
        &usage();
        exit 1;
    }
}

    chomp $bcast;
    chomp $gateway;
    my $netmask  = `ssh $ssh_user\@$new_master_host sudo /sbin/ifconfig | grep 'Bcast' | head -1 | awk '{print \$4}' | awk -F":" '{print \$2}'`;
    chomp $netmask;
    my $ssh_start_vip = "sudo /sbin/ifconfig $interface:$key $vip broadcast $bcast netmask $netmask && sudo /sbin/arping -f -q -c 5 -w 5 -I $interface -s $vip  -U $gateway";
    print "=======$ssh_start_vip=================\n";
    `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
    my $ssh_user = "admin";
    print "=======$ssh_stop_vip==================\n";
    `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";
}

给master_ip_failover.sh添加执行权限

[root@mgr mha]# chmod +x /etc/mha/master_ip_failover.sh

检测ssh互信以及mysql主从状态
mgr端

[admin@mgr ~]$ masterha_check_ssh --conf=/etc/mha/app.conf
#如果显示都为ok表示成功
[admin@mgr ~]$ masterha_check_repl --conf=/etc/mha/app.conf
#如果都显示ok表示成功

检查MHA状态,然后运行MHA
mgr端

[admin@mgr ~]$ masterha_check_status --conf=/etc/mha/app.conf
app is stopped(2:NOT_RUNNING).
[admin@mgr ~]$ nohup masterha_manager --conf=/etc/mha/app.conf --remove_dead_master_conf --ignore_last_failover &
[1] 27534
[admin@mgr ~]$ masterha_check_status --conf=/etc/mha/app.conf
app (pid:27534) is running(0:PING_OK), master:192.168.156.20

1)、如果正常,会显示“NOT_RUNNING”,说明MHA监控开启,否则会显示“PING_OK”
2)、用admin用户启动监控,否则会权限拒绝
3)、手动停止监控命令:masterha_stop --conf=/etc/mha/app.conf

8、测试数据

master端

[root@master ~]# yum -y install sysbench
mysql> create database test charset utf8
mysql> grant all on *.* to 'mha'@'localhost' identified by 'mha';
mysql> flush privileges;

向数据库中插入1000条数据,测试数据库的健壮性

[root@master ~]# sysbench /usr/share/sysbench/oltp_read_only.lua  --mysql-host=192.168.156.20  --mysql-port=3306  --mysql-user=mha  --mysql-password=mha  --mysql-socket=/tmp/mysql.sock  --mysql-db=test  --db-driver=mysql  --tables=1  --table-size=10000  --report-interval=10  --threads=128 --time=120 prepare

查看是否插入

mysql> select count(*) from test.sbtest1;
+----------+
| count(*) |
+----------+
|    10000 |
+----------+

9、模拟master服务器故障

mgr端:监控日志

[admin@mgr ~]$ tail -f /data/mha/masterha/app/app-mysql.log

master端

[root@master ~]# service mysqld stop

查看mgr端日志输出:
故障切换
在这里插入图片描述vip漂移
在这里插入图片描述查看漂移到的服务端是否挂载vip
在这里插入图片描述查看从服务端信息
在这里插入图片描述master已经从192.168.156.20漂移到192.168.156.30且 Slave_IO_Running、Slave_SQL_Running都为ok

已经表示成功了

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-11-17 13:09:07  更:2021-11-17 13:10:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 1:39:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码