Mysql MHA搭建

news2024/12/27 15:10:48
.

目录

机器配置

安装Docker

Docker安装和启动Mysql8.0.26

搭建Mysql一主二从

设置三台机器免密访问

安装MHA

搭建问题记录

问题1 MHA验证主从复制报错Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation

问题2 MHA验证主从复制报错Error happened on checking configurations. Redundantt /usr/share/perl5/vendor_perl/MHA/NodeUtil.pm line 201.


机器配置

192.168.146.107

mysql主

node1

虚拟IP为192.168.146.106

192.168.146.108

mysql从

node2

192.168.146.109

mysql从

node3 + manager

系统信息:

为107设置VIP :

安装Docker

安装需要的软件包:yum-utils、device-mapper-persistent-data和lvm2。

yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

设置仓库

使用国内镜像,比如阿里云源镜像

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

安装docker engine,包括docker-ce、docker-ce-cli和containerd.io

yum install docker-ce docker-ce-cli containerd.io

启动docker

systemctl start docker

验证安装是否ok

docker run hello-world

以上操作在三台机器上都执行

Docker安装和启动Mysql8.0.26

拉取镜像

docker pull mysql:8.0.26

创建文件夹用于挂载,放置mysql配置文件和数据

cd /home; mkdir -p mysql && cd $_ && mkdir {conf,data,mysql-files,mysqld,log}
chmod 777 /home/mysql/mysqld

进入conf文件夹创建mysql的配置文件my.cnf ,内容如下
[mysqld]
server_id=306
port=3306
default_authentication_plugin=mysql_native_password
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
symbolic-links=0
explicit_defaults_for_timestamp=true
binlog-ignore-db=mysql
binlog-ignore-db=information_schema

binlog_cache_size=1M
binlog_format=mixed
binlog_expire_logs_seconds=259200
max_binlog_size=500M
slave_skip_errors=1062
log_slave_updates=1
lower_case_table_names=1
log-bin=mysql-bin
replicate-ignore-db=mysql,information_schema
sync_binlog=0
bind-address=0.0.0.0
skip-name-resolve
skip_ssl

auto_increment_offset=1
auto_increment_increment=1

character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake=true

max_connections=1000
innodb-force-recovery=0

gtid-mode=on
enforce-gtid-consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
innodb_flush_log_at_trx_commit=0
relay_log_recovery=1

[client]
port=3306
socket=/var/run/mysqld/mysqld.sock
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4
上述操作在三台机器都执行, 但要注意,三个my.cnf的server_id需要不同

三台服务器启动mysql

docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=ws-123456 \
-v /home/mysql/data:/var/lib/mysql:rw \
-v /home/mysql/mysql-files:/var/lib/mysql-files:rw \
-v /home/mysql/mysqld:/var/run/mysqld:rw \
-v /home/mysql/log:/var/log/mysql:rw \
-v /home/mysql/conf:/etc/mysql:rw \
--name mysql --privileged=true \
-d mysql:8.0.26

进入容器,创建用户

docker exec -it 6f94e362fe6d sh

 执行如下sql

CREATE USER IF NOT EXISTS 'repl'@'%' IDENTIFIED BY 'ws-123456';
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'ws-123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT, SELECT ON *.* TO 'repl'@'%';
flush privileges;

CREATE USER IF NOT EXISTS 'mha'@'%' IDENTIFIED BY 'ws-123456';
ALTER USER 'mha'@'%' IDENTIFIED WITH mysql_native_password BY 'ws-123456';
GRANT all  ON *.* TO 'mha'@'%';
flush privileges;

CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY 'ws-123456';
grant all on *.* to 'root'@'%';
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'ws-123456';
flush privileges;

搭建Mysql一主二从

连接108和109两台从机,执行如下命令,表示107的mysql作为主,启动主从复制

change master to 
master_host='192.168.146.107',
master_port=3306, 
master_user='repl',
master_password='ws-123456',
MASTER_AUTO_POSITION=1;   

start slave;
show slave status;

 测试主从复制是否成功

连接107节点,执行如下sql

CREATE DATABASE IF NOT EXISTS `test` default character set utf8 collate utf8_general_ci;

查看108和109是否已经同步

设置三台机器免密访问

在107节点依次执行如下命令

ssh-keygen -t rsa
ssh-copy-id 192.168.146.108
ssh-copy-id 192.168.146.109

同样在108和109节点依次执行如下命令

108
ssh-keygen -t rsa
ssh-copy-id 192.168.146.107
ssh-copy-id 192.168.146.109

109
ssh-keygen -t rsa
ssh-copy-id 192.168.146.107
ssh-copy-id 192.168.146.108

如下图所示

108:

109:

测试免密登录

在107执行如下

ssh 192.168.146.108

安装MHA

安装依赖

所有服务器都需要安装依赖包

yum -y install epel-release
yum -y install perl-DBD-MySQL perl-DBI

#安装epel-release执行报错Error: Unable to find a match epel,百度之后说是少源,执行下边命令后正常
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
yum -y install ncftp

#执行如果报错Error: Unable to find a match ncftp,执行一下yum -y update,然后再次安装,如果还报错再手动编译安装ncftp
cd /home
wget https://www.ncftp.com/downloads/ncftp/ncftp-3.2.6-src.tar.gz
tar xvf ncftp-3.2.6-src.tar.gz
cd ncftp-3.2.6
./configure && make && make install

安装mha

所有服务器都需要安装

cd /home
wget https://qiniu.wsfnk.com/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

创建mha工作目录

所有服务器执行

mkdir /home/mysql_mha

安装mha监控manager

正常来说应该安装在一个单独的节点,此处为了节约一个节点,就安装在192.168.146.109上

yum -y install epel-release
yum -y install perl-Config-Tiny perl-Time-HiRes perl-Parallel-ForkManager perl-Log-Dispatch perl-DBD-MySQL

#执行如果报错Error: Unable to find a match ,执行一下yum -y update,然后再次安装
wget https://qiniu.wsfnk.com/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

在manager管理机器上配置管理节点

mkdir /etc/mha

vim /etc/mha/mysql_mha.cnf
#内容如下
[server default]
#mha访问数据库的账号与密码
user=mha
password=ws-123456
#指定mha的工作目录
manager_workdir=/home/mysql_mha
#指定管理日志路径
manager_log=/home/mysql_mha/manager.log
#指定mha在远程节点上的工作目录
remote_workdir=/home/mysql_mha
#可以使用ssh登入的用户
ssh_user=root
ssh_port=22
#指定主从复制的mysq用户和密码
repl_user=repl
repl_password=ws-123456
#指定检测间隔时间
ping_interval=1
#指定master节点存放binlog的日志文件的目录
master_binlog_dir=/home/mysql/data
#指定一个脚本,该脚本实现了在主从切换之后,将虚拟ip漂移到新的master上
master_ip_failover_script=/usr/bin/master_ip_failover
#指定用于二次检查节点状态的节点
secondary_check_script=/usr/bin/masterha_secondary_check -s 192.168.146.107 -s 192.168.146.108 -s 192.168.146.109
#配置集群中的节点
[server1]
hostname=192.168.146.107
#指定该节点可以参与master选举
candidate_master=1

[server2]
hostname=192.168.146.108
candidate_master=1

[server3]
hostname=192.168.146.109
##指定该节点不参与master选举 该节点也是监控节点,所以关闭master候选
no_master=1

编写配置文件中的/usr/bin/master_ip_failover脚本

vim /usr/bin/master_ip_failover

#内容如下
#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';

use Getopt::Long;

my (
    $command, $orig_master_host, $orig_master_ip,$ssh_user,
    $orig_master_port, $new_master_host, $new_master_ip,$new_master_port,
    $orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);

# 这里定义的虚拟IP可以根据实际情况进行修改
my $vip = '192.168.146.106/24';
my $key = '1';

# 这里的网卡名称 “ens160” 需要根据你机器的网卡名称进行修改
my $ssh_start_vip = "/sbin/ifconfig ens160:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens160:$key down";
my $ssh_Bcast_arp= "/sbin/arping -I ens160 -c 3 -A 192.168.146.106";

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,
    'orig_master_ssh_port=i' => \$orig_master_ssh_port,
    'new_master_host=s'  => \$new_master_host,
    'new_master_ip=s'    => \$new_master_ip,
    'new_master_port=i'  => \$new_master_port,
    'new_master_ssh_port' => \$new_master_ssh_port,
    'new_master_user' => \$new_master_user,
    'new_master_password' => \$new_master_password

);

exit &main();

sub main {
    $ssh_user = defined $ssh_user ? $ssh_user : 'root';
    print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$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" ) {

        my $exit_code = 10;
        eval {
            print "Enabling the VIP - $vip on the new master - $new_master_host \n";
            &start_vip();
	    &start_arp();
            $exit_code = 0;
        };
        if ($@) {
            warn $@;
            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 \"`;
}
sub stop_vip() {
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}

sub start_arp() {
    `ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {
    print
    "Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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";
}

赋予脚本可执行权限

chmod a+x /usr/bin/master_ip_failover

验证ssh互信配置

masterha_check_ssh --conf=/etc/mha/mysql_mha.cnf

验证mysql主从同步

masterha_check_repl --conf=/etc/mha/mysql_mha.cnf

报错如下

Redundantt /usr/share/perl5/vendor_perl/MHA/NodeUtil.pm line 201.

解决方法见问题记录2,解决之后重新验证成功

07e25f806dfb5e278d4e13829f0c321d.png

启动MHA manager

nohup masterha_manager --conf=/etc/mha/mysql_mha.cnf >/dev/null 2>/dev/null &
ps -ef|grep mha
#检测状态
masterha_check_status --conf=/etc/mha/mysql_mha.cnf 

#关闭mha
masterha_stop --conf=/etc/mha/mysql_mha.cnf 

查看mha监控日志

tail -f /home/mysql_mha/manager.log

测试主从切换

停止master

mha管理节点日志如下

1)判断master下线,准备启动故障转移

2)校验slave配置,移除VIP设置

3)从slave中选择一个master

4)获取新master节点的binlog位点,重新设置VIP

ea0c6a6dd69583a82f7beefaed50c0db.png

 5)将剩余从节点关联到新的master,开始复制,将新master节点slave info 清除

6)本次故障转移的总结报告

注:

1、宕机的原master重新上线后需要手动执行change master to建立主从关系

2、MHA进行一次故障切换之后,进程会退出

 

搭建问题记录

问题1 MHA验证主从复制报错Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation

原因是配置的mha用户需要有root权限(grant all)

问题2 MHA验证主从复制报错Error happened on checking configurations. Redundantt /usr/share/perl5/vendor_perl/MHA/NodeUtil.pm line 201.

百度说是代码里解析mysql版本有问题,修改代码

vi /usr/share/perl5/vendor_perl/MHA/NodeUtil.pm

#找到如下两个方法parse_mysql_version和parse_mysql_major_version,修改代码

#修改前:
#sub parse_mysql_version($) {
#  my $str = shift;
#  my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g );
#  return $result;
#}
#sub parse_mysql_major_version($) {
#  my $str = shift;
#  my $result = sprintf( '%03d%03d', $str =~ m/(\d+)/g );
#  return $result;
#}

#修改后:
sub parse_mysql_version($) {
  my $str = shift;
 ($str) =  $str =~ m/^[^-]*/g;
  my $result = sprintf( '%03d%03d%03d', $str =~ m/(\d+)/g );
  return $result;
}

sub parse_mysql_major_version($) {
  my $str = shift;
  $str =~ /(\d+)\.(\d+)/;
  my $strmajor = "$1.$2";
  my $result = sprintf( '%03d%03d', $strmajor =~ m/(\d+)/g );
  return $result;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

doris - 数仓 拉链表 按天全量打宽表性能优化

数仓 拉链表 按天全量打宽性能优化现状描述优化现状描述 1、业务历史数据可以变更 2、拉链表按天打宽 3、拉链表模型分区字段设计不合理,通用的过滤字段没有作为分区分桶字段 4、拉链表表数据量略大、模型数据分区不合理和服务器资源限制,计算任务执行超…

安装JupyterLab失败的解决方案

由于本人电脑安装的Python版本3.6比较低,所以可能存在下面两种方法都安装失败,最后给出一个简单省事的方法。Jupyter lab比Jupyter Notebook要好用,试了之后感觉跟VSCode一样的存在,所以还是值得安装来代替Jupyter Notebook使用。…

Ae:解释素材

所谓解释素材 Interpret Footage,就是通过修改素材的某些属性(像素长宽比、帧速率、颜色配置文件及 Alpha 通道类型等),让它能更好地参与到合成中去。Ae菜单:文件/解释素材快捷键:Ctrl Alt G在项目面板里…

【C语言】编程初学者入门训练(13)

文章目录121. 小乐乐算最高分122. 小乐乐计算求和123. 小乐乐计算函数124. 小乐乐查找数字125. kiki学程序设计基础126. kiki算期末成绩127. kiki说祝福语128. kiki的最高分129. 求质数的个数130. kiki去重整数并排序121. 小乐乐算最高分 问题描述:小乐乐的老师BoB…

4.2 双点双向路由重发布

1. 实验目的 熟悉双点双向路由重发布的应用场景掌握双点双向路由重发布的配置方法2. 实验拓扑 双点双向路由重发布如图4-6所示: 图4-6:双点双向路由重发布 3. 实验步骤 IP地址的配置R1的配置 <Huawei>system-v…

关键路径、工期、总时差和自由时差精讲

关键路径法是在进度模型中&#xff0c;估算项目最短工期&#xff0c;确定逻辑网络路径进度灵活性大小的一种方法。①计算原理a.计算ES、EF&#xff1a;从网络计划起点节点开始&#xff0c;沿箭线方向依次向前推算&#xff0c;数值取大。b.计算LS、LF&#xff1a;从网络计划终点…

SVFormer:走进半监督动作识别的视觉 Transformer

出品人&#xff1a;Towhee 技术团队 顾梦佳 半监督学习&#xff08;SSL&#xff09;的动作识别是一个关键的视频理解任务&#xff0c;然而视频标注的高成本加大了该任务的难度。目前相关的方法主要研究了卷积神经网络&#xff0c;较少对于视觉 Transformers&#xff08;ViT&…

一个视频说清整个英语语法体系(重塑你的语法认知框架)

前言 绝大多数句子&#xff1a;什么 怎么样 几乎所有的英语句子&#xff1a;主语谓语 广义 “动作”&#xff1a;语法上的“动词” 主语(人或物) 谓语(“动作”发生了什么事情) 有哪些”动作“(动词)&#xff1f; 可以独立完成的动作&#xff1a;不及物动词 [主语不及物…

GEE学习笔记 七十九:【GEE之Python版教程十一】

列表在python中就是使用中括号包围的数据&#xff0c;比如[11,23,10]等。列表&#xff08;list&#xff09;是可变的&#xff0c;同时在python中还有集合&#xff08;set&#xff09;以及元组&#xff08;tuple&#xff09;和这个类似&#xff0c;不要把这些内容搞混。 运行下…

Maven怎样构建生命周期?

项目构建生命周期Maven的本质是一个项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型(POM)。Maven构建生命周期描述的是一次构建过程经历经历了多少个事件。对项目构建的生命周期划分为3套&#xff0c;其中clean负责清理工作&#xff0c;default负责核心工…

Git小乌龟每次推送拉取都弹窗和用户名密码报错(解决办法)

目录 一、小乌龟推送代码到云端用户名和密码报错 &#xff08;一&#xff09; 遇到问题 &#xff08;二&#xff09;解决办法 二、小乌龟每次推送拉取都要输入账号和密码 &#xff08;一&#xff09;遇到问题 &#xff08;二&#xff09;解决办法 一、小乌龟推送代码到云…

AlphaGo 和 ChatGPT有何相似之处? 附AlphaGo核心算法开源链接

AlphaGo 和 ChatGPT 是迄今为止最著名、最具开创性的两个 AI 系统之一。尽管它们被设计用于不同的目的&#xff0c;但它们共享一些重要的相似之处&#xff0c;包括使用深度学习、神经网络以及专注于达到人类水平表现等。而不久前&#xff0c; DeepMind 悄悄开源了AlphaGo的核心…

在windows安装MySQLworkbench

跑到官网安装MySQL :: MySQL Downloads select MySQL community server Recommended Download download the first installer here just start my download let’s open it and agree with the license agreement 安装&#xff0c;一直点next点到Account and Rolse 自己定密码…

C++学习笔记-变量类型

变量为我们提供了程序可以操作的命名存储。 C 中的每个变量都有一个特定的类型&#xff0c;它决定了变量内存的大小和布局; 可存储在该内存中的值范围; 以及可以应用于变量的操作集。 变量的名称可以由字母&#xff0c;数字和下划线字符组成。 它必须以字母或下划线开头。 大写…

【C语言每日一题】——倒置字符串

【C语言每日一题】——倒置字符串&#x1f60e;前言&#x1f64c;倒置字符串&#x1f64c;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xff01;&#xff01; &#x1f60a;作者简…

基于蜣螂算法改进的LSTM分类算法-附代码

基于蜣螂算法改进的LSTM分类算法 文章目录基于蜣螂算法改进的LSTM分类算法1.数据集2.LSTM模型3.基于蜣螂算法优化的RF4.测试结果5.Matlab代码摘要&#xff1a;为了提高LSTM数据的分类预测准确率&#xff0c;对LSTM中的参数利用蜣螂搜索算法进行优化。1.数据集 数据的来源是 UC…

让我们,从头到尾,通透I/O模型

什么是IO 一句话总结 IO就是内存和硬盘的输入输出 I/O 其实就是 input 和 output 的缩写&#xff0c;即输入/输出。 那输入输出啥呢&#xff1f; 比如我们用键盘来敲代码其实就是输入&#xff0c;那显示器显示图案就是输出&#xff0c;这其实就是 I/O。 而我们时常关心的磁盘…

网络层重点协议之IP协议(IPv4)

网络层的作用就是来路由的选择&#xff0c;规划传输的路径&#xff0c;其中网络层的重点协议就是IP协议。4位版本号版本号的取值只有4和64位首部长度描述了IP报头有多长&#xff0c;报头中有一个选项部分&#xff0c;是变长的&#xff0c;是可有可无的部分&#xff0c;所以IP报…

【python百炼成魔】python之列表详解

文章目录一. 列表的概念1.1 列表是什么&#xff1f;1.2 为什么要使用列表&#xff1f;1.3 列表的定义二. 列表的增删改查操作2.1 列表的读取2.2 列表的切片2.3 列表的查询操作2.3.1 not in ,in 表达式2.3.2 列表元素遍历2.4 列表元素的增加操作2.4.1 append()的相关用法2.4.2 e…

Webpack(应用一:基本使用,只需六步骤)

前言 上一篇文章已经说明了webpack的定义以及需求 本偏文章主要讲解webpack的基本使用 tips&#xff1a;现在以vscode编辑器来展示&#xff0c;只需要几个步骤就可以实现webpack的基本使用。 一、首先要安装node.js 1、不会安装node.js的&#xff0c;可以在网上自己找教程来…