centos7.4搭建MySQL-MHA集群

本次测验实现的是centos7.4+MySQL8.0-mha,为啥是8.0,其实和5.7搭建没啥区别,之前用5.7也实现了,后来DBA老大哥说,用8.0来试试吧,8.0有聚合函数,所以我又重新搭成了8.0版本的mha,本身配置并无区别;由于个人测试机有限,本次实现是在docker容器里搭建的,虽说是容器,但从centos7.4基础镜像开始搭建服务,并指定独立IP和端口,实现配置和物理机并无差异...
摘要由CSDN通过智能技术生成

本次测验实现的是centos7.4+MySQL8.0-mha,为啥是8.0,其实和5.7搭建没啥区别,之前用5.7也实现了,后来DBA老大哥说,用8.0来试试吧,8.0有聚合函数,所以我又重新搭成了8.0版本的mha,本身配置并无区别;

由于个人测试机有限,本次实现是在docker容器里搭建的,虽说是容器,但从centos7.4基础镜像开始搭建服务,并指定独立IP和端口,实现配置和物理机并无差异。


实现MHA的原理,度娘谷歌bing上都很多,不做说明,这里主要纪录搭建过程即分享一些报错时处理方法。

实现mha条件:

1、各个节点机器(不管是管理的manager机器还是nodeMySQL服务机器)都要打通SSH免密登陆;

2、在MySQL运行的node机器节点上要先搭建好主从结构集群(配置文件中还要开启半同步复制)

3、安装mha管理工具(分别在manager管理机器上安装manager+node工具包,MySQL机器上安装node工具包)

4、检查、修改配置、并运行


条件1的SSH互通,已单独写了一篇,这里不做说明

条件2的MySQL主从结构,也有一篇文章单独说明,这里不做说明,分享下这里MySQL主、从的配置文件:

#主
[mysqld]
port=50031
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=3
log-error=/var/log/mysqld.log


#从
[mysqld]
port=50051
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

#mater-slave setting
server-id=4
log-bin=master-bin
relay-log=relay-bin
skip_name_resolve=ON
innodb_file_per_table=ON
max_connections=65536
#关闭中继日志自动修剪
relay_log_purge=0
#将从节点设置为只读     
read_only=1

 默认到这里已经打通各个节点之间的SSH免密访问,已经在运行MySQL的主从复制结构。主从结构不管是5.7版本还是8版本基本搭建都已差不多的。


条件三:

安装mha管理工具。

mha管理分为两部分,第一部分是mha-manager,这是mha的软件管理部分,第二个就是mha-node,可以看作是执行manager指令操作的部分。

由于manager管理和被管理的MySQL node不是在一台机器上的,所以我们要分开安装,在MySQL的机器上全部都要安装mha-node这个执行指令的软件。

在独立的manager管理机器上我们需要安装manager管理工具和node工具。

总结下来:所有机器都要安装mha-node工具,manager机器上要多安装一个mha-manager工具。

基本上linux上的程序执行都是程序+配置文件,所以我们先安装完程序,之后在设定配置文件,然后再运行。


mha是基于perl来写的,所以在安装mha之前我们要先安装perl源,在安装perl源之前,我们还要安装epel-release源来扩展我们的yum。

默认已经扩展了release。

注意:mha-manager安装依赖有mha-node所以,在manager机器上,要先安装node才能安装manager。

安装perl
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y

然后,其实说不定有很多没有找到包而导致没有安装成功,不过不着急,后面再解决

mha没有yum,需要Google一下他的包,直解Google官网mha,基本在前两条,注意要找centos7版本,度娘上弹出来几次的头条都是centos6的,别找错了。

具体下载地址自行谷歌,然后wget一下node包和manager包

得到   node包:mha4mysql-node-0.58-0.el7.centos.noarch.rpm
      manager包:mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

安装方式我总结下来有三种:1、rpm安装  2、make编译安装  3、yum安装

第一种:rpm安装:
下载rpm包后通过rpm -ivh安装包
如果在yum perl的时候有的依赖包没有找到导致没有安装
在rpm -ivh 安装的时候会报依赖错误,解决办法是,哪个依赖没有就去Google一下相关依赖,再rpm逐步安装即可(注意寻找依赖rpm包的时候最好带上系统版本进行查询)。

第二种:make编译安装:
网上还有的方法是,下载tar包解压后镜像perl 编译,之后再make && make install,同样可能报错没有依赖,这时候make失败需要搜索并安装完依赖后重新perl 编译,再make

上面两种会出现问题:
然而:上面两种方法(rpm和make)有个致命的报错,即在安装完各个依赖并且安装完mha后,试运行可能会报错依赖版本冲突。这时后卸载也不好卸载,改也不好改,这种版本错误让我纠结了两天。

最后推荐一种方法,本地yum安装,也是基于rpm包进行安装:
由于之前安装了epel并且下载的是rpm包,所以我们可以通过
yum loacalinstall +包名 进行本地yum安装,这时候如果出现没有包的情况,yum会自行下载对应的版本依赖,避免后期出现依赖兼容性问题

yum loacalinstall 虽然能够解决版本依赖问题,但是产生了一个新的问题:

如果通过make的同学可能会发现,在安装完node和manager后,自动生成了相关配置文件的模板,而通过yum localinstall安装却找不到配置模板。不过没关系,配置模板什么的,没有不是大事情,大不了自己写一个配置文件嘛。总比依赖冲突导致不能运行来的简单。


安装完node后,在manager机器上安装mha-manager安装包,同理,进行yum localinstall 安装

安装完成后,网上各种教程会然你去找配置文件并且复制到etc目录,然后修改。然而你在这里会发现,安装完后找不到配置文件

 

不要慌,我们自己动手写配置文件,反正系统产生的都是配置文件模板,还不是要手动改,还不如自己写:

在etc下建立一个mha目录吧
mkdir -p /etc/mha

在根目录下建立一个mha运行的目录吧
mkdir -p /masterha/app1

然后,在/etc/mha目录下新建一个配置文件并且添加内容:
vi /etc/mha/default.cnf

[server default]
#登陆数据库监控的账户
user=root
password=Lc123456.

#manager工作管理文件夹
manager_workdir=/masterha/app1
#设置manager的日志
manager_log=/masterha/app1/manager.log
#设置远端mysql在发生切换时binlog的保存位置
remote_workdir=/masterha/app1

#使用ssh账户
ssh_user=root

#MySQL主从复制账户
repl_user=repl
repl_password=Lc123456.

#设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
ping_interval=1 

#指定并设置自动failover时候的切换脚(可省略)
#master_ip_failover_script="/etc/mha/scripts/master_ip_failover"
#设置手动切换时候的切换脚本(可省略)
master_ip_online_change_script="/etc/mha/scripts/master_ip_online_change"
#设置发生切换后发送的报警的脚本(可省略)
report_script="/etc/mha/scripts/send_report"
#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)(可省略)
#shutdown_script=""

#一旦MHA到server2的监控之间出现问题,MHA Manager将会尝试从0.3登录到0.4
secondary_check_script=masterha_secondary_check -s 172.20.0.3 -s 172.20.0.4
[server1]
#节点IP地址
hostname=172.20.0.3
#如果没有改变默认的3306端口可以不用设置port参数,改变了MySQL默认端口就要指定端口
port=50031
#设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql
master_binlog_dir=/var/lib/mysql/
#设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中时间最新的slave
candidate_master=1

#relay_log_purge=0

[server2]
hostname=172.20.0.4
port=50051
master_binlog_dir=/var/lib/mysql/var/lib/mysql/
candidate_master=1

读配置文件,多读几遍,会发现,我们还需要的一些细节条件:

1、MySQL的复制账户(需要访问权限、操作权限等)

2、数据库监控、登陆账户(root太高了可以新建一个,我比较省事直接用了root)

3、指定工作管理文件夹(我们新建的工作路径下,这三个条件可以直接粘贴拿来用)

4、剩余的脚本(之后慢慢添加修改,我在后面会分享我的配置)


 

配置文件的三个脚本,自行vi创建编辑:

master_ip_failover:(这个配置文件在后面测试链接报错的话,直接注销掉,这些脚本都不是必须的)

#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;

my (
command,ssh_user,       origmasterhost,orig_master_ip,origmasterport,new_master_host, newmasterip,new_master_port
);

#定义VIP变量
my vip=′172.20.0.6/24′;mykey = '1';
my sshstartvip="/sbin/ifconfigeth0:key vip";myssh_stop_vip = "/sbin/ifconfig eth0:$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====sshstopvip==ssh_start_vip===\n\n";
if ( commandeq"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";exitexit_code;
}
exit $exit_code;
}

elsif ( command eq "start" ) {  myexit_code = 10;
eval {
print "Enabling the VIP - viponthenewmaster−new_master_host \n";
&start_vip();
$exit_code = 0;
};

if (@)warn$@;exit$exitcode;exitexit_code;
}

elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}

sub start_vip() {
`ssh sshuser\@new_master_host \" ssh_start_vip \"`; } sub stop_vip() {  return 0 unless (ssh_user);
`ssh sshuser\@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_online_change :

#!/bin/bash
source /root/.bash_profile

vip=`echo '172.20.0.7/24'` #设置VIP
key=`echo '1'`

command=`echo "1"|awk−F=′print$2′‘origmasterhost=‘echo"2" | awk -F = '{print 2}'` new_master_host=`echo "7" | awk -F = &
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值