赞
踩
目录
MHA监控复制架构的主服务器,一旦检测到主服务器故障,就会自动进行故障转移。即使有些从服务器没有收到最新的relay log,MHA自动从最新的从服务器上识别差异的relay log并把这些日志应用到其他从服务器上,因此所有的从服务器保持一致性了。MHA通常在几秒内完成故障转移,9-12秒可以检测出主服务器故障,7-10秒内关闭故障的主服务器以避免脑裂,几秒中内应用差异的relay log到新的主服务器上,整个过程可以在10-30s内完成。还可以设置优先级指定其中的一台slave作为master的候选人。由于MHA在slaves之间修复一致性,因此可以将任何slave变成新的master,而不会发生一致性的问题,从而导致复制失败。
交互式主服务器故障转移
可以只使用MHA的故障转移,而不用于监控主服务器,当主服务器故障时,人工调用MHA来进行故障故障。
非交互式的主故障转移
不监控主服务器,但自动实现故障转移。这种特征适用于已经使用其他软件来监控主服务器状态,比如heartbeat来检测主服务器故障和虚拟IP地址接管,可以使用MHA来实现故障转移和slave服务器晋级为master服务器。
在线切换主从服务器
在许多情况下,需要将现有的主服务器迁移到另外一台服务器上。比如主服务器硬件故障,RAID控制卡需要重建,将主服务器移到性能更好的服务器上等等。维护主服务器引起性能下降,导致停机时间至少无法写入数据。另外,阻塞或杀掉当前运行的会话会导致主主之间数据不一致的问题发生。MHA提供快速切换和优雅的阻塞写入,这个切换过程只需要0.5-2s的时间,这段时间内数据是无法写入的。在很多情况下,0.5-2s的阻塞写入是可以接受的。因此切换主服务器不需要计划分配维护时间窗口(呵呵,不需要你在夜黑风高时通宵达旦完成切换主服务器的任务)。
MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)
要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,管理节点可以和master在一台机器上。所以如果你只有二台机器的话,heartbeat,keepalive等都是不错的选择了。
展示了如何通过MHA Manager管理多组主从复制。可以将MHA工作原理总结为如下:
(1)从宕机崩溃的master保存二进制日志事件(binlog events);
(2)识别含有最新更新的slave;
(3)应用差异的中继日志(relay log)到其他的slave;
(4)应用从master保存的二进制日志事件(binlog events);
(5)提升一个slave为新的master;
(6)使其他的slave连接新的master进行复制
MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下。
Manager工具包主要包括以下几个工具:
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况
masterha_manger 启动MHA
masterha_check_status 检测当前MHA运行状态
masterha_master_monitor 检测master是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的server信息
Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞SQL线程)
注意:
为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL 5.5的半同步复制。关于半同步复制原理各位自己进行查阅。(不是必须)
———————————————————————————————————————————
主机名 | IP地址 | 角色 |
master | 192.168.184.127 | 主库Master |
slave1 | 192.168.184.128 | 从库Slave1(主备) |
slave2 | 192.168.184.129 | 从库Slave2 |
mha | 192.168.184.130 | 管理节点Mha_manage |
1. MySQL安装(3台)Master\Slave1\Slave2三台都需要安装mysql
分别修改主机名称
[root@master ~]# hostnamectl set-hostname master
[root@slave1 ~]# hostnamectl set-hostname slave1
[root@slave2 ~]# hostnamectl set-hostname slave2
[root@mha ~]# hostnamectl set-hostname mha
将上面的内容添加到每台/etc/hosts当中
# vim /etc/hosts
192.168.184.127 master
192.168.184.128 slave1
192.168.184.129 slave2
192.168.184.130 mha
服务器之间,无密码ssh登录
# ssh-keygen -t rsa
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.184.127
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.184.128
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.184.129
# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.184.130
———————————————————————————————————————————
创建安装用户组mysql
# useradd mysql
设置ulimit参数
# sudo vim /etc/security/limits.conf
文件最后添加
* soft nofile 65536
* hard nofile 131072
* soft nproc 65536
* hard nproc 65536
(1)开始执行安装
# yum install -y libaio
# tar -xvf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local
# cd /usr/local/
# mv mysql-5.7.36-linux-glibc2.12-x86_64 mysql
# cd /usr/local/mysql
# chown -R mysql.mysql .
创建数据存放目录
# mkdir -p /data/mysql
# chown -R mysql.mysql /data/mysql
执行初始化命令
# bin/mysqld --initialize --user=mysql --datadir=/data/mysql
如下图红框内是初始密码,需要记录下来。
(2) 将mysql注册为系统服务
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod 700 /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld 配置成开机自启
# service mysqld start
本地连接数据库,密码是上图红框中的初始密码
# cd /usr/local/mysql/bin/
# ./mysql -uroot -p
alter user 'root'@'localhost' IDENTIFIED BY '123456';
update mysql.user set host = '%' where user = 'root' and host='localhost';
flush privileges;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'ziguangruanjian';
(3)关闭防火墙
不同的MySQL直接要互相访问,需要关闭Linux的防火墙,否则就要在配置/etc/sysconfig/iptables中增加规则。配置防火墙不是本次作业的重点,所以四台服务器均关闭防火墙。
# systemctl stop firewalld
永久关闭防火墙:(可选)
# systemctl disable firewald
(1)Master节点修改配置文件
# vim /etc/my.cnf
#bin_log配置
log_bin=mysql-bin
server-id=1
sync-binlog=1
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#relay_log配置
relay_log=mysql-relay-bin
log_slave_updates=1
relay_log_purge=0
重启服务
# service restart mysqld
(2)主库给从库授权
登录Master_MySQL,在MySQL命令行执行如下命令:
mysql> grant replication slave on *.* to root@'%' identified by '123456';
mysql> grant all privileges on *.* to root@'%' identified by '123456';
mysql> flush privileges;
//查看主库状态信息,例如master_log_file='mysql-bin.000007',master_log_pos=154
mysql> show master status;
(3)Slave1节点
修改Slave的MySQL配置文件my.cnf,两台Slave的server-id分别设置为2和3
# 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=performance_schema
binlog-ignore-db=sys
#relay_log配置
relay_log=mysql-relay-bin
log_slave_updates=1
relay_log_purge=0
read_only=1
重启服务
# service restart mysqld
(4)开启同步
登录MySQL,在Slave节点的MySQL命令行执行同步操作,例如下面命令(注意参数与上面show master status操作显示的参数一致):
mysql>change master to master_host='192.168.184.127',master_port=3306,master_user='root',master_password ='123456',master_log_file='mysql-bin.000001',master_log_pos=154;
mysql>start slave; // 开启同步
(5)Slave2节点
执行与Slave1相同的节点,唯一的区别是:server-id不同
(6) 配置半同步复制
Master节点
登录MySQL,在MySQL命令行执行下面命令安装插件
mysql>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
重启MySQL服务
# service restart mysqld
(7)Slave节点
两台Slave节点都执行以下步骤。
登录MySQL,在MySQL命令行执行下面命令安装插件
mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
# 自动开启半同步复制
# vim /etc/my.cnf
rpl_semi_sync_slave_enabled=ON
重启服务
# service restart mysqld
(8)测试半同步状态
首先通过MySQL命令行检查参数的方式,查看半同步是否开启。
mysql>show variables like '%semi%';
然后通过MySQL日志再次确认。
#cat /var/log/mysqld.log
可以看到日志中已经启动半同步信息,例如:
Start semi-sync binlog_dump to slave (server_id: 2), pos(mysql-bin.000005, 154)
———————————————————————————————————————————
若从库日志有如下报错,是因为虚机是克隆的master节点,克隆的虚拟机与原虚拟机的UUID是一样的,冲突了
[ERROR] Slave I/O for channel '': 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. Error_code: 1593
解决方案:
删除slave1、slave2、mha机器上的这个文件/data/mysql/auto.cnf,然后重启数据库即可解决
这个文件删除,重启MySQL之后,会自动生成,无须担心
再次查看master节点的日志,如下图:证明半同步开启成功~
cat /var/log/mysqld.log
分别在mysql的服务器上执行以下命令
# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
# ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
(1)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的安装包分别上传到对应的服务器。
三台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
(2)MHA node安装:
在四台服务器上安装mha4mysql-node。
# yum install perl-DBD-MySQL -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
(3)MHA manager安装:
在MHA Manager服务器安装mha4mysql-node和mha4mysql-manager。
# 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,然后注释掉metalink,取消注释baseurl。
(4)MHA 配置文件
MHA Manager服务器需要为每个监控的 Master/Slave 集群提供一个专用的配置文件,而所有的
Master/Slave 集群也可共享全局配置。
初始化配置目录
#目录说明
# /var/log (CentOS目录)
# /mha (MHA监控根目录)
# /app1 (MHA监控实例根目录)
# /manager.log (MHA监控实例日志文件)
# mkdir -p /var/log/mha/app1
# touch /var/log/mha/app1/manager.log
需要先在master的MySQL主库执行命令,创建一个新用户mha
# mysql -uroot -p
mysql> create user 'mha'@'%' identified by 'root';
mysql> grant all on *.* to mha@'%' identified by 'root';
mysql> flush privileges;
———————————————————————————————————————————
配置监控全局配置文件
# vim /etc/masterha_default.cnf
[server default]
user=mha
password=root
port=3306
#ssh登录账号
ssh_user=root
#从库复制账号和密码
repl_user=root
repl_password=123456
port=3306
#ping次数
ping_interval=1
#二次检查的主机
secondary_check_script=masterha_secondary_check -s 192.168.184.127 -s 192.168.184.128 -s 192.168.184.129
———————————————————————————————————————————
配置监控实例配置文件
# mkdir -p /etc/mha
# 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.184.127
candidate_master=1
master_binlog_dir="/var/lib/mysql"
[server2]
hostname=192.168.184.128
candidate_master=1
master_binlog_dir="/var/lib/mysql"
[server3]
hostname=192.168.184.129
candidate_master=1
master_binlog_dir="/var/lib/mysql"
———————————————————————————————————————————
(5)编辑自动failover脚本
[root@mha ~]# vim /etc/mha/scripts/master_ip_failover
- #!/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 = '192.168.184.131/24';
-
- my $key = '1';
-
- my $ssh_start_vip = "/usr/sbin/ifconfig ens33:$key $vip";
-
- my $ssh_stop_vip = "/usr/sbin/ifconfig ens33:$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" ) {
-
-
-
- my $exit_code = 10;
-
- eval {
-
- print "Enabling the VIP - $vip on the new master - $new_master_host \n";
-
- &start_vip();
-
- $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() {
-
- return 0 unless ($ssh_user);
-
- `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";
-
- }
———————————————————————————————————————————
(6)配置手动 failover脚本
[root@mha ~]# vim /etc/mha/scripts/master_ip_online_change
- #!/bin/bash
-
- source /root/.bash_profile
-
- vip=`echo '192.168.184.131/24'` #设置VIP
-
- key=`echo '1'`
-
-
-
- command=`echo "$1" | awk -F = '{print $2}'`
-
- orig_master_host=`echo "$2" | awk -F = '{print $2}'`
-
- new_master_host=`echo "$7" | awk -F = '{print $2}'`
-
- orig_master_ssh_user=`echo "${12}" | awk -F = '{print $2}'`
-
- new_master_ssh_user=`echo "${13}" | awk -F = '{print $2}'`
-
-
-
- #要求服务的网卡识别名一样,都为eth1(这里是)
-
- stop_vip=`echo "ssh root@$orig_master_host /usr/sbin/ifconfig ens33:$key down"`
-
- start_vip=`echo "ssh root@$new_master_host /usr/sbin/ifconfig ens33:$key $vip"`
-
-
-
- if [ $command = 'stop' ]
-
- then
-
- echo -e "\n\n\n****************************\n"
-
- echo -e "Disabled thi VIP - $vip on old master: $orig_master_host \n"
-
- $stop_vip
-
- if [ $? -eq 0 ]
-
- then
-
- echo "Disabled the VIP successfully"
-
- else
-
- echo "Disabled the VIP failed"
-
- fi
-
- echo -e "***************************\n\n\n"
-
- fi
-
-
-
- if [ $command = 'start' -o $command = 'status' ]
-
- then
-
- echo -e "\n\n\n*************************\n"
-
- echo -e "Enabling the VIP - $vip on new master: $new_master_host \n"
-
- $start_vip
-
- if [ $? -eq 0 ]
-
- then
-
- echo "Enabled the VIP successfully"
-
- else
-
- echo "Enabled the VIP failed"
-
- fi
-
- echo -e "***************************\n\n\n"
-
- Fi
将脚本赋予可执行权限
[root@mha ~]# chmod +x /etc/mha/scripts/master_ip_failover
[root@mha ~]# chmod +x /etc/mha/scripts/master_ip_online_change
———————————————————————————————————————————
(7)MHA 配置检测/执行ssh通信检测:
在MHA Manager服务器上执行,如下图所示验证成功:
# masterha_check_ssh --conf=/etc/mha/app1.cnf
———————————————————————————————————————————
(8)检测MySQL主从复制:
在MHA Manager服务器上执行:
# masterha_check_repl --conf=/etc/mha/app1.cnf
出现“MySQL Replication Health is OK.”证明MySQL复制集群没有问题。
———————————————————————————————————————————
(9)MHA Manager启动
先在master上绑定vip,(只需要在master绑定这一次,以后会自动切换)
# yum -y install net-tools
[root@master ~]# /usr/sbin/ifconfig ens33:1 192.168.184.131/24
在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 &
检查MHA的启动状态
[root@mha ~]# tailf /var/log/mha/app1/manager.log
如果最后一行是如下,表明启动成功
Ping(SELECT) succeeded, waiting until MySQL doesn’t respond..
查看监控状态命令如下:
[root@mha ~]# masterha_check_status --conf=/etc/mha/app1.cnf
#关闭mha
[root@mha ~]# masterha_stop --conf=/etc/masterha/app1.cnfz
———————————————————————————————————————————
(10)测试MHA故障转移,模拟主节点崩溃
在MHA Manager服务器执行打开日志命令:
# service stop mysqld
# tail -200f /var/log/mha/app1/manager.log
查看MHA日志,可以看的主机会切换为新的主库
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。