masterhight availabulity:基于主库的高可用环境下可以实现主从复制、故障切换
MHA的主从架构最少要一主两从
MHA的出现是为了解决MySQL的单点故障问题。一旦主库崩溃,MHA可以在0-30秒内自动完成故障切换。
MHA的数据流向和工作流程图:
MHA使用的是半同步的方式,所以使用一个从库来做主从之间切换就可以了
MHA使用的是半同步的方式,只要有一台从服务器写入数据,就会自动提交给客户端
1、 如果master崩溃,slave就会从主的二进制日志保存文件
2、 slave会识别最新更新的日志,差异部分同步到slave
3、 提升一个新的slave作为master
4、 其他的slave继续和新的master同步
1、 搭建MHA架构
2、 模拟故障
3、 故障恢复
实验准备:
MHA manager:20.0.0.20
MySQL1:master 20.0.0.50
MySQL2:slave1 20.0.0.60
MySQL3:slave2 20.0.0.70
node组件:需要部署在所有服务器上。因为manager组件依赖于node组件。node组件就是用来监控MySQL的状态的。
node组件靠ssh远程连接服务来进行通信。
- 开始实验
-
- 修改从主机名20.0.0.60
- hostnamectl set-hostname slave1
- 修改从主机名20.0.0.70
- hostnamectl set-hostname slave2
- 修改主主机名20.0.0.50
- hostnamectl set-hostname master
- su一下让他们都生效
- 修改完成后ping一下主机名看一下能不能通
-
- 先实现主从复制
-
- 配置主MySQL
- vim /etc/my.conf
- server-id=1
- log_bin=master-bin
- log-slave-updates=ture
-
- 配置从MySQL1
- server-id=2
- log_bin=master-bin
- relay-log=relay-log-bin
- relay-log-index=slave-relay-bin.index
-
- 配置从MySQL2
- server-id=3
- relay-log=relay-log-bin
- relay-log-index=slave-relay-bin.index
- 重启三台MySQL
-
- 在主和从服务器上创建软连接
- ln -s /usr/local/mysql/bin/mysql /usr/sbin/
- ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin
- 三台主机上都要创建软连接
-
- mysql -u root -p123456
- #进入数据库
- 三台服务器同时操作
- 开始数据库同步赋权给slave访问主库的授权
- 每台服务器都要操作
- 给mha权限能访问主从的权限
- 在三台服务器上都加上个主机名连接
- flush privileges;
- #刷新其权限
- show master status;
- #查看一下位置偏移点
-
- 在两个从库上配置与主同步
- start slave;
- #打开两个从的slave
- show slave status\G;
- #查看两个从的slave的状态都是yes表示成功
-
- 必须要把两个从库都设为只读模式
- set global read only=1
- #把两个从库都设为只读模式
-
- 打开工具测试一下主从复制是否成功
- create database kgc;
- #创建一个库
-
- 进入MHA的配置
- 所有的服务器都需要安装MHA的依赖环境必须要有epel源
- 开始安装
- yum install epel-release --nogpgcheck -y
- #epel源
-
- yum install -y perl-DBD-MySQL \
- perl-Config-Tiny \
- perl-Log-Dispatch \
- perl-Parallel-ForkManager \
- perl-ExtUtils-CBuilder \
- perl-ExtUtils-MakeMaker \
- perl-CPAN
- #MHA依赖环境
-
- 先咱装node组件,再安装MHA
- 每台服务器上都需要部署node节点
- cd /opt
-
- tar -xf mha4mysql-node-0.57.tar.gz
- #解压文件
-
- perl Makefile.PL
- #编译
-
- make $$ make install
-
- 回到mha服务器
- 解压高可用节点
-
- tar -xf mha4mysql-manager-0.57.tar.gz
- #解压
-
- cd mhamanager
-
- perl Makefile.PL
-
- make -j4 $$ make install
-
- cd /usr/local/bin/
- #查看一下重要组件
- ll -h
-
- master的组件:
- masterha_check_ssh
- #检查MHA的ssh的配置情况
- masterha_check_repl
- #检查MySQL的复制情况
- masterha_manager
- #启动manger的脚本
- masterha_check_status
- #检测MHA的运行状态
- masterhaha_master_monitor
- #检测master主机的情况,masters是否宕机
- masterha_master_switch
- #控制故障转移
- masterha_conf_host
- #添加或者删除配置的server信息
- masterha_stp
- #停止MHA的脚本
-
- 重要的node组件:
- save_binary_logs
- #保存和复制master的二进制日志
- apply_diff_relay_logs
- #识别二进制日志当中的差异事件,然后发送给其他的slave
- filter_mysqlbinlog
- #去除不必要的回滚(MHA已经不用了)
- purge_relay_logs
- #同步之后清除中继日志(不会阻塞sql的限制)
-
- 开始实现ssh免密登录
- 在MHA主机20.0.0.20上操作
- ssh-keygen -t rsa
- #选择加密方式
- 一路回车
- ssh-copy-id 20.0.0.50
- 输入密码和yes
- ssh-copy-id 20.0.0.60
- 输入密码和yes
- ssh-copy-id 20.0.0.70
- 输入密码和yes
-
- 回到master主机
- ssh-keygen -t rsa
- #选择加密方式
- ssh-copy-id 20.0.0.60
- 输入密码和yes
- ssh-copy-id 20.0.0.70
- 输入密码和yes
-
- 回到slave1主机
- ssh-keygen -t rsa
- #选择加密方式
- ssh-copy-id 20.0.0.50
- 输入密码和yes
- ssh-copy-id 20.0.0.70
- 输入密码和yes
-
- 回到slave2主机
- ssh-keygen -t rsa
- #选择加密方式
- ssh-copy-id 20.0.0.50
- 输入密码和yes
- ssh-copy-id 20.0.0.60
- 输入密码和yes
-
- 配置高可用MHA
- cd manger
- cd samples
- cd scripts
-
- master_ip_failover
- #自动切换时管理VIP的脚本
- master_ip_online_change
- #在线切换时的vip管理脚本
- power_manger
- #如果故障发生之后关闭master脚本
- send_report
- #发送故障时的告警脚本
-
- cp -a scripts/ /usr/local/bin
- cd /usr/loacl/bin
- cd scripts
- cp master_ip_failover /usr/local/bin
-
- vim master_ip_failover
- 除了第一行全部删除
- 添加控制脚本
- 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 = '20.0.0.100';
- #设定vip地址
- my $brdc = '20.0.0.255';
- #设定VIP的广播地址
- my $ifdev = 'ens33';
- #VIP绑定的网卡
- my $key = '1';
- #ifcong ens33:1 20.0.0.100/24 key是1,网卡的编号就是1
- my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
- #key:ens33:1 20.0.0.100 up
- my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
- #ens33:1 20.0.0.100 down
- my $exit_code = 0;
- 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 \"`;
- }
- ### A simple system call that disable the VIP on the old_master
- sub stop_vip() {
- `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宕机之后,VIP地址切换到新的主库
-
- 创建MHA的软件目录,对节点服务器进行管理
-
- mkdir /etc/masterha
-
- cd /opt/manger/samples/conf/
-
- app1.cnf
- #用来管理mysql的节点服务器
- cp -a app1.cnf /etc/masterha/
-
- vim /etc/masterha/app1.cnf
- 全部删除内部的配置重新配置
- [server default]
- manager_log=/var/log/masterha/app1/manager.log
- #manager的管理日志
- manager_workdir=/var/log/masterha/app1
- #manager的工作目录
- master_binlog_dir=/usr/local/mysql/data
- #保存master的二进制的位置,必须要和master保存的路径一致
- master_ip_failover_script=/usr/local/bin/master_ip_failover
- #设置自动切换脚本
- master_ip_online_change_script=/usr/local/bin/master_ip_onli
- ne_change
- #手动切换脚本
- password=manager
- ping_interval=1
- #监控主库发送ping包的时间间隔 1代表1秒 工作中一般3-6秒。会尝试3次之后会切换到failover脚本进行自动切换
- remote_workdir=/tmp
- #mysql在发生切换时,binlog的保存位置
- repl_password=123456
- #登录主库和从库的用户密码
- repl_user=myslave
- #用户名
- secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.60 -s 20.0.0.70
- #从和主之间互相监听,主服务器无需声明,但是从服务器需要在check之后声明
- #从对主监听
- shutdown_script=""
- #设置切换时告警的脚本
- ssh_user=root
- #远程登录的用户名
- user=mha
-
- [server1]
- hostname=20.0.0.50
- #主服务器
- port=3306
-
- [server2]
- candidate_master=1
- #设置后选的master主库崩溃会切换到server2 233.22
- check_repl_delay=0
- #即使设置了权重,但是从服务器的relay_logs落后master100M,即使设置了权重也不会切换。通过设置0会忽略设置延迟复制,直接升为主.强制切换到设定为候选master的服务器。
- hostname=20.0.0.60
- #备用主服务器
- port=3306
-
- [server3]
- hostname=20.0.0.70
- #从服务器2
- port=3306
-
- 测试ssh通信是否正常
- masterha_check_ssh -conf=/etc/masterha/app1.cnf
- #测试ssh通信主从之间免密登录是否正常
-
- 测试主从连接情况是否正常
- masterha_check_repl-conf=/etc/masterha/app1.cnf
- #测试主从连接情况是否正常
-
- 都显示ok表示MHA搭建完成!
-
- 模拟故障
- nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
-
- remove_dead_master_conf
- #如果发生组从切换,老的主库的ip地址会从文件中删除
- /var/log/masterha/app1/manager.log
- #MHA的管理日志
- -ignore_last_failover
- #如果检测到连续发生宕机,而且宕机的事件间隔不足8小时,不会进行自动切换。忽略时间间隔只要发生故障,就会切换
- cat /var/log/masterha/app1/manager.log | grep "current master"
- 在开一个20主机监控一下管理日志
- tail -f /var/log/masterha/app1/manager.log
- 这时候停掉主MySQL
- systemctl stop mysqld
- 然后到20查看日志
- 查看一下vip地址还在不在主库20.0.0.50上如果已经转移到主库2 20.0.0.60上代表切换成功。
-
- 开始故障恢复
- 进入MySQL1的my.cnf文件进行配置
- vim /etc/my.conf
- log_bin = master-bin
- relay-log = relay-log-bin
- relay-log-index = slave-relay-bin.index
- #将MySQL1设为从
-
- 再进入MySQL2的my.cnf文件进行配置
- vim /etc/my.conf
- log_bin = master-bin
- log-slave-updates=ture
- #将MySQL2设置为新的主
-
- 进入manager主机
- 配置文件进行配置
- vim /etc/masterha/app1.cnf
-
- secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.50 -s 20.0.0.70
- #声明从库的ip将20.0.0.60修改为50
-
-
- [server1]
- hostname=20.0.0.60
- port=3306
- #server1的ip改为60
-
- [server2]
- candidate_master=1
- check_repl_delay=0
- hostname=20.0.0.50
- port=3306
- #复制一个server2出来将ip改为50
-
- 修改完成后重启启动一下manager
- nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
-
- 然后回到新的主MySQL20.0.0.60
- 重启MySQL服务
- systemctl restart mysqld
- 进入MySQL
- mysql -u root -p
-
- 查看一下偏移点
- show master status;
-
- 再回到MySQL1
- 启动MySQL服务
- 进入MySQL
- 先停止slave服务
- stop slave
- 进行配置
- change master to master_host='20.0.0.60',
- master_user='myslave',master_password='123456',
- master_log_file='master-bin.000002',
- master_log_pos=154;
- #绑定新的主MySQL的ip和日志文件和偏移点
- 配置完成后
- reset slave
- start slave
- #启动slave服务
-
- 查看一下slave的状态
- show slave status\G
-
- 此时出现两个yes代表实验成功
-
- 进入新的主MySQL20.0.0.60
-
- 创建一个库
- create database kgc2;
-
- 三台MySQL都能查看到代表实验成功