搭建mysql主从集群半同步复制MHA高可用监控基于LinuxCentos7

1.环境软件版本

&软件** 版本
虚拟机&VMware Workstation&Parallel 15 Pro
服务器&CentOS 7.X
数据库&Mysql 5.7.28
远程连接&Xshell 6

2. 环境架构介绍

主机(hostname) ip 角色 权限
Centos-7-master 10.211.55.7 Mysql Slave 可读写、主库
Centos-7-slave-1 10.211.55.8 Mysql Slave 只读、从库
Centos-7-slave-2 10.211.55.9 Mysql Slave 只读、从库
Centos-7-mha 10.211.55.10 MHA Manager 高可用监控

3. **Mysql主从搭建 **

3.1 MySQL安装(3台)

Ps:本人在这里是在一台虚拟机上面安装了mysql,然后使用Parallel拷贝了整个pvm文件,就安装了一次就可以了。

你们也可以选择手动在每台虚拟机上面安装

搭建mysql主从集群半同步复制MHA高可用监控基于LinuxCentos7_第1张图片

下载

wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.28-1.el7.x86_64.rpm-
bundle.tar

我是放在/opt下面的

解压

tar xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
mysql-community-embedded-5.7.28-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
mysql-community-devel-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.28-1.el7.x86_64.rpm
mysql-community-libs-5.7.28-1.el7.x86_64.rpm
mysql-community-test-5.7.28-1.el7.x86_64.rpm
mysql-community-common-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.28-1.el7.x86_64.rpm
mysql-community-client-5.7.28-1.el7.x86_64.rpm
mysql-community-server-5.7.28-1.el7.x86_64.rpm

安装

要移除CentOS自带的mariadb-libs,不然会提示冲突

使用
rpm -qa|grep mariadb //查看你本机的mariadb安装包文件

rpm -e mariadb-libs-5.5.41-2.el7_0.x86_64 --nodeps  //卸载mariadb

由于MySQL的server服务依赖了common、libs、client,所以需要按照以下顺序依次安装。 RPM是Red Hat公司随Redhat Linux推出的一个软件包管理器,通过它能够更加方便地实现软件的安装。

rpm常用的命令有以下几个:

-i, --install 安装软件包
-v, --verbose 可视化,提供更多的详细信息的输出 -h, --hash 显示安装进度
-U, --upgrade=+ 升级软件包
-e, --erase=+ 卸载软件包
--nodeps 不验证软件包的依赖

组合可得到几个常用命令:

安装软件:rpm -ivh rpm包名
升级软件:rpm -Uvh rpm包名
卸载软件:rpm -e rpm包名
查看某个包是否被安装 rpm -qa | grep 软件名称

下面就利用安装命令来安装mysql:

rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.28-1.el7.x86_64.rpm

启动

初始化用户

mysqld --initialize --user=mysql

查看初始密码

cat /var/log/mysqld.log | grep password

启动mysql服务

systemctl start mysqld

配置为开机启动

systemctl enable mysqld

接下来修改默认密码。进入mysql console

mysql -uroot -p

mysql> SET PASSWORD = PASSWORD('123456');
Query OK, 0 rows affected, 1 warning (0.00 sec)

3.2 关闭防火墙

不同的MySQL直接要互相访问,需要关闭Linux的防火墙,否则就要在配置/etc/sysconfig/iptables中增

加规则。配置防火墙不是本次教程的重点,所以四台服务器均关闭防火墙。

systemctl stop firewalld
如果是iptables的话那么执行
systemctl stop iptables

3.3 MySQL主从配置

修改Master配置文件

vim /etc/my.cnf

#bin_log配置
log_bin=mysql-bin  #开启binlog
server-id=1        #server id标识
sync-binlog=1
#配置忽略的db
binlog-ignore-db=information_schema 
binlog-ignore-db=mysql 
binlog-ignore-db=performation_schema 
binlog-ignore-db=sys

#relay_log配置 
relay_log=mysql-relay-bin
log_slave_updates=1
relay_log_purge=0 

#gtid配置
#开启gtid
#gtid_mode=on #enforce_gtid_consistency=1

重启服务

systemctl restart mysqld

主库给从库授权

grant replication slave on *.* to root@'%' identified by 'yourpassword';
grant all privileges on *.* to root@'%' identified by 'yourpassword';
flush privileges;

//查看主库master_log_file='mysql- bin.000007',master_log_pos=154
show master status;

Slave 节点

Ps:我这里是修改Centos-7-slave-1,Centos-7-slave-2这两台节点的mysql配置

修改Slave配置文件,两台Slave的server-id分别设置为2和3,注意这个地方如果你也是通过复制整个虚拟机pvm的方式构建的节点的话,那么需要

rm -rf /var/lib/mysql/auto.cnf //因为里面uuid是一样的,启动从节点mysql的时候会报错,删除该文件在启动mysql服务的时候该文件会自动创建,并且赋予随机的uuid

slave节点配置如下

vim /etc/my.cnf

#bin_log配置 
log_bin=mysql-bin 
#服务器ID,从库1是2,从库2是3
server-id=2
sync-binlog=1 
binlog-ignore-db=information_schema 
binlog-ignore-db=mysql 
binlog-ignore-db=performation_schema 
binlog-ignore-db=sys
#relay_log配置 
relay_log=mysql-relay-bin 
log_slave_updates=1 
relay_log_purge=0
read_only=1
#gtid配置
#开启gtid
#gtid_mode=on #enforce_gtid_consistency=1

启动Slave Mysql服务

systemctl start mysqld

开启同步

在Slave节点的MySQL命令行执行如下命令:

mysql> change master to
master_host='10.211.55.7',master_port=3306,master_user='root',master_password
='123456',master_log_file='mysql-bin.000007',master_log_pos=154;
//master_log_file='mysql-bin.000007',master_log_pos=154 需要在主节点mysql命令行通过
show master status; 获得


start slave; // 开启同步

3.4 配置半同步复制

Master节点
安装插件

install plugin rpl_semi_sync_master soname 'semisync_master.so';
show variables like '%semi%'

修改配置文件

vim /etc/my.cnf

# 自动开启半同步复制 
rpl_semi_sync_master_enabled=ON 
rpl_semi_sync_master_timeout=1000

重启Master服务

systemctl restart mysqld

Slave 节点

两台Slave节点都执行以下步骤。

安装插件

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

修改配置文件

vim /etc/my.cnf
# 自动开启半同步复制 
rpl_semi_sync_slave_enabled=ON

重启服务

systemctl restart mysqld

测试半同步状态

首先通过MySQL命令行检查参数的方式,查看半同步是否开启。

show variables like '%semi%'

Master节点:

搭建mysql主从集群半同步复制MHA高可用监控基于LinuxCentos7_第2张图片

Slave节点:
搭建mysql主从集群半同步复制MHA高可用监控基于LinuxCentos7_第3张图片

然后通过MySQL日志再次确认。

cat /var/log/mysqld.log
可以看到日志中已经启动半同步:
Start semi-sync binlog_dump to slave (server_id: 2), pos(mysql-bin.000005, 154)

4. MHA 高可用搭建

4.1 MHA 高可用搭建

在四台服务器上分别执行下面命令,生成公钥和私钥,换行回车采用默认值

ssh-keygen -t rsa

在三台MySQL服务器分别执行下面命令,将公钥拷到MHA Manager服务器上

ssh-copy-id 10.211.55.10

之后可以在MHA Manager服务器上检查下,看看.ssh/authorized_keys文件是否包含3个公钥

cat /root/.ssh/authorized_keys

从MHA Manager服务器执行下面命令,向其他三台MySQL服务器分发公钥信息。

Ps:如果下面命令不成功可以使用ssh-copy-id一台台的copy

scp /root/.ssh/authorized_keys 192.168.31.199:$PWD
scp /root/.ssh/authorized_keys 192.168.31.165:$PWD
scp /root/.ssh/authorized_keys 192.168.31.142:$PWD

可以MHA Manager执行下面命令,检测下是否实现ssh互通。

ssh centos-7-master

4.2MHA 下载安装

MHA 下载

MySQL5.7对应的MHA版本是0.5.8,所以在GitHub上找到对应的rpm包进行下载,MHA manager和 node的安装包需要分别下载:

https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58

https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58

下载后,将Manager和Node的安装包分别上传到对应的服务器。(可使用WinSCP等工具)

  • 三台MySQL服务器需要安装node
  • MHA Manager服务器需要安装manager和node

提示:也可以使用wget命令在linux系统直接下载获取,例如

wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

4.3MHA node安装
在四台服务器上安装mha4mysql-node。 MHA的Node依赖于perl-DBD-MySQL,所以要先安装perl-DBD-MySQL。

yum install perl-DBD-MySQL -y

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

4.4MHA manager安装

在MHA Manager服务器安装mha4mysql-node和mha4mysql-manager。

MHA的manager又依赖了perl-Config-Tiny、perl-Log-Dispatch、perl-Parallel-ForkManager,也分别 进行安装。

wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm

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

wget https://github.com/yoshinorim/mha4mysql-
node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

wget https://github.com/yoshinorim/mha4mysql-
manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

提示:由于perl-Log-Dispatch和perl-Parallel-ForkManager这两个被依赖包在yum仓库找不到, 因此安装epel-release-latest-7.noarch.rpm。在使用时,可能会出现下面异常:Cannot retrieve metalink for repository: epel/x86_64。可以尝试使 用/etc/yum.repos.d/epel.repo,然后注释掉mirrorlist,取消注释baseurl。

4.5MHA配置文件

MHA Manager服务器需要为每个监控的 Master/Slave 集群提供一个专用的配置文件,而所有的

Master/Slave 集群也可共享全局配置。

在mha这台机器上:

初始化配置目录

mkdir -p /var/log/mha/app1 (MHA监控实例根目录)
touch /var/log/mha/app1/manager.log (MHA监控实例日志文件)

配置监控全局配置文件

vim /etc/masterha_default.cnf

[server default]
#用户名
user=root
#密码
password=root
#ssh登录账号
ssh_user=root
#主从复制账号
repl_user=root
#主从复制密码
repl_password=root
#ping次数
ping_interval=1
#二次检查的主机
secondary_check_script=masterha_secondary_check -s 192.168.31.199 -s 192.168.31.165 -s 192.168.31.142

配置监控实例配置文件

vim /etc/mha/app1.cnf

[server default]
#MHA监控实例根目录 manager_workdir=/var/log/mha/app1 #MHA监控实例日志文件 manager_log=/var/log/mha/app1/manager.log
#[serverx] 服务器编号 #hostname 主机名 #candidate_master 可以做主库 #master_binlog_dir binlog日志文件目录
[server1]
hostname=192.168.31.199
candidate_master=1
master_binlog_dir="/var/lib/mysql"

[server2]
hostname=192.168.31.165
candidate_master=1
master_binlog_dir="/var/lib/mysql"

[server3]
hostname=192.168.31.142
candidate_master=1
master_binlog_dir="/var/lib/mysql"

4.6MHA配置检测

执行ssh通信检测

在MHA Manager服务器上执行:

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

如下图表示ssh互通成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8SuR40qa-1592989095672)(/Users/lewis/Library/Application Support/typora-user-images/image-20200624162058238.png)]

**检测MySQL主从复制 **

在MHA Manager服务器上执行:

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

出现“MySQL Replication Health is OK.”证明MySQL复制集群没有问题。

MHA Manager启动

在MHA Manager服务器上执行:

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --
ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

查看监控状态命令如下:

masterha_check_status --conf=/etc/mha/app1.cnf

查看监控日志命令如下:

tail -f /var/log/mha/app1/manager.log

测试MHA故障转移

模拟主节点崩溃

在MHA Manager服务器执行打开日志命令:

tail -200f /var/log/masterha/app1/app1.log

关闭Master MySQL服务器服务,模拟主节点崩溃

systemctl stop mysqld

查看MHA日志,可以看到哪台slave切换成了master

将原主启动切换回主

启动原先停的master

systemctl start mysqld

挂到新主作从库(原先的主机挂载到新的主机作为从机)

在原先master mysql命令行执行
这里的master_host='10.211.55.8'是新主的ip

change master to master_host='10.211.55.8',master_port=3306,master_user='root',master_password ='123456',master_log_file='mysql-bin.000018',master_log_pos=4395;

提示:master_log_file和master_log_pos两个参数需要去新主库查看,show master status \G;

使用MHA在线切换命令将原主切换回来

masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=centos-7-master --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

注意这里的new_master_host要使用主机名,使用ip会报错

测试SQL脚本

create TABLE position (
id int(20),
name varchar(50),
salary varchar(20),
city varchar(50)
) ENGINE=innodb charset=utf8;

insert into position values(1, 'Java', 13000, 'shanghai');
insert into position values(2, 'DBA', 20000, 'beijing');

5. 遇到的问题

配置主从后,检查从节点状态,发现报错:

Last_IO_Errno: 1593
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave
have equal MySQL server UUIDs; these UUIDs must be different for replication to
work.

然后去Mater和Slave节点检查UUIDs。

cat /var/lib/mysql/auto.cnf

发现从节点和主节点的UUIDs果然是一样的,此处是因为我偷了个懒,把199服务器装好之后直接复制 虚拟机磁盘,导入Parallels生成了另外两台从节点。

解决办法如下:

systemctl stop mysqld.service
rm -rf /var/lib/mysql/auto.cnf
systemctl start mysqld.service

之后MySQL会重新生成Server UUIDs。
此时通过show slave status查看Slave状态,又报了另外一个错误:

Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary
log: 'Could not find first log file name in binary log index file'

这是因为一开始搭建主从同步之后并没有成功,我在Master执行了一些命令,没有同步到Slave,导致 Slave的日志读取位置发生不一致。

此处有两种做法:第一种是从新去Master节点查看最新的pos,然后重新设置为最新pos,但是这种做 法会丢失数据。第二种是正确的做法:

stop slave;
reset slave;
start slave;

先停止Slave,然后重置Slave,它的作用是“删除SLAVE数据库的relaylog日志文件,并重新启用新的 relaylog文件”,然后再重启Slave。

我此处文件改动比较小,采用这种做法不会丢失数据,但是如果数据量比较大了,这种做法同步起来就
会比较耗时了。

MHA配置检测失败

执行命令masterha_check_repl -conf=/etc/app1.cnf后报错:

[error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln364] None of slaves
can be master. Check failover configuration file or log-bin settings in my.cnf

发现是两个从节点没有配置log-bin日志,所以需要在从节点开启log-bin日志。在从节点的配置文件增 加“log_bin=mysql-bin”;

之后执行又报了错误:

[error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln443] Binlog
filtering che             ck failed on 192.168.31.165(192.168.31.165:3306)! All log-bin
enabled servers must have same binlog filtering rules (same binlog-do-db and
binlog-ignore-db). Check SHOW MASTER STATUS output and set my.cnf correctly.

于是在各Slave节点增加以下配置:

sync-binlog=1 #每次写入都同步到binlog 
binlog_format=ROW 
binlog-ignore-db=perf          ormance_schema #忽略不同步 
binlog-ignore-db=information_schema 
q2op00-                                                                                      binlog-ignore-db=sys

不小心在主库上启动了salve,在执行masterha_check_repl -conf=/etc/app1.cnf时就报错:

Fri May 29 00:29:14 2020 - [info] Slaves settings check done.
Fri May 29 00:29:14 2020 - [info]
192.168.31.199(192.168.31.199:3306) (current master)
 +--192.168.31.199(192.168.31.199:3306)
 +--192.168.31.165(192.168.31.165:3306)
 +--192.168.31.142(192.168.31.142:3306)
Fri May 29 00:29:14 2020 - [info] Checking replication health on
192.168.31.199..
Fri May 29 00:29:14 2020 - [error][/usr/share/perl5/vendor_perl/MHA/Server.pm,
ln490] Slave IO thread is not running on 192.168.31.199(192.168.31.199:3306)
Fri May 29 00:29:14 2020 - [error]
[/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln1526]  failed!
Fri May 29 00:29:14 2020 - [error]
[/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln427] Error happened on
checking configurations.  at /usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm
line 420.

在主库上停止salve,然后执行reset slave all。

你可能感兴趣的:(mysql)