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状态
Luck will be always by ourside