1. MHA环境搭建
规划:
主库: 51 node
从库:
52 node
53 node manager
2. 准备环境(略。1主2从GTID)搭建主从关系,此为简略
配置文件:
[mysqld]
basedir=/usr/local/mysql/
datadir=/data/mysql/data
socket=/tmp/mysql.sock
server_id=51
port=3306
secure-file-priv=/tmp
autocommit=0
log_bin=/data/binlog/mysql-bin
binlog_format=row
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db01 [\d]>
初始化:
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
授权:
grant replication slave on *.* to repl@'10.0.1.%' identified by '123';
主从数据同步:
若主从关系一起建立,则不需要备份主库数据到从库,否则应该将最近一次的备份数据恢复到从库,然后进行同步位置确定,位置可以从备份文件中得到,应从备份位置开始。然后同步位置,
change master to
master_host='10.0.1.51',
master_user='repl',
master_password='123' ,
MASTER_AUTO_POSITION=1;
3. 配置关键程序软连接
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
4. 配置各节点互信(各节点之间必须互通,包括自己)
db01:
rm -rf /root/.ssh
ssh-keygen
cd /root/.ssh
mv id_rsa.pub authorized_keys
scp -r /root/.ssh 10.0.1.52:/root
scp -r /root/.ssh 10.0.1.53:/root
各节点验证
db01:
ssh 10.0.1.51 date
ssh 10.0.1.52 date
ssh 10.0.1.53 date
db02:
ssh 10.0.1.51 date
ssh 10.0.1.52 date
ssh 10.0.1.53 date
db03:
ssh 10.0.1.51 date
ssh 10.0.1.52 date
ssh 10.0.1.53 date
5. 安装软件
# 下载mha软件
mha官网:https://code.google.com/archive/p/mysql-master-ha/
github下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
# 所有节点安装Node软件依赖包
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
# 在db01主库中创建mha需要的用户
grant all privileges on *.* to mha@'10.0.1.%' identified by 'mha';
# Manager软件安装(db03)
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
6. 配置文件准备(db03)
# 创建配置文件目录
mkdir -p /etc/mha
# 创建日志目录
mkdir -p /var/log/mha/app1
# 编辑mha配置文件
vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/data/binlog
user=mha
password=mha
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root
[server1]
hostname=10.0.1.51
port=3306
[server2]
hostname=10.0.1.52
port=3306
[server3]
hostname=10.0.1.53
port=3306
7. 状态检查
# 互信检查
masterha_check_ssh --conf=/etc/mha/app1.cnf
主从状态检查
masterha_check_repl --conf=/etc/mha/app1.cnf
8. 开启MHA(db03):
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 &
9. 查看MHA状态
masterha_check_status --conf=/etc/mha/app1.cnf
mysql -umha -pmha -h 10.0.1.51 -e "show variables like 'server_id'"
mysql -umha -pmha -h 10.0.1.52 -e "show variables like 'server_id'"
mysql -umha -pmha -h 10.0.1.53 -e "show variables like 'server_id'"
10. 故障模拟及处理
### 停主库db01:
/etc/init.d/mysqld stop
观察manager 日志 tail -f /var/log/mha/app1/manager
末尾必须显示successfully,才算正常切换成功。
修复主库
[root@db01 ~]# /etc/init.d/mysqld start
恢复主从结构
CHANGE MASTER TO
MASTER_HOST='10.0.1.52',
MASTER_PORT=3306,
MASTER_AUTO_POSITION=1,
MASTER_USER='repl',
MASTER_PASSWORD='123';
start slave ;
修改MHA配置文件,增加新的从节点
[server1]
hostname=10.0.1.51
port=3306
启动MHA
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状态
masterha_check_status --conf=/etc/mha/app1.cnf
###额外参数:
11. MHA-VIP功能
设置配置文件:
master_ip_failover_script=/usr/local/bin/master_ip_failover #路径为脚本路径,需要先将脚本cp到这个位置,master_ip_failover为脚本名,需要有执行权限,注意脚本文件存在window字符,需要用dos2unix转换一下
修改脚本:
vi /usr/local/bin/master_ip_failover
my $vip = '10.0.1.55/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
手工在主库上绑定上面的虚拟ip地址:
ifconfig eth0:1 10.0.1.55/24
12. 重启MHA
masterha_stop --conf=/etc/mha/app1.cnf
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 &
13. 设置邮件提醒
设置配置文件:
report_script=/usr/local/bin/send #路径为邮件脚本所在位置,设置之前需要将脚本拷贝到这个位置,并授予执行权限send为脚本文件名
配置邮件发送脚本,或用自己编写的发送脚本
14. 重启MHA
masterha_stop --conf=/etc/mha/app1.cnf
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 &
15. 设置二次补偿的binlog文件
#设置配置文件
vim /etc/mha/app1.cnf
[binlog1]
no_master=1
hostname=10.0.1.53
master_binlog_dir=/data/mysql/binlog
#创建目录并授权
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*
#拉取主库binlog日志
cd /data/mysql/binlog ----->必须进入到自己创建好的目录
mysqlbinlog -R --host=10.0.1.51 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
注意:
拉取日志的起点,需要按照目前主库正在使用的那个为准.
16. 重启MHA
masterha_stop --conf=/etc/mha/app1.cnf
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 &
17. 测试
关闭主库,观察情况
tail -f /var/log/mha/app1/manager #观察MHA日志情况
查看VIP地址是否漂移到从库
查看MHA配置文件是否已经删除了损坏节点
查看从库是否已经晋升为主库
查看另一个从库的连接信息
查看MHA是否已经停止工作
18. 恢复处理
(1. 修故障库,并恢复1主2从
找一台可正常使用的服务器,搭建好基础数据库环境
利用备份数据,恢复数据到数据库。
从备份数据文件的位置,同步到主库
建立主从关系
(2. 修复配置文件
将新的从库添加到MHA配置文件
(3. 修复binlogserver
将原有日志文件删除,从先配置第15步操作
(4. 检查ssh和主从
检查MHA,ssh和主从状态,命令见上
(5. 启动MHA
命令见上
(6.查看当前MHA状态